Merge branch 'master' into Willy

This commit is contained in:
b110212000 2021-07-30 19:38:45 +08:00
commit cf48a1da16
9 changed files with 573 additions and 68 deletions

View File

@ -77,7 +77,7 @@ namespace SolarPower.Controllers
var temp = new List<PowerStationDevice>(); var temp = new List<PowerStationDevice>();
temp.Add(powerStation); temp.Add(powerStation);
foreach(var device in psName_Group) foreach (var device in psName_Group)
{ {
temp.Add(device); temp.Add(device);
} }
@ -109,26 +109,227 @@ namespace SolarPower.Controllers
try try
{ {
AnalysisDevice analysisDevice = new AnalysisDevice(); AnalysisDevice analysisDevice = new AnalysisDevice();
analysisDevice.Series = new List<DeviceHistoryInfo>();
//先將欲查詢的設備找出設備的資料庫欄位 //先將欲查詢的設備找出設備的資料庫欄位
var device_powerStationId_Group = post.DeviceIdInfos.GroupBy(x => x.PowerStationId).ToList(); var device_powerStationId_Group = post.DeviceIdInfos.GroupBy(x => x.PowerStationId).ToList();
List<Device> devices = new List<Device>(); Dictionary<int, List<Device>> deviceDic = new Dictionary<int, List<Device>>();
foreach(var psId_Group in device_powerStationId_Group) List<int> selected_powerStationIds = new List<int>();
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設備
selected_powerStationIds = psId_Group.Where(x => x.DeviceType == "PWS").Select(x => Convert.ToInt32(x.DeviceId)).ToList();
var selected_device = psId_Group.Where(x => x.DeviceType != "PWS").Select(x => x.DeviceId).ToList(); var selected_device = psId_Group.Where(x => x.DeviceType != "PWS").Select(x => x.DeviceId).ToList();
//var temp_device = await powerStationRepository.GetDeviceByPowerStationIdAndDeviceIds(powerStation.SiteDB, powerStation.Id, selected_device); var temp_device = await powerStationRepository.GetDeviceByPowerStationIdAndDeviceIds(powerStation.SiteDB, powerStation.Id, selected_device);
if (temp_device.Count() > 0)
//devices.AddRange(temp_device); {
deviceDic.Add(psId_Group.Key, temp_device);
}
} }
if(post.SearchType == 0) analysisDevice.MultipleYaxes = new Dictionary<string, string>()
{ //單日 {
{ "KWH", "發電量"},
{ "Irradiance", "日照度"},
{ "KWHKWP", "發電小時"},
{ "PR", "PR %"},
{ "SolarHour", "日照小時"},
{ "ModelTemperature", "模組溫度"},
{ "Temperature", "環境溫度計"},
{ "Humidity", "濕度"},
{ "Vane", "風速"},
{ "Dust", "落塵%"},
};
var XAxis = new List<string>();
//電站資料
var powerStationHistories = await powerStationRepository.GetPowerStationHistory(post.SelectedDate, post.SearchType, selected_powerStationIds);
XAxis.AddRange(powerStationHistories.Select(x => x.Timestamp).Distinct().ToList());
var powerStationHistories_Id_Group = powerStationHistories.GroupBy(x => x.PowerStationId).ToList();
foreach (var item in powerStationHistories_Id_Group)
{
var powerStation = await powerStationRepository.GetOneAsync(item.Key);
var temp_item = item.OrderBy(x => x.Timestamp).ToList();
DeviceHistoryInfo Irradiance = new DeviceHistoryInfo();
Irradiance.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Irradiance"]);
Irradiance.YaxesKey = "Irradiance";
Irradiance.Values = new List<double>();
foreach (var history in temp_item)
{
if (XAxis.IndexOf(history.Timestamp) > -1)
{
Irradiance.Values.Add(history.Irradiance);
}
else
{
Irradiance.Values.Add(0);
}
}
analysisDevice.Series.Add(Irradiance);
DeviceHistoryInfo KWH = new DeviceHistoryInfo();
KWH.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWH"]);
KWH.YaxesKey = "KWH";
KWH.Values = new List<double>();
foreach (var history in temp_item)
{
if (XAxis.IndexOf(history.Timestamp) > -1)
{
KWH.Values.Add(Math.Round(history.KWH, 2));
}
else
{
KWH.Values.Add(0);
}
}
analysisDevice.Series.Add(KWH);
DeviceHistoryInfo solarHour = new DeviceHistoryInfo();
solarHour.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["SolarHour"]);
solarHour.YaxesKey = "SolarHour";
solarHour.Values = new List<double>();
foreach (var history in temp_item)
{
if (XAxis.IndexOf(history.Timestamp) > -1)
{
solarHour.Values.Add(Math.Round(history.SolarHour, 2));
}
else
{
solarHour.Values.Add(0);
}
}
analysisDevice.Series.Add(solarHour);
DeviceHistoryInfo KWHKWP = new DeviceHistoryInfo();
KWHKWP.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWHKWP"]);
KWHKWP.YaxesKey = "KWHKWP";
KWHKWP.Values = new List<double>();
foreach (var history in temp_item)
{
if (XAxis.IndexOf(history.Timestamp) > -1)
{
KWHKWP.Values.Add(Math.Round(history.KWHKWP, 2));
}
else
{
KWHKWP.Values.Add(0);
}
}
analysisDevice.Series.Add(KWHKWP);
DeviceHistoryInfo PR = new DeviceHistoryInfo();
PR.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["PR"]);
PR.YaxesKey = "PR";
PR.Values = new List<double>();
foreach (var history in temp_item)
{
if (XAxis.IndexOf(history.Timestamp) > -1)
{
PR.Values.Add(Math.Round(history.PR, 2));
}
else
{
PR.Values.Add(0);
}
}
analysisDevice.Series.Add(PR);
DeviceHistoryInfo modelTemperature = new DeviceHistoryInfo();
modelTemperature.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["ModelTemperature"]);
modelTemperature.YaxesKey = "ModelTemperature";
modelTemperature.Values = new List<double>();
foreach (var history in temp_item)
{
if (XAxis.IndexOf(history.Timestamp) > -1)
{
modelTemperature.Values.Add(Math.Round(history.Temperature, 2));
}
else
{
modelTemperature.Values.Add(0);
}
}
analysisDevice.Series.Add(modelTemperature);
} }
//設備資料
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());
}
foreach (var device in devices.Value)
{
DeviceHistoryInfo deviceHistoryInfo = new DeviceHistoryInfo();
var suffix = "";
var YaxesKey = "";
switch (device.Type)
{
case "PYR": //日照計
suffix = analysisDevice.MultipleYaxes["Irradiance"];
YaxesKey = "Irradiance";
break;
case "ETR": //環境溫度計
suffix = analysisDevice.MultipleYaxes["Temperature"];
YaxesKey = "Temperature";
break;
case "MTR": //模組溫度計
suffix = analysisDevice.MultipleYaxes["ModelTemperature"];
YaxesKey = "ModelTemperature";
break;
case "VAN": //風速計
suffix = analysisDevice.MultipleYaxes["Vane"];
YaxesKey = "Vane";
break;
case "FOM": //落塵計
suffix = analysisDevice.MultipleYaxes["Dust"];
YaxesKey = "Dust";
break;
case "EMM": //環境濕度計
suffix = analysisDevice.MultipleYaxes["Humidity"];
YaxesKey = "Humidity";
break;
default:
suffix = string.Empty;
break;
}
deviceHistoryInfo.Name = string.Format("{0}:{1}", device.Name, suffix);
deviceHistoryInfo.YaxesKey = YaxesKey;
deviceHistoryInfo.Values = new List<double>();
foreach (var rows in result)
{
var fields = rows as IDictionary<string, object>;
if (XAxis.IndexOf(fields["TIMESTAMP"].ToString()) > -1)
{
deviceHistoryInfo.Values.Add(Math.Round(Convert.ToDouble(fields[device.UID]), 2));
}
else
{
deviceHistoryInfo.Values.Add(0);
}
}
analysisDevice.Series.Add(deviceHistoryInfo);
}
}
analysisDevice.XAxis = XAxis.Distinct().ToList();
apiResult.Code = "0000"; apiResult.Code = "0000";

View File

@ -593,6 +593,8 @@ namespace SolarPower.Models.PowerStation
public double TOTALMONEY { get; set; } public double TOTALMONEY { get; set; }
public double TODAYCARBON { get; set; } public double TODAYCARBON { get; set; }
public double TOTALCARBON { get; set; } public double TOTALCARBON { get; set; }
public double Irradiance { get; set; }
public double Temperature { get; set; }
} }
public class AvgPowerStationHistory public class AvgPowerStationHistory

View File

@ -32,6 +32,8 @@ namespace SolarPower.Quartz.Jobs
var DateTimeNow = DateTime.Now; var DateTimeNow = DateTime.Now;
var dateTime = DateTimeNow.AddHours(-1).ToString("yyyy-MM-dd HH"); var dateTime = DateTimeNow.AddHours(-1).ToString("yyyy-MM-dd HH");
dateTime = "2021-07-26 16";
logger.LogInformation("【CalcPowerStationJob】【任務開始】"); logger.LogInformation("【CalcPowerStationJob】【任務開始】");
#region step1. #region step1.
@ -455,6 +457,7 @@ namespace SolarPower.Quartz.Jobs
"ACKW", "ACKW",
"KWH", "KWH",
"TODAYKWH", "TODAYKWH",
"TOTALKWH",
"KWHKWP", "KWHKWP",
}; };

View File

@ -202,7 +202,8 @@ namespace SolarPower.Repository.Implement
FROM power_station_history_hour ps FROM power_station_history_hour ps
LEFT JOIN sensor_history_hour pyr ON ps.PowerStationId = pyr.PowerStationId AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d %H') = DATE_FORMAT(pyr.timestamp, '%Y-%m-%d %H') LEFT JOIN sensor_history_hour pyr ON ps.PowerStationId = pyr.PowerStationId AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d %H') = DATE_FORMAT(pyr.timestamp, '%Y-%m-%d %H')
WHERE ps.PowerStationId = @PowerStationId WHERE ps.PowerStationId = @PowerStationId
AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') = @NowDay ORDER BY ps.timestamp"; AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') = @NowDay
ORDER BY ps.timestamp";
result = (await conn.QueryAsync<PowerIrradiance>(sql_power, new { PowerStationId = powerStationId, NowDay = nowDay })).ToList(); result = (await conn.QueryAsync<PowerIrradiance>(sql_power, new { PowerStationId = powerStationId, NowDay = nowDay })).ToList();
} }
@ -226,7 +227,8 @@ namespace SolarPower.Repository.Implement
FROM power_station_history_day ps FROM power_station_history_day ps
LEFT JOIN sensor_history_day pyr ON ps.PowerStationId = pyr.PowerStationId AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') = DATE_FORMAT(pyr.timestamp, '%Y-%m-%d') LEFT JOIN sensor_history_day pyr ON ps.PowerStationId = pyr.PowerStationId AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') = DATE_FORMAT(pyr.timestamp, '%Y-%m-%d')
WHERE ps.PowerStationId = @PowerStationId WHERE ps.PowerStationId = @PowerStationId
AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') BETWEEN @StartDay AND @NowDay ORDER BY ps.timestamp"; AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') BETWEEN @StartDay AND @NowDay
ORDER BY ps.timestamp";
result = (await conn.QueryAsync<PowerIrradiance>(sql_power, new { PowerStationId = powerStationId, StartDay = startDay, NowDay = nowDay })).ToList(); result = (await conn.QueryAsync<PowerIrradiance>(sql_power, new { PowerStationId = powerStationId, StartDay = startDay, NowDay = nowDay })).ToList();
} }
@ -250,7 +252,8 @@ namespace SolarPower.Repository.Implement
FROM power_station_history_day ps FROM power_station_history_day ps
LEFT JOIN sensor_history_day pyr ON ps.PowerStationId = pyr.PowerStationId AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') = DATE_FORMAT(pyr.timestamp, '%Y-%m-%d') LEFT JOIN sensor_history_day pyr ON ps.PowerStationId = pyr.PowerStationId AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') = DATE_FORMAT(pyr.timestamp, '%Y-%m-%d')
WHERE ps.PowerStationId = @PowerStationId WHERE ps.PowerStationId = @PowerStationId
AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') BETWEEN @StartDay AND @NowDay"; AND DATE_FORMAT(ps.timestamp, '%Y-%m-%d') BETWEEN @StartDay AND @NowDay
ORDER BY ps.timestamp";
result = (await conn.QueryAsync<PowerIrradiance>(sql_power, new { PowerStationId = powerStationId, StartDay = startDay, NowDay = nowDay })).ToList(); result = (await conn.QueryAsync<PowerIrradiance>(sql_power, new { PowerStationId = powerStationId, StartDay = startDay, NowDay = nowDay })).ToList();
} }
@ -275,7 +278,8 @@ namespace SolarPower.Repository.Implement
FROM power_station_history_month ps FROM power_station_history_month ps
LEFT JOIN sensor_history_month pyr ON ps.PowerStationId = pyr.PowerStationId AND DATE_FORMAT(ps.timestamp, '%Y-%m') = DATE_FORMAT(pyr.timestamp, '%Y-%m') LEFT JOIN sensor_history_month pyr ON ps.PowerStationId = pyr.PowerStationId AND DATE_FORMAT(ps.timestamp, '%Y-%m') = DATE_FORMAT(pyr.timestamp, '%Y-%m')
WHERE ps.PowerStationId = @PowerStationId WHERE ps.PowerStationId = @PowerStationId
AND DATE_FORMAT(ps.timestamp, '%Y') = @Year"; AND DATE_FORMAT(ps.timestamp, '%Y') = @Year
ORDER BY ps.timestamp";
result = (await conn.QueryAsync<PowerIrradiance>(sql_power, new { PowerStationId = powerStationId, Year = startyear })).ToList(); result = (await conn.QueryAsync<PowerIrradiance>(sql_power, new { PowerStationId = powerStationId, Year = startyear })).ToList();
} }

View File

@ -3902,7 +3902,7 @@ namespace SolarPower.Repository.Implement
} }
public async Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(int companyId,string filter) public async Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(int companyId, string filter)
{ {
List<PowerStationIdAndCity> result; List<PowerStationIdAndCity> result;
using (IDbConnection conn = this._databaseHelper.GetConnection()) using (IDbConnection conn = this._databaseHelper.GetConnection())
@ -3952,46 +3952,181 @@ namespace SolarPower.Repository.Implement
} }
} }
//public async Task<List<Device>> GetDeviceByPowerStationIdAndDeviceIds(string db_name, int powerStationId, List<string> deviceIds) public async Task<List<Device>> GetDeviceByPowerStationIdAndDeviceIds(string db_name, int powerStationId, List<string> deviceIds)
//{ {
// List<Device> result; List<Device> result;
// using (IDbConnection conn = this._databaseHelper.GetConnection()) using (IDbConnection conn = this._databaseHelper.GetConnection())
// { {
// try try
// { {
// var sql = @$"SELECT FROM {db_name}.device d var sql = @$"SELECT * FROM {db_name}.device d
// WHERE d."; WHERE d.PowerStationId = @PowerStationId AND UID IN @UID";
// result = (await conn.QueryAsync<PowerStationIdAndCity>(sql, new { Filter = filter })).ToList(); result = (await conn.QueryAsync<Device>(sql, new { PowerStationId = powerStationId, UID = deviceIds })).ToList();
// } }
// catch (Exception exception) catch (Exception exception)
// { {
// throw exception; throw exception;
// } }
// return result; return result;
// } }
//} }
//public async Task<List<Device>> GetSensorAvgByDevices(List<Device> devices) public async Task<dynamic> GetSensorAvgByDevices(string date, byte searchType, List<Device> devices)
//{ {
// //List<Device> result; dynamic result;
// //using (IDbConnection conn = this._databaseHelper.GetConnection()) using (IDbConnection conn = this._databaseHelper.GetConnection())
// //{ {
// // try try
// // { {
// // //var sql = @$"SELECT FROM {db_name}.device d var date_format = "";
// // // WHERE d."; var table_name = "";
var where_date = "";
var start_date = "";
var end_date = "";
switch (searchType)
{
case 0:
date_format = "%H:%i";
table_name = "sensoravg_history_hour";
where_date = $" DATE_FORMAT(sen.TIMESTAMP, '%Y-%m-%d') = '{date}'";
break;
case 1:
date_format = "%Y-%m-%d";
table_name = "sensoravg_history_day";
// // //result = (await conn.QueryAsync<PowerStationIdAndCity>(sql, new { Filter = filter })).ToList(); var date_split = date.Split('-');
// // } start_date = Convert.ToDateTime(date_split[0].Trim()).ToString("yyyy-MM-dd");
// // catch (Exception exception) end_date = Convert.ToDateTime(date_split[1].Trim()).ToString("yyyy-MM-dd");
// // { where_date = $" DATE_FORMAT(sen.TIMESTAMP, '%Y-%m-%d') BETWEEN '{start_date}' AND '{end_date}'";
// // throw exception; break;
// // } case 2:
// // return result; date_format = "%Y-%m-%d";
// //} table_name = "sensoravg_history_day";
//} start_date = Convert.ToDateTime(date).ToString("yyyy-MM-dd");
end_date = Convert.ToDateTime(date).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
where_date = $" DATE_FORMAT(sen.TIMESTAMP, '%Y-%m-%d') BETWEEN '{start_date}' AND '{end_date}'";
break;
case 3:
date_format = "%Y-%m";
table_name = "sensoravg_history_month";
where_date = $" DATE_FORMAT(sen.TIMESTAMP, '%Y') = '{date}'";
break;
}
List<string> sql_select_col = new List<string>();
var sql_sub = "";
for (var i = 0; i < devices.Count(); i++)
{
if (i == 0)
{
sql_select_col.Add($"DATE_FORMAT(sen.TIMESTAMP, '{date_format}') AS TIMESTAMP");
sql_select_col.Add(string.Concat("`", devices[i].UID, "`"));
sql_sub += @$" FROM (SELECT sen.TIMESTAMP, sen.{devices[i].ColName} AS `{devices[i].UID}` FROM {table_name} sen WHERE sen.PowerStationId = {devices[i].PowerStationId} AND {where_date}) sen";
}
else
{
sql_select_col.Add(string.Concat("`", devices[i].UID, "`"));
sql_sub += @$" LEFT JOIN (
SELECT sen.TIMESTAMP, sen.{devices[i].ColName} AS `{devices[i].UID}`
FROM {table_name} sen
WHERE sen.PowerStationId = {devices[i].PowerStationId} AND {where_date}) sen{i}
ON sen.TIMESTAMP = sen{i}.TIMESTAMP";
}
}
var select_col = string.Join(", ", sql_select_col);
var sql = $"SELECT {select_col} " + sql_sub;
result = await conn.QueryAsync<dynamic>(sql);
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
public async Task<List<PowerStationHistory>> GetPowerStationHistory(string date, byte searchType, List<int> entities)
{
List<PowerStationHistory> result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var KWH_col = "";
var date_format = "";
var table_name = "";
var where_date = "";
var letf_join_table = "";
var start_date = "";
var end_date = "";
switch (searchType)
{
case 0:
KWH_col = "ps.KWH";
date_format = "%H:%i";
table_name = "power_station_history_hour";
letf_join_table = "sensor_history_hour";
where_date = $" AND DATE_FORMAT(ps.TIMESTAMP, '%Y-%m-%d') = '{date}'";
break;
case 1:
KWH_col = "ps.TODAYKWH AS KWH";
date_format = "%Y-%m-%d";
table_name = "power_station_history_day";
letf_join_table = "sensor_history_day";
var date_split = date.Split('-');
start_date = Convert.ToDateTime(date_split[0].Trim()).ToString("yyyy-MM-dd");
end_date = Convert.ToDateTime(date_split[1].Trim()).ToString("yyyy-MM-dd");
where_date = $" AND DATE_FORMAT(ps.TIMESTAMP, '%Y-%m-%d') BETWEEN '{start_date}' AND '{end_date}'";
break;
case 2:
KWH_col = "ps.TODAYKWH AS KWH";
date_format = "%Y-%m-%d";
table_name = "power_station_history_day";
letf_join_table = "sensor_history_day";
start_date = Convert.ToDateTime(date).ToString("yyyy-MM-dd");
end_date = Convert.ToDateTime(date).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
where_date = $" AND DATE_FORMAT(ps.TIMESTAMP, '%Y-%m-%d') BETWEEN '{start_date}' AND '{end_date}'";
break;
case 3:
KWH_col = "ps.MONTHKWH AS KWH";
date_format = "%Y-%m";
table_name = "power_station_history_month";
letf_join_table = "sensor_history_month";
where_date = $" AND DATE_FORMAT(ps.TIMESTAMP, '%Y') = '{date}'";
break;
}
var sql = $@"SELECT
ps.PowerStationId,
DATE_FORMAT(ps.TIMESTAMP, '{date_format}') AS TIMESTAMP,
{KWH_col},
ps.SOLARHOUR,
ps.KWHKWP,
ps.PR,
sen.Irradiance,
sen.Temperature
FROM {table_name} ps
LEFT JOIN {letf_join_table} sen ON ps.PowerStationId = sen.PowerStationId AND ps.TIMESTAMP = sen.TIMESTAMP
WHERE ps.PowerStationId IN @PowerStationId
{where_date}";
result = (await conn.QueryAsync<PowerStationHistory>(sql, new { PowerStationId = entities})).ToList();
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
} }
} }

View File

@ -554,7 +554,8 @@ namespace SolarPower.Repository.Interface
Task<List<InverterHistory>> GetInverterHistoryByYear(string year, List<StationIdWithInverterIds> entities); Task<List<InverterHistory>> GetInverterHistoryByYear(string year, List<StationIdWithInverterIds> entities);
Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(int companyId,string filter); Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(int companyId,string filter);
Task<List<PowerStationIdAndCity>> GetPowerStationsAllWithfilter(string filter); Task<List<PowerStationIdAndCity>> GetPowerStationsAllWithfilter(string filter);
//Task<List<Device>> GetDeviceByPowerStationIdAndDeviceIds(string db_name, int powerStationId, List<string> deviceIds); Task<List<Device>> GetDeviceByPowerStationIdAndDeviceIds(string db_name, int powerStationId, List<string> deviceIds);
//Task<List<Device>> GetSensorAvgByDevices(List<Device> devices); Task<dynamic> GetSensorAvgByDevices(string date, byte searchType, List<Device> devices);
Task<List<PowerStationHistory>> GetPowerStationHistory(string date, byte searchType, List<int> entities);
} }
} }

View File

@ -21,7 +21,7 @@
</div> </div>
</div> </div>
<div class="col-auto px-0"> <div class="col-auto px-0">
<a href="javascript:;" data-target=".sidebar" data-toggle="collapse" class="btn btn-default btn-xs btn-icon waves-effect waves-themed" style="border-radius: 0;"><i onclick="myfunc(this)" class="fal fa-angle-right fa-lg py-3"></i></a> <a href="javascript:;" id="collapse" data-target=".sidebar" data-toggle="collapse" class="btn btn-default btn-xs btn-icon waves-effect waves-themed" style="border-radius: 0;"><i onclick="myfunc(this)" class="fal fa-angle-right fa-lg py-3"></i></a>
</div> </div>
<main class="col px-5 pl-md-2 main"> <main class="col px-5 pl-md-2 main">
@ -200,6 +200,8 @@
] ]
$(function () { $(function () {
$('#collapse').trigger("click");
//#region 預設初始值 //#region 預設初始值
$('#DateGet').val(new Date().toISOString().substring(0, 10)); $('#DateGet').val(new Date().toISOString().substring(0, 10));
document.getElementById("DateGettextdiv").style.display = "none";//隱藏 document.getElementById("DateGettextdiv").style.display = "none";//隱藏

View File

@ -21,7 +21,7 @@
</div> </div>
</div> </div>
<div class="col-auto px-0"> <div class="col-auto px-0">
<a href="javascript:;" data-target=".sidebar" data-toggle="collapse" class="btn btn-default btn-xs btn-icon waves-effect waves-themed" style="border-radius: 0;"><i onclick="myfunc(this)" class="fal fa-angle-right fa-lg py-3"></i></a> <a href="javascript:;" id="collapse" data-target=".sidebar" data-toggle="collapse" class="btn btn-default btn-xs btn-icon waves-effect waves-themed" style="border-radius: 0;"><i onclick="myfunc(this)" class="fal fa-angle-right fa-lg py-3"></i></a>
</div> </div>
<main class="col px-5 pl-md-2 main"> <main class="col px-5 pl-md-2 main">
@ -117,16 +117,29 @@
var datepicker; var datepicker;
var timerange;//選取時間 var timerange;//選取時間
var selected_device = []; var selected_device = [];
var PWS_compare_col = [{ key: "KWH", title: "發電量" }, { key: "Irradiance", title: "日照度" }] var PWS_compare_col = [
var PYR_compare_col = [{ key: "Irradiance", title: "日照度" }]; { key: "KWH", title: "發電量", default: true },
var ETR_compare_col = [{ key: "Temperature", title: "環境溫度計" }]; { key: "Irradiance", title: "日照度", default: true},
var EMM_compare_col = [{ key: "Humidity", title: "濕度" }]; { key: "KWHKWP", title: "發電小時", default: false },
var VAN_compare_col = [{ key: "Vane", title: "風速" }]; { key: "PR", title: "PR %", default: false },
var FOM_compare_col = [{ key: "Dust", title: "落塵%" }]; { key: "ModelTemperature", title: "模組溫度", default: false },
{ key: "SolarHour", title: "日照小時", default: false }
]
var PYR_compare_col = [{ key: "Irradiance", title: "日照度", default: true }];
var ETR_compare_col = [{ key: "Temperature", title: "環境溫度計", default: true }];
var MTR_compare_col = [{ key: "ModelTemperature", title: "模組溫度", default: true }];
var EMM_compare_col = [{ key: "Humidity", title: "濕度", default: true }];
var VAN_compare_col = [{ key: "Vane", title: "風速", default: true }];
var FOM_compare_col = [{ key: "Dust", title: "落塵%", default: true }];
var all_selected_compare_col = []; var all_selected_compare_col = [];
var checked_compare_col = []; var default_compare_col = [];
var selected_YAxis = [];
var analysisStationInfo;
var chart;
$(function () { $(function () {
$('#collapse').trigger("click");
//#region 預設初始值 //#region 預設初始值
$('#DateGet').val(new Date().toISOString().substring(0, 10)); $('#DateGet').val(new Date().toISOString().substring(0, 10));
document.getElementById("DateGettextdiv").style.display = "none";//隱藏 document.getElementById("DateGettextdiv").style.display = "none";//隱藏
@ -323,6 +336,9 @@
case 'ETR': //環境溫度計 case 'ETR': //環境溫度計
PushAllSelectedCompareCol(ETR_compare_col); PushAllSelectedCompareCol(ETR_compare_col);
break; break;
case 'MTR': //模組溫度計
PushAllSelectedCompareCol(MTR_compare_col);
break;
case 'VAN': //風速計 case 'VAN': //風速計
PushAllSelectedCompareCol(VAN_compare_col); PushAllSelectedCompareCol(VAN_compare_col);
break; break;
@ -337,9 +353,11 @@
} else { } else {
if (selected_device.some(x => x.deviceId == this.value)) { if (selected_device.some(x => x.deviceId == this.value)) {
var cancel_device = this.value;
var temp_index; var temp_index;
selected_device.find(function (obj, index) { selected_device.find(function (obj, index) {
if (obj.deviceId == this.value) { if (obj.deviceId == cancel_device) {
temp_index = index; temp_index = index;
} }
}); });
@ -360,7 +378,9 @@
break; break;
case 'ETR': //環境溫度計 case 'ETR': //環境溫度計
RemoveAllSelectedCompareCol(ETR_compare_col); RemoveAllSelectedCompareCol(ETR_compare_col);
break;
case 'MTR': //模組溫度計
RemoveAllSelectedCompareCol(MTR_compare_col);
break; break;
case 'VAN': //風速計 case 'VAN': //風速計
RemoveAllSelectedCompareCol(VAN_compare_col); RemoveAllSelectedCompareCol(VAN_compare_col);
@ -379,8 +399,6 @@
console.log("all_selected_compare_col", all_selected_compare_col); console.log("all_selected_compare_col", all_selected_compare_col);
ChangeCompareSelectOption() ChangeCompareSelectOption()
console.log("selected_device", selected_device);
}); });
$('#js_list_accordion').on("change", 'input[name="selectedDeviceLayer2[]"]', function (event) { $('#js_list_accordion').on("change", 'input[name="selectedDeviceLayer2[]"]', function (event) {
@ -391,6 +409,26 @@
} }
}); });
$('#compare-dropdown-menu').on('change', 'input[name="compare_col[]"]', function (e) {
if (this.checked) {
selected_YAxis.push($(this).val());
if ($.inArray($(this).val(), default_compare_col) == -1) {
default_compare_col.push($(this).val());
}
} else {
selected_YAxis.splice($.inArray($(this).val(), selected_YAxis), 1);
if ($.inArray($(this).val(), default_compare_col) >0) {
default_compare_col.splice($.inArray($(this).val(), default_compare_col), 1);
}
}
console.log("default_compare_col", default_compare_col)
console.log("selected_YAxis", selected_YAxis)
ReloadHighCharts();
});
function GetPowerStationCollapse(filter) { function GetPowerStationCollapse(filter) {
var url = "/AnalysisStationInfo/GetDeviceCollapse" var url = "/AnalysisStationInfo/GetDeviceCollapse"
@ -453,6 +491,9 @@
case 'ETR': //環境溫度計 case 'ETR': //環境溫度計
device_icon = '<i class="fal fa-thermometer-half"></i>'; device_icon = '<i class="fal fa-thermometer-half"></i>';
break; break;
case 'MTR': //模組溫度計
device_icon = '<i class="fal fa-thermometer-half"></i>';
break;
case 'VAN': //風速計 case 'VAN': //風速計
device_icon = '<i class="fal fa-wind"></i>'; device_icon = '<i class="fal fa-wind"></i>';
break; break;
@ -511,7 +552,13 @@
} }
}); });
} }
if (item.default && $.inArray(item.key, default_compare_col) == -1) {
default_compare_col.push(item.key);
}
}); });
console.log("default_compare_col", default_compare_col);
} }
//#endregion //#endregion
@ -524,6 +571,15 @@
} }
}); });
}); });
$.each(all_selected_compare_col, function (index, item) {
if (item.count <= 0) {
if ($.inArray(item.key, default_compare_col) > -1)
default_compare_col.splice($.inArray(item.key, default_compare_col), 1);
}
});
console.log("default_compare_col", default_compare_col);
} }
//#endregion //#endregion
@ -534,6 +590,12 @@
str += '<li><a href="javascript:void(0)" class="dropdown-item" tabIndex="-1">' + item.title + '<input type="checkbox" class="float-right" name="compare_col[]" value="' + item.key + '" /></a></li>' str += '<li><a href="javascript:void(0)" class="dropdown-item" tabIndex="-1">' + item.title + '<input type="checkbox" class="float-right" name="compare_col[]" value="' + item.key + '" /></a></li>'
}); });
$("#compare-dropdown-menu").append(str); $("#compare-dropdown-menu").append(str);
$('input[name="compare_col[]"]').each(function () {
if ($.inArray(this.value, default_compare_col) > -1) {
$(this).prop('checked', true);
}
});
} }
function GetAnalysisStationInfo() { function GetAnalysisStationInfo() {
@ -562,21 +624,110 @@
if (searchType != 0) { if (searchType != 0) {
$('input[name="compare_col[]"]').each(function () { $('input[name="compare_col[]"]').each(function () {
if ($.inArray(this.value, default_compare_date) > -1) { if ($.inArray(this.value, default_compare_col) > -1) {
$(this).prop('checked', true).trigger('change'); $(this).prop('checked', true).trigger('change');
} }
}); });
} }
else { else {
$('input[name="compare_col[]"]').each(function () { $('input[name="compare_col[]"]').each(function () {
if ($.inArray(this.value, default_compare_row_data) > -1) { if ($.inArray(this.value, default_compare_col) > -1) {
$(this).prop('checked', true).trigger('change'); $(this).prop('checked', true).trigger('change');
} }
}); });
} }
@*ReloadHighCharts();*@
}, 'json'); }, 'json');
} }
function ReloadHighCharts() {
myYAxis = []; mySeries = [];
myXAxis = analysisStationInfo.xAxis
Object.keys(analysisStationInfo.multipleYaxes).map(function (key, index) {
if (selected_YAxis.indexOf(key) > -1) {
var yAxis = {
title: {
text: analysisStationInfo.multipleYaxes[key],
},
id: key,
opposite: myYAxis.length > 0 ? true : false,
showEmpty: false
}
myYAxis.push(yAxis);
}
});
analysisStationInfo.series.map(function (item, index) {
if (selected_YAxis.indexOf(item.yaxesKey) > -1) {
var ser = {
type: 'spline',
name: item.name,
data: item.values,
yAxis: item.yaxesKey,
}
mySeries.push(ser);
}
});
if (chart) {
chart.destroy();
}
chart = new Highcharts.Chart({
lang: { //匯出相關中文名稱配置
printChart: '列印圖表',
downloadJPEG: '下載JPEG檔案',
downloadPDF: '下載PDF檔案',
downloadPNG: '下載PNG檔案',
downloadSVG: '下載SVG檔案',
downloadCSV: '下載CSV檔案',
downloadXLS: '下載XLS檔案',
viewData: '檢視資料表格',
viewFullscreen: '全屏檢視'
},
chart: {
renderTo: 'container',
height: 600,
animation: false
},
title: {
text: '交叉分析圖表'
},
tooltip: {
formatter: function () {
return '<b>' + this.series.name + '</b><br>' +
'<span>' + this.x + '</span><br>' +
'<b style = "color:rgb(103, 180, 172);" >' + this.point.y + '</b>';
}
},
xAxis: {
categories: myXAxis,
labels: {
step: 1,
formatter: function () {
if (searchType == 0) {
var aa = this.value.substr(-2);
if (aa == "00") {
return '<span>' + this.value + '</span>';
} else {
return '<span style="display:none">' + this.value + '</span>';
}
} else {
return this.value
}
}
}
},
yAxis: myYAxis,
series: mySeries,
});
}
</script> </script>
} }

View File

@ -352,6 +352,7 @@
label: '輸出功率', label: '輸出功率',
yAxisID: 'A', yAxisID: 'A',
backgroundColor: 'rgb(103, 180, 172)', backgroundColor: 'rgb(103, 180, 172)',
order: 2,
data: chart7day.powerDatas data: chart7day.powerDatas
}, { }, {
type: 'line', type: 'line',
@ -364,6 +365,7 @@
borderWidth: 2, borderWidth: 2,
pointRadius: 4, pointRadius: 4,
pointHoverRadius: 5, pointHoverRadius: 5,
order: 1,
fill: false, fill: false,
data: chart7day.irradianceDatas, data: chart7day.irradianceDatas,
}] }]
@ -417,6 +419,7 @@
label: '輸出功率', label: '輸出功率',
yAxisID: 'A', yAxisID: 'A',
backgroundColor: 'rgb(103, 180, 172)', backgroundColor: 'rgb(103, 180, 172)',
order: 2,
data: chartMonth.powerDatas data: chartMonth.powerDatas
}, { }, {
type: 'line', type: 'line',
@ -429,6 +432,7 @@
borderWidth: 2, borderWidth: 2,
pointRadius: 4, pointRadius: 4,
pointHoverRadius: 5, pointHoverRadius: 5,
order: 1,
fill: false, fill: false,
data: chartMonth.irradianceDatas, data: chartMonth.irradianceDatas,
}] }]
@ -482,6 +486,7 @@
label: '輸出功率', label: '輸出功率',
yAxisID: 'A', yAxisID: 'A',
backgroundColor: 'rgb(103, 180, 172)', backgroundColor: 'rgb(103, 180, 172)',
order: 2,
data: chartYear.powerDatas data: chartYear.powerDatas
}, { }, {
type: 'line', type: 'line',
@ -494,6 +499,7 @@
borderWidth: 2, borderWidth: 2,
pointRadius: 4, pointRadius: 4,
pointHoverRadius: 5, pointHoverRadius: 5,
order: 1,
fill: false, fill: false,
data: chartYear.irradianceDatas, data: chartYear.irradianceDatas,
}] }]