FIC_Solar/SolarPower/Controllers/AnalysisStationInfoController.cs
2021-11-11 13:35:42 +08:00

619 lines
28 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SolarPower.Models;
using SolarPower.Models.PowerStation;
using SolarPower.Models.Role;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Controllers
{
public class AnalysisStationInfoController : MyBaseController<AnalysisStationInfoController>
{
private readonly IPowerStationRepository powerStationRepository;
public AnalysisStationInfoController(IPowerStationRepository powerStationRepository) : base()
{
this.powerStationRepository = powerStationRepository;
}
public IActionResult Index()
{
return View();
}
[HttpPost]
public async Task<ApiResult<Dictionary<string, Dictionary<string, List<PowerStationDevice>>>>> GetDeviceCollapse(string filter)
{
ApiResult<Dictionary<string, Dictionary<string, List<PowerStationDevice>>>> apiResult = new ApiResult<Dictionary<string, Dictionary<string, List<PowerStationDevice>>>>();
try
{
var powerStations = new List<PowerStation>();
powerStations = myPowerStationService.GetMyPowerStations(myUser);
var siteDBNamePowerStationId = new Dictionary<string, List<int>>();
var powerStation_siteDB_Group = powerStations.GroupBy(x => x.SiteDB).ToList();
foreach (var siteDB_Group in powerStation_siteDB_Group)
{
var powerStationIds = siteDB_Group.Select(x => x.Id).ToList();
siteDBNamePowerStationId.Add(siteDB_Group.Key, powerStationIds);
}
var powerStationDevices = await powerStationRepository.GetPowerStationDevice(siteDBNamePowerStationId, filter);
//powerStationDevices = powerStationDevices.Where(x => x.DeviceId != null).ToList();
var powerStationDevice_cityName_Group = powerStationDevices.GroupBy(x => x.CityName).ToList();
var deviceCollapse = new Dictionary<string, Dictionary<string, List<PowerStationDevice>>>();
foreach (var cityName_Group in powerStationDevice_cityName_Group)
{
var device_psName_Group = cityName_Group.GroupBy(x => x.PowerStationName).ToList();
var deviceDic = new Dictionary<string, List<PowerStationDevice>>();
foreach (var psName_Group in device_psName_Group)
{
//電站總覽
PowerStationDevice powerStation = new PowerStationDevice()
{
CityName = cityName_Group.Key,
PowerStationName = psName_Group.Key,
PowerStationId = psName_Group.First().PowerStationId,
DeviceName = "電站總覽",
DeviceType = "PWS",
DeviceId = psName_Group.First().PowerStationId.ToString()
};
var temp = new List<PowerStationDevice>();
temp.Add(powerStation);
foreach (var device in psName_Group)
{
if (!string.IsNullOrEmpty(device.DeviceId))
{
temp.Add(device);
}
}
deviceDic.Add(psName_Group.Key, temp);
}
deviceCollapse.Add(cityName_Group.Key, deviceDic);
}
apiResult.Code = "0000";
apiResult.Data = deviceCollapse;
}
catch (Exception exception)
{
apiResult.Code = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】");
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
[HttpPost]
public async Task<ApiResult<AnalysisDevice>> GetAnalysisByDeviceIds(PostAnalysisStation post)
{
ApiResult<AnalysisDevice> apiResult = new ApiResult<AnalysisDevice>();
try
{
AnalysisDevice analysisDevice = new AnalysisDevice();
analysisDevice.Series = new List<DeviceHistoryInfo>();
//先將欲查詢的設備找出設備的資料庫欄位
var device_powerStationId_Group = post.DeviceIdInfos.GroupBy(x => x.PowerStationId).ToList();
Dictionary<int, List<Device>> deviceDic = new Dictionary<int, List<Device>>();
List<StationIdWithMeterIds> meterDic = new List<StationIdWithMeterIds>();
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)
{
var powerStation = await powerStationRepository.GetOneAsync(psId_Group.Key);
//區分電站總覽or設備
var temp_psIds = psId_Group.Where(x => x.DeviceType == "PWS").Select(x => Convert.ToInt32(x.DeviceId)).ToList();
if (temp_psIds.Count() > 0)
{
selected_powerStationIds.AddRange(temp_psIds);
}
var selected_meter = psId_Group.Where(x => x.DeviceType == "PWR").Select(x => x.DeviceId).ToList();
var selected_device = psId_Group.Where(x => x.DeviceType != "PWS" && x.DeviceType != "PWR").Select(x => x.DeviceId).ToList();
var temp_meter = await powerStationRepository.GetDeviceByPowerStationIdAndDeviceIds(powerStation.SiteDB, powerStation.Id, selected_meter);
if (temp_meter.Count() > 0)
{
StationIdWithMeterIds stationIdWithMeterIds = new StationIdWithMeterIds();
stationIdWithMeterIds.PowerStationId = psId_Group.Key;
stationIdWithMeterIds.MeterIds = temp_meter.Select(x => x.UID).ToList();
meterDic.Add(stationIdWithMeterIds);
}
var temp_device = await powerStationRepository.GetDeviceByPowerStationIdAndDeviceIds(powerStation.SiteDB, powerStation.Id, selected_device);
if (temp_device.Count() > 0)
{
deviceDic.Add(psId_Group.Key, temp_device);
}
}
analysisDevice.MultipleYaxes = new Dictionary<string, string>()
{
{ "KWH", "發電量"},
{ "Irradiance", "日照度"},
{ "KWHKWP", "發電小時"},
{ "PR", "PR %"},
{ "SolarHour", "日照小時"},
{ "Temperature", "模組溫度"},
{ "EnvTemperature", "環境溫度計"},
{ "Humidity", "濕度"},
{ "Vane", "風速"},
{ "Dust", "落塵%"},
{ "OUTPUT_KWH", "輸出發電量(kWh)"},
{ "INPUT_KWH", "輸入發電量(kWh)"},
{ "V_AB", "電壓 AB(V)"},
{ "V_BC", "電壓 BC(V)"},
{ "V_CA", "電壓 CA(V)"},
{ "I_A", "電流 A(A)"},
{ "I_B", "電流 B(A)"},
{ "I_C", "電流 C(A)"},
{ "P", "有效功率(kW)"},
{ "F", "頻率(Hz)"},
};
var XAxis = new List<string>();
//針對x軸先進行處理並同時抓取資料
if (selected_powerStationIds.Count() > 0)
{
powerStationHistories = await powerStationRepository.GetPowerStationHistory(post.SelectedDate, post.SearchType, selected_powerStationIds);
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();
#region
if (powerStationHistories.Count() > 0)
{
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 xa in XAxis)
{
var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault();
if (history != null)
{
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 xa in XAxis)
{
var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault();
if (history != null)
{
KWH.Values.Add(history.KWH);
}
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 xa in XAxis)
{
var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault();
if (history != null)
{
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 xa in XAxis)
{
var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault();
if (history != null)
{
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 xa in XAxis)
{
var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault();
if (history != null)
{
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["Temperature"]);
modelTemperature.YaxesKey = "Temperature";
modelTemperature.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault();
if (history != null)
{
modelTemperature.Values.Add(Math.Round(history.Temperature, 2));
}
else
{
modelTemperature.Values.Add(0);
}
}
analysisDevice.Series.Add(modelTemperature);
}
}
#endregion
#region
if (meterHistories.Count() > 0)
{
var meterHistories_Id_Group = meterHistories.GroupBy(x => x.METERID).ToList();
foreach (var item in meterHistories_Id_Group)
{
var temp_item = item.OrderBy(x => x.TIMESTAMP).ToList();
DeviceHistoryInfo OUTPUT_KWH = new DeviceHistoryInfo();
OUTPUT_KWH.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["OUTPUT_KWH"]);
OUTPUT_KWH.YaxesKey = "OUTPUT_KWH";
OUTPUT_KWH.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
OUTPUT_KWH.Values.Add(Math.Round(history.OUTPUT_KWH, 2));
}
else
{
OUTPUT_KWH.Values.Add(0);
}
}
analysisDevice.Series.Add(OUTPUT_KWH);
DeviceHistoryInfo INPUT_KWH = new DeviceHistoryInfo();
INPUT_KWH.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["INPUT_KWH"]);
INPUT_KWH.YaxesKey = "INPUT_KWH";
INPUT_KWH.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
INPUT_KWH.Values.Add(Math.Round(history.INPUT_KWH, 2));
}
else
{
INPUT_KWH.Values.Add(0);
}
}
analysisDevice.Series.Add(INPUT_KWH);
DeviceHistoryInfo V_AB = new DeviceHistoryInfo();
V_AB.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_AB"]);
V_AB.YaxesKey = "V_AB";
V_AB.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
V_AB.Values.Add(Math.Round(history.V_AB, 2));
}
else
{
V_AB.Values.Add(0);
}
}
analysisDevice.Series.Add(V_AB);
DeviceHistoryInfo V_BC = new DeviceHistoryInfo();
V_BC.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_BC"]);
V_BC.YaxesKey = "V_BC";
V_BC.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
V_BC.Values.Add(Math.Round(history.V_BC, 2));
}
else
{
V_BC.Values.Add(0);
}
}
analysisDevice.Series.Add(V_BC);
DeviceHistoryInfo V_CA = new DeviceHistoryInfo();
V_CA.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_BC"]);
V_CA.YaxesKey = "V_CA";
V_CA.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
V_CA.Values.Add(Math.Round(history.V_CA, 2));
}
else
{
V_CA.Values.Add(0);
}
}
analysisDevice.Series.Add(V_CA);
DeviceHistoryInfo I_A = new DeviceHistoryInfo();
I_A.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_A"]);
I_A.YaxesKey = "I_A";
I_A.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
I_A.Values.Add(Math.Round(history.I_A, 2));
}
else
{
I_A.Values.Add(0);
}
}
analysisDevice.Series.Add(I_A);
DeviceHistoryInfo I_B = new DeviceHistoryInfo();
I_B.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_B"]);
I_B.YaxesKey = "I_B";
I_B.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
I_B.Values.Add(Math.Round(history.I_B, 2));
}
else
{
I_B.Values.Add(0);
}
}
analysisDevice.Series.Add(I_B);
DeviceHistoryInfo I_C = new DeviceHistoryInfo();
I_C.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_C"]);
I_C.YaxesKey = "I_C";
I_C.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
I_C.Values.Add(Math.Round(history.I_C, 2));
}
else
{
I_C.Values.Add(0);
}
}
analysisDevice.Series.Add(I_C);
DeviceHistoryInfo P = new DeviceHistoryInfo();
P.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["P"]);
P.YaxesKey = "P";
P.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
P.Values.Add(Math.Round(history.P, 2));
}
else
{
P.Values.Add(0);
}
}
analysisDevice.Series.Add(P);
DeviceHistoryInfo F = new DeviceHistoryInfo();
F.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["F"]);
F.YaxesKey = "F";
F.Values = new List<double>();
foreach (var xa in XAxis)
{
var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault();
if (history != null)
{
F.Values.Add(Math.Round(history.F, 2));
}
else
{
F.Values.Add(0);
}
}
analysisDevice.Series.Add(F);
}
}
#endregion
#region
foreach (var devices in deviceDic)
{
var result = await powerStationRepository.GetSensorAvgByDevices(post.SelectedDate, post.SearchType, devices.Value);
var powerStation = await powerStationRepository.GetOneAsync(devices.Key);
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["EnvTemperature"];
YaxesKey = "EnvTemperature";
break;
case "MTR": //模組溫度計
suffix = analysisDevice.MultipleYaxes["Temperature"];
YaxesKey = "Temperature";
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}({2})", powerStation.Name, 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);
}
}
#endregion
analysisDevice.XAxis = XAxis.Distinct().ToList();
apiResult.Code = "0000";
apiResult.Data = analysisDevice;
}
catch (Exception exception)
{
apiResult.Code = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】");
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
}
}