1. 即時資訊 and 合併電站圖表:增加模組溫度

2.Sensor 如有多個需修正為多個平均
3.合併電站:選擇電站改為跟交叉分析中的左側選單相同
4. bug fix
This commit is contained in:
Kai 2021-08-05 17:12:38 +08:00
parent e5dd87a6cb
commit 6ad6054bba
25 changed files with 802 additions and 482 deletions

View File

@ -215,6 +215,7 @@ namespace SolarPower.Controllers
powerIrradianceTodayChart.Labels = powerIrradianceToday.Select(x => x.Label).ToList(); powerIrradianceTodayChart.Labels = powerIrradianceToday.Select(x => x.Label).ToList();
powerIrradianceTodayChart.PowerDatas = powerIrradianceToday.Select(x => x.PowerData).ToList(); powerIrradianceTodayChart.PowerDatas = powerIrradianceToday.Select(x => x.PowerData).ToList();
powerIrradianceTodayChart.IrradianceDatas = powerIrradianceToday.Select(x => x.IrradianceData).ToList(); powerIrradianceTodayChart.IrradianceDatas = powerIrradianceToday.Select(x => x.IrradianceData).ToList();
powerIrradianceTodayChart.TemperatureDatas = powerIrradianceToday.Select(x => x.TemperatureData).ToList();
chartUptoDate.ChartToday = powerIrradianceTodayChart; chartUptoDate.ChartToday = powerIrradianceTodayChart;
//7日發電量日照度List //7日發電量日照度List
@ -224,24 +225,27 @@ namespace SolarPower.Controllers
powerIrradiance7dayChart.Labels = powerIrradiance7day.Select(x => x.Label).ToList(); powerIrradiance7dayChart.Labels = powerIrradiance7day.Select(x => x.Label).ToList();
powerIrradiance7dayChart.PowerDatas = powerIrradiance7day.Select(x => x.PowerData).ToList(); powerIrradiance7dayChart.PowerDatas = powerIrradiance7day.Select(x => x.PowerData).ToList();
powerIrradiance7dayChart.IrradianceDatas = powerIrradiance7day.Select(x => x.IrradianceData).ToList(); powerIrradiance7dayChart.IrradianceDatas = powerIrradiance7day.Select(x => x.IrradianceData).ToList();
powerIrradiance7dayChart.TemperatureDatas = powerIrradiance7day.Select(x => x.TemperatureData).ToList();
chartUptoDate.Chart7day = powerIrradiance7dayChart; chartUptoDate.Chart7day = powerIrradiance7dayChart;
//本月發電量日照度List //本月發電量日照度List
var powerIrradianceMonth = await overviewRepository.GetListPowerIrradianceMonthByPowerStationId(id, nowDay); var powerIrradianceMonth = await overviewRepository.GetListPowerIrradianceMonthByPowerStationId(id, nowDay);
//今日資料轉換 //本月資料轉換
PowerIrradianceChart powerIrradianceMonthChart = new PowerIrradianceChart(); PowerIrradianceChart powerIrradianceMonthChart = new PowerIrradianceChart();
powerIrradianceMonthChart.Labels = powerIrradianceMonth.Select(x => x.Label).ToList(); powerIrradianceMonthChart.Labels = powerIrradianceMonth.Select(x => x.Label).ToList();
powerIrradianceMonthChart.PowerDatas = powerIrradianceMonth.Select(x => x.PowerData).ToList(); powerIrradianceMonthChart.PowerDatas = powerIrradianceMonth.Select(x => x.PowerData).ToList();
powerIrradianceMonthChart.IrradianceDatas = powerIrradianceMonth.Select(x => x.IrradianceData).ToList(); powerIrradianceMonthChart.IrradianceDatas = powerIrradianceMonth.Select(x => x.IrradianceData).ToList();
powerIrradianceMonthChart.TemperatureDatas = powerIrradianceMonth.Select(x => x.TemperatureData).ToList();
chartUptoDate.ChartMonth = powerIrradianceMonthChart; chartUptoDate.ChartMonth = powerIrradianceMonthChart;
//本年發電量日照度List //本年發電量日照度List
var powerIrradianceYear = await overviewRepository.GetListPowerIrradianceYearByPowerStationId(id, nowDay); var powerIrradianceYear = await overviewRepository.GetListPowerIrradianceYearByPowerStationId(id, nowDay);
//今日資料轉換 //本月資料轉換
PowerIrradianceChart powerIrradianceYearChart = new PowerIrradianceChart(); PowerIrradianceChart powerIrradianceYearChart = new PowerIrradianceChart();
powerIrradianceYearChart.Labels = powerIrradianceYear.Select(x => x.Label).ToList(); powerIrradianceYearChart.Labels = powerIrradianceYear.Select(x => x.Label).ToList();
powerIrradianceYearChart.PowerDatas = powerIrradianceYear.Select(x => x.PowerData).ToList(); powerIrradianceYearChart.PowerDatas = powerIrradianceYear.Select(x => x.PowerData).ToList();
powerIrradianceYearChart.IrradianceDatas = powerIrradianceYear.Select(x => x.IrradianceData).ToList(); powerIrradianceYearChart.IrradianceDatas = powerIrradianceYear.Select(x => x.IrradianceData).ToList();
powerIrradianceYearChart.TemperatureDatas = powerIrradianceYear.Select(x => x.TemperatureData).ToList();
chartUptoDate.ChartYear = powerIrradianceYearChart; chartUptoDate.ChartYear = powerIrradianceYearChart;
apiResult.Code = "0000"; apiResult.Code = "0000";

View File

@ -7,6 +7,7 @@ using NPOI.SS.Util;
using NPOI.XSSF.UserModel; using NPOI.XSSF.UserModel;
using SolarPower.Models; using SolarPower.Models;
using SolarPower.Models.PowerStation; using SolarPower.Models.PowerStation;
using SolarPower.Models.Role;
using SolarPower.Repository.Interface; using SolarPower.Repository.Interface;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -49,7 +50,7 @@ namespace SolarPower.Controllers
} }
else else
{ {
powerStations = await powerStationRepository.GetPowerStationsByCompanyIdWithfilter(myUser.CompanyId,filter); powerStations = await powerStationRepository.GetPowerStationsByCompanyIdWithfilter(myUser,filter);
} }
var siteDBNamePowerStationId = new Dictionary<string, List<PowerStationIdAndCity>>(); var siteDBNamePowerStationId = new Dictionary<string, List<PowerStationIdAndCity>>();

View File

@ -428,12 +428,12 @@ INSERT INTO `auth_page` (`AuthCode`, `MainName`, `SubName`, `TagName`, `ControlN
('L', '交叉分析', '合併電站', NULL, 'AnalysisStationCombine'), ('L', '交叉分析', '合併電站', NULL, 'AnalysisStationCombine'),
('M', '交叉分析', '電站交叉分析', NULL, 'AnalysisStationInfo'), ('M', '交叉分析', '電站交叉分析', NULL, 'AnalysisStationInfo'),
('N', '交叉分析', '逆變器交叉分析', NULL, 'AnalysisInverter'), ('N', '交叉分析', '逆變器交叉分析', NULL, 'AnalysisInverter'),
('P', '報表查詢', '電站報表', NULL, 'CCC'), ('P', '報表查詢', '電站報表', NULL, 'StationReport'),
('Q', '報表查詢', '電廠發電效能統計', NULL, 'HHH'), ('Q', '報表查詢', '電廠發電效能統計', NULL, 'HHH'),
('R', '報表查詢', '輸入台電售電紀錄', NULL, 'JJJ'), ('R', '報表查詢', '輸入台電售電紀錄', NULL, 'ElectricitySoldRecord'),
('S', '報表查詢', '報告發送設定', NULL, 'JJJ'), ('S', '報表查詢', '報告發送設定', NULL, 'JJJ'),
('T', '即時告警', '異常事件查詢', NULL, 'KKK'), ('T', '即時告警', '異常事件查詢', NULL, 'KKK'),
('U', '運維管理', '電站管理', NULL, 'PowerStationManager'), ('U', '運維管理', '電站管理', NULL, 'PowerStation'),
('V', '運維管理', '定期計畫建立', NULL, 'Operation'), ('V', '運維管理', '定期計畫建立', NULL, 'Operation'),
('W', '運維管理', '運維作業記錄', NULL, 'OperationRecord'), ('W', '運維管理', '運維作業記錄', NULL, 'OperationRecord'),
('X', '系統管理', '公司管理', NULL, 'Company'), ('X', '系統管理', '公司管理', NULL, 'Company'),
@ -1262,7 +1262,7 @@ CREATE TABLE IF NOT EXISTS `weather_description` (
`WeatherValue` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '分類代碼', `WeatherValue` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '分類代碼',
`WeatherKey` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'icon代號', `WeatherKey` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'icon代號',
PRIMARY KEY (`Id`) PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=355 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='天氣描述分類'; ) ENGINE=InnoDB AUTO_INCREMENT=355 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='天氣描述分類';
-- 正在傾印表格 solar_power_test.weather_description 的資料:~0 rows (近似值) -- 正在傾印表格 solar_power_test.weather_description 的資料:~0 rows (近似值)
DELETE FROM `weather_description`; DELETE FROM `weather_description`;
@ -1636,7 +1636,7 @@ CREATE TABLE IF NOT EXISTS `weather_forecast` (
`CreatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `CreatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`), PRIMARY KEY (`Id`),
KEY `IDX_01` (`LocationName`) USING BTREE KEY `IDX_01` (`LocationName`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='天氣預報'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='天氣預報';
@ -1648,7 +1648,7 @@ CREATE TABLE IF NOT EXISTS `weather_observation` (
`Temp` double DEFAULT NULL COMMENT '溫度', `Temp` double DEFAULT NULL COMMENT '溫度',
PRIMARY KEY (`Id`), PRIMARY KEY (`Id`),
KEY `IDX_01` (`PowerStationId`) USING BTREE KEY `IDX_01` (`PowerStationId`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='天氣觀測'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='天氣觀測';

View File

@ -27,6 +27,7 @@ namespace SolarPower.Models
public class Chartoutput public class Chartoutput
{ {
public double Irradiance { get; set; } public double Irradiance { get; set; }
public double Temperature { get; set; }
public double KWH { get; set; } public double KWH { get; set; }
public string Time { get; set; } public string Time { get; set; }
} }

View File

@ -16,6 +16,7 @@ namespace SolarPower.Models
public string Attachment { get; set; } public string Attachment { get; set; }
public byte IsDelivery { get; set; } public byte IsDelivery { get; set; }
public string DeliveryAt { get; set; } public string DeliveryAt { get; set; }
public string Reason { get; set; }
} }
public class OperationPersonnel public class OperationPersonnel

View File

@ -77,6 +77,7 @@ namespace SolarPower.Models
public string Label { get; set; } public string Label { get; set; }
public double PowerData { get; set; } public double PowerData { get; set; }
public double IrradianceData { get; set; } public double IrradianceData { get; set; }
public double TemperatureData { get; set; }
} }
public class PowerIrradianceChart public class PowerIrradianceChart
@ -84,6 +85,7 @@ namespace SolarPower.Models
public List<string> Labels { get; set; } public List<string> Labels { get; set; }
public List<double> PowerDatas { get; set; } public List<double> PowerDatas { get; set; }
public List<double> IrradianceDatas { get; set; } public List<double> IrradianceDatas { get; set; }
public List<double> TemperatureDatas { get; set; }
} }
public class ExceptionSent public class ExceptionSent

View File

@ -194,7 +194,7 @@ namespace SolarPower.Quartz.Jobs
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(deviceInfos)); logger.LogInformation("【CalcPowerStationJob】【電站[{0}]在{1}的日照計設備資訊】 - {2}", powerStation.Code, dateTime, System.Text.Json.JsonSerializer.Serialize(deviceInfos));
if (deviceInfos != null) if (deviceInfos != null && deviceInfos.Count() > 0)
{ {
//2. 計算該電站所有日照計設的每小時的平均在依照日照計數量平均 //2. 計算該電站所有日照計設的每小時的平均在依照日照計數量平均
logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的日照計的日照度】", powerStation.Code, dateTime); logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的日照計的日照度】", powerStation.Code, dateTime);
@ -216,7 +216,7 @@ namespace SolarPower.Quartz.Jobs
var tempdeviceInfos = await powerStationRepository.GetListTempByPowerStationId(powerStation.Id, powerStation.SiteDB); var tempdeviceInfos = await powerStationRepository.GetListTempByPowerStationId(powerStation.Id, powerStation.SiteDB);
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(tempdeviceInfos)); logger.LogInformation("【CalcPowerStationJob】【電站[{0}]在{1}的溫度計設備資訊】 - {2}", powerStation.Code, dateTime, System.Text.Json.JsonSerializer.Serialize(tempdeviceInfos));
if (tempdeviceInfos != null) if (tempdeviceInfos != null && tempdeviceInfos.Count() > 0)
{ {
logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的溫度計的平均溫度】", powerStation.Code, dateTime); logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的溫度計的平均溫度】", powerStation.Code, dateTime);
var tempHistory = await powerStationRepository.GetPyrheliometerHistoryPerHour(dateTime, tempdeviceInfos, 1); var tempHistory = await powerStationRepository.GetPyrheliometerHistoryPerHour(dateTime, tempdeviceInfos, 1);
@ -244,7 +244,7 @@ namespace SolarPower.Quartz.Jobs
var full_inverter_table_name = String.Format("`{0}`.`{1}`", powerStation.SiteDB, inverter_table_name); var full_inverter_table_name = String.Format("`{0}`.`{1}`", powerStation.SiteDB, inverter_table_name);
var exist_inverter_table = await powerStationRepository.ExistTable(powerStation.SiteDB, inverter_table_name); var exist_inverter_table = await powerStationRepository.ExistTable(powerStation.SiteDB, inverter_table_name);
if (!string.IsNullOrEmpty(exist_inverter_table)) if (!string.IsNullOrEmpty(exist_inverter_table) && inverterIds !=null && inverterIds.Count() > 0)
{ {
logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的逆變器的資訊】", powerStation.Code, dateTime); logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的逆變器的資訊】", powerStation.Code, dateTime);
inverterHistories = await powerStationRepository.CalcInverterHisyortHourData(dateTime, powerStation.SiteDB, full_inverter_table_name, inverterIds); inverterHistories = await powerStationRepository.CalcInverterHisyortHourData(dateTime, powerStation.SiteDB, full_inverter_table_name, inverterIds);
@ -322,10 +322,11 @@ namespace SolarPower.Quartz.Jobs
{ {
if (Location.StationId == powerStation.WeathersStationId) if (Location.StationId == powerStation.WeathersStationId)
{ {
calcPowerStation.TodayWeatherTemp = Convert.ToDouble(Location.WeatherElement[0].ElementValue); calcPowerStation.TodayWeatherTemp = Convert.ToDouble(Location.WeatherElement[0].ElementValue);
weatherObservation.PowerStationId = powerStation.Id; weatherObservation.PowerStationId = powerStation.Id;
weatherObservation.Temp = Convert.ToDouble(Location.WeatherElement[0].ElementValue); weatherObservation.Temp = Convert.ToDouble(Location.WeatherElement[0].ElementValue);
weatherObservation.ObsTime = Location.Time.ObsTime.ToString(); weatherObservation.ObsTime = Convert.ToInt32(Location.Time.ObsTime.Substring(0, 4)) < 1970? null : Location.Time.ObsTime;
calcPowerStation.WeathersStationId = powerStation.WeathersStationId; calcPowerStation.WeathersStationId = powerStation.WeathersStationId;
break; break;
} }

View File

@ -55,7 +55,7 @@ namespace SolarPower.Quartz.Jobs
var result = Send(recipientEmails, notice.Subject, notice.Content, attachments); var result = Send(recipientEmails, notice.Subject, notice.Content, attachments);
if(result) if (result.CompareTo("成功") == 0)
{ {
NoticeSchedule noticeSchedule = new NoticeSchedule(); NoticeSchedule noticeSchedule = new NoticeSchedule();
noticeSchedule.Id = notice.Id; noticeSchedule.Id = notice.Id;
@ -64,6 +64,16 @@ namespace SolarPower.Quartz.Jobs
updateNoticeSchedules.Add(noticeSchedule); updateNoticeSchedules.Add(noticeSchedule);
} }
else
{
NoticeSchedule noticeSchedule = new NoticeSchedule();
noticeSchedule.Id = notice.Id;
noticeSchedule.IsDelivery = 2;
noticeSchedule.DeliveryAt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
noticeSchedule.Reason = result;
updateNoticeSchedules.Add(noticeSchedule);
}
List<string> properties = new List<string>() List<string> properties = new List<string>()
{ {
@ -83,8 +93,10 @@ namespace SolarPower.Quartz.Jobs
} }
} }
private bool Send(List<string> recipientEmails, string subject, string content, List<string> attachments) private string Send(List<string> recipientEmails, string subject, string content, List<string> attachments)
{ {
var reason = string.Empty;
var CanDoSend = true;
MailMessage MyMail = new MailMessage(); MailMessage MyMail = new MailMessage();
MyMail.SubjectEncoding = System.Text.Encoding.UTF8;//郵件標題編碼 MyMail.SubjectEncoding = System.Text.Encoding.UTF8;//郵件標題編碼
@ -105,11 +117,22 @@ namespace SolarPower.Quartz.Jobs
var directoryBase = Directory.GetCurrentDirectory(); var directoryBase = Directory.GetCurrentDirectory();
var filePath = @$"{directoryBase}\wwwroot{attachment}"; var filePath = @$"{directoryBase}\wwwroot{attachment}";
if (File.Exists(filePath))
{
var data = new Attachment(filePath); var data = new Attachment(filePath);
MyMail.Attachments.Add(data); MyMail.Attachments.Add(data);
} }
else
{
CanDoSend = false;
reason = "失敗 - 檔案遺失";
break;
}
}
//讀取 SMTP Config //讀取 SMTP Config
if (CanDoSend)
{
SmtpClient MySMTP = new SmtpClient(smtp.Host, smtp.Port); SmtpClient MySMTP = new SmtpClient(smtp.Host, smtp.Port);
MySMTP.EnableSsl = smtp.EnableSsl; MySMTP.EnableSsl = smtp.EnableSsl;
MySMTP.Credentials = new System.Net.NetworkCredential(smtp.UserName, smtp.Password); MySMTP.Credentials = new System.Net.NetworkCredential(smtp.UserName, smtp.Password);
@ -119,7 +142,7 @@ namespace SolarPower.Quartz.Jobs
MySMTP.Dispose(); MySMTP.Dispose();
MyMail.Dispose(); //釋放資源 MyMail.Dispose(); //釋放資源
return true; return "成功";
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -128,7 +151,12 @@ namespace SolarPower.Quartz.Jobs
logger.LogError("【SendEmailJob】 - Emails:" + json); logger.LogError("【SendEmailJob】 - Emails:" + json);
logger.LogError("【SendEmailJob】 - Exception:" + ex.Message); logger.LogError("【SendEmailJob】 - Exception:" + ex.Message);
return false; return "失敗 - " + ex.Message;
}
}
else
{
return reason;
} }
} }

View File

@ -159,7 +159,10 @@ namespace SolarPower.Repository.Implement
switch (post.SeacrhType) switch (post.SeacrhType)
{ {
case 0: case 0:
sql = $@"SELECT DATE_FORMAT(ps.TIMESTAMP,'%h %p') AS `Time`,SUM(ps.KWH) AS KWH,SUM(sh.Irradiance) AS Irradiance sql = $@"SELECT DATE_FORMAT(ps.TIMESTAMP,'%h %p') AS `Time`,
SUM(ps.KWH) AS KWH,
SUM(sh.Irradiance) AS Irradiance,
AVG(sh.Temperature) AS Temperature
FROM power_station_history_hour ps FROM power_station_history_hour ps
LEFT JOIN sensor_history_hour sh LEFT JOIN sensor_history_hour sh
ON sh.TIMESTAMP = ps.TIMESTAMP AND sh.PowerStationId = ps.PowerStationId ON sh.TIMESTAMP = ps.TIMESTAMP AND sh.PowerStationId = ps.PowerStationId
@ -171,7 +174,8 @@ namespace SolarPower.Repository.Implement
sql = $@"SELECT sql = $@"SELECT
DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') AS `Time`, DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') AS `Time`,
SUM(ps.TODAYKWH) AS KWH, SUM(ps.TODAYKWH) AS KWH,
SUM(sh.Irradiance) AS Irradiance SUM(sh.Irradiance) AS Irradiance,
AVG(sh.Temperature) AS Temperature
FROM power_station_history_day ps FROM power_station_history_day ps
LEFT JOIN sensor_history_day sh LEFT JOIN sensor_history_day sh
ON sh.TIMESTAMP = ps.TIMESTAMP ON sh.TIMESTAMP = ps.TIMESTAMP
@ -182,7 +186,8 @@ namespace SolarPower.Repository.Implement
sql = $@"SELECT sql = $@"SELECT
DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') AS `Time`, DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') AS `Time`,
SUM(ps.TODAYKWH) AS KWH, SUM(ps.TODAYKWH) AS KWH,
SUM(sh.Irradiance) AS Irradiance SUM(sh.Irradiance) AS Irradiance,
AVG(sh.Temperature) AS Temperature
FROM power_station_history_day ps FROM power_station_history_day ps
LEFT JOIN sensor_history_day sh LEFT JOIN sensor_history_day sh
ON sh.TIMESTAMP = ps.TIMESTAMP ON sh.TIMESTAMP = ps.TIMESTAMP
@ -193,7 +198,8 @@ namespace SolarPower.Repository.Implement
sql = $@"SELECT sql = $@"SELECT
DATE_FORMAT(ps.TIMESTAMP,'%Y-%m') AS `Time`, DATE_FORMAT(ps.TIMESTAMP,'%Y-%m') AS `Time`,
SUM(ps.MONTHKWH) AS KWH, SUM(ps.MONTHKWH) AS KWH,
SUM(sh.Irradiance) AS Irradiance SUM(sh.Irradiance) AS Irradiance,
AVG(sh.Temperature) AS Temperature
FROM power_station_history_month ps FROM power_station_history_month ps
LEFT JOIN sensor_history_month sh LEFT JOIN sensor_history_month sh
ON sh.TIMESTAMP = ps.TIMESTAMP ON sh.TIMESTAMP = ps.TIMESTAMP

View File

@ -110,11 +110,16 @@ namespace SolarPower.Repository.Implement
var dateNow = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var dateNow = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var sql = @$"SELECT var sql = @$"SELECT
w.Wx, wf.Wx,
ps.* ps.*
FROM power_station ps FROM power_station ps
LEFT JOIN city c ON ps.CityId = c.Id LEFT JOIN city c ON ps.CityId = c.Id
LEFT JOIN weather_forecast w ON c.Name = w.LocationName AND w.StartTime < @DateNow AND w.EndTime > @DateNow LEFT JOIN (SELECT * FROM (
SELECT MAX(w.Id) AS aa FROM weather_forecast w
WHERE w.StartTime < @DateNow AND w.EndTime > @DateNow
GROUP BY w.LocationName
) A
LEFT JOIN weather_forecast B ON A.aa = B.Id) wf ON c.Name = wf.LocationName
WHERE ps.Id IN @PowerStationIds WHERE ps.Id IN @PowerStationIds
"; ";
@ -206,7 +211,7 @@ namespace SolarPower.Repository.Implement
{ {
try try
{ {
var sql_power = @$"SELECT DATE_FORMAT(ps.timestamp,'%H %p') AS Label, ps.KWH AS PowerData, pyr.Irradiance AS IrradianceData var sql_power = @$"SELECT DATE_FORMAT(ps.timestamp,'%H %p') AS Label, ps.KWH AS PowerData, pyr.Irradiance AS IrradianceData, pyr.Temperature AS TemperatureData
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
@ -231,7 +236,7 @@ namespace SolarPower.Repository.Implement
{ {
var startDay = Convert.ToDateTime(nowDay).AddDays(-7).ToString("yyyy-MM-dd"); var startDay = Convert.ToDateTime(nowDay).AddDays(-7).ToString("yyyy-MM-dd");
var sql_power = @$"SELECT DATE_FORMAT(ps.timestamp, '%Y-%m-%d') AS Label, ps.TODAYKWH AS PowerData, pyr.Irradiance AS IrradianceData var sql_power = @$"SELECT DATE_FORMAT(ps.timestamp, '%Y-%m-%d') AS Label, ps.TODAYKWH AS PowerData, pyr.Irradiance AS IrradianceData, pyr.Temperature AS TemperatureData
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
@ -256,7 +261,7 @@ namespace SolarPower.Repository.Implement
{ {
var startDay = Convert.ToDateTime(nowDay).ToString("yyyy-MM-01"); var startDay = Convert.ToDateTime(nowDay).ToString("yyyy-MM-01");
var sql_power = @$"SELECT DATE_FORMAT(ps.timestamp, '%Y-%m-%d') AS Label, ps.TODAYKWH AS PowerData, pyr.Irradiance AS IrradianceData var sql_power = @$"SELECT DATE_FORMAT(ps.timestamp, '%Y-%m-%d') AS Label, ps.TODAYKWH AS PowerData, pyr.Irradiance AS IrradianceData, pyr.Temperature AS TemperatureData
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
@ -282,7 +287,7 @@ namespace SolarPower.Repository.Implement
{ {
var startyear = Convert.ToDateTime(nowDay).ToString("yyyy"); var startyear = Convert.ToDateTime(nowDay).ToString("yyyy");
var sql_power = @$"SELECT DATE_FORMAT(ps.timestamp, '%Y-%m') AS Label, ps.MONTHKWH AS PowerData, pyr.Irradiance AS IrradianceData var sql_power = @$"SELECT DATE_FORMAT(ps.timestamp, '%Y-%m') AS Label, ps.MONTHKWH AS PowerData, pyr.Irradiance AS IrradianceData, pyr.Temperature AS TemperatureData
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

View File

@ -3287,7 +3287,7 @@ namespace SolarPower.Repository.Implement
FROM city c FROM city c
LEFT JOIN weather_forecast wf ON wf.LocationName = c.`Name` LEFT JOIN weather_forecast wf ON wf.LocationName = c.`Name`
LEFT JOIN weather_description wd ON wd.WeatherName = wf.Wx LEFT JOIN weather_description wd ON wd.WeatherName = wf.Wx
WHERE c.Priority = {CityId} AND '{now}' BETWEEN wf.StartTime AND wf.EndTime ORDER BY wf.CreatedAt desc"; WHERE c.Id = {CityId} AND '{now}' BETWEEN wf.StartTime AND wf.EndTime ORDER BY wf.CreatedAt desc";
result = await conn.QueryFirstOrDefaultAsync<NowWeather>(sql); result = await conn.QueryFirstOrDefaultAsync<NowWeather>(sql);
} }
@ -3754,7 +3754,7 @@ namespace SolarPower.Repository.Implement
FROM power_station ps FROM power_station ps
LEFT JOIN `city` c ON ps.CityId = c.Id LEFT JOIN `city` c ON ps.CityId = c.Id
LEFT JOIN {powerStationDic.Key}.controller con ON ps.Id = con.PowerStationId LEFT JOIN {powerStationDic.Key}.controller con ON ps.Id = con.PowerStationId
LEFT JOIN {powerStationDic.Key}.inverter inv ON con.Id = inv.ControllerId LEFT JOIN {powerStationDic.Key}.inverter inv ON con.Id = inv.ControllerId AND inv.Enabled = 1 AND inv.status != 0
WHERE ps.Deleted = 0 WHERE ps.Deleted = 0
AND ps.Id IN ({powerStationIds})"; AND ps.Id IN ({powerStationIds})";
if (!string.IsNullOrEmpty(filter)) if (!string.IsNullOrEmpty(filter))
@ -4010,7 +4010,7 @@ namespace SolarPower.Repository.Implement
} }
public async Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(int companyId, string filter) public async Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(MyUser myUser, string filter)
{ {
List<PowerStationIdAndCity> result; List<PowerStationIdAndCity> result;
using (IDbConnection conn = this._databaseHelper.GetConnection()) using (IDbConnection conn = this._databaseHelper.GetConnection())
@ -4018,14 +4018,23 @@ namespace SolarPower.Repository.Implement
try try
{ {
var sql = $@"SELECT ps.Id AS PowerStationId , ps.`Name` AS PowerStationName,city.Name AS CityName FROM {tableName} ps var sql = $@"SELECT ps.Id AS PowerStationId , ps.`Name` AS PowerStationName,city.Name AS CityName FROM {tableName} ps
LEFT JOIN city ON city.Id = ps.CityId WHERE ps.Deleted = 0 AND ps.CompanyId = @CompanyId "; LEFT JOIN city ON city.Id = ps.CityId";
if (myUser.Role.Layer == 2)
{
sql += " WHERE ps.Deleted = 0 AND ps.CompanyId = @CompanyId ";
}
else
{
sql += @" LEFT JOIN power_station_operation_personnel op ON ps.Id = op.PowerStationId
WHERE ps.Deleted = 0 AND op.Deleted = 0 AND op.UserId = @UserId ";
}
if (!string.IsNullOrEmpty(filter)) if (!string.IsNullOrEmpty(filter))
{ {
sql += @" AND ps.Name LIKE CONCAT('%', @Filter, '%')"; sql += @" AND ps.Name LIKE CONCAT('%', @Filter, '%')";
} }
result = (await conn.QueryAsync<PowerStationIdAndCity>(sql, new { CompanyId = companyId, Filter = filter })).ToList(); result = (await conn.QueryAsync<PowerStationIdAndCity>(sql, new { CompanyId = myUser.CompanyId, UserId = myUser.Id, Filter = filter })).ToList();
} }
catch (Exception exception) catch (Exception exception)
{ {

View File

@ -552,7 +552,7 @@ namespace SolarPower.Repository.Interface
Task<List<InverterHistory>> GetInverterHistoryRowData(string nowDay, List<StationCodeWithInverterIds> entities); Task<List<InverterHistory>> GetInverterHistoryRowData(string nowDay, 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(int companyId, string filter); Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(MyUser myUser, 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<dynamic> GetSensorAvgByDevices(string date, byte searchType, List<Device> devices); Task<dynamic> GetSensorAvgByDevices(string date, byte searchType, List<Device> devices);

View File

@ -429,7 +429,7 @@
$.post(url, send_data, function (rel) { $.post(url, send_data, function (rel) {
if (rel.code != "0000") { if (rel.code != "0000") {
toast_error(rel.data.msg); toast_error(rel.msg);
return; return;
} }

View File

@ -6,12 +6,34 @@
@using SolarPower.Models.Role @using SolarPower.Models.Role
@model RoleLayerEnum @model RoleLayerEnum
<div class="container-fluid">
<div class="row flex-nowrap wrapper">
<div class="col-md-2 col-1 pl-0 pr-0 collapse width border-right sidebar vh-100">
<div class="list-group border-0 card text-center text-md-left" id="sidebar">
<div class="border bg-light rounded-top">
<div class="form-group p-2 m-0 rounded-top">
<input type="text" class="form-control form-control-lg shadow-inset-2 m-0" id="js_list_accordion_filter" placeholder="">
</div>
<div id="js_list_accordion" class="accordion accordion-hover accordion-clean js-list-filter">
</div>
<span class="filter-message js-filter-message"></span>
</div>
</div>
</div>
<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" id="collapse"></i></a>
</div>
<main class="col px-5 pl-md-2 main">
<ol class="breadcrumb page-breadcrumb"> <ol class="breadcrumb page-breadcrumb">
<li class="breadcrumb-item"><a href="javascript:void(0);">交叉分析</a></li> <li class="breadcrumb-item"><a href="javascript:void(0);">交叉分析</a></li>
<li class="breadcrumb-item active">合併電站</li> <li class="breadcrumb-item active">合併電站</li>
<li class="position-absolute pos-top pos-right d-none d-sm-block"><span class="js-get-date"></span></li> <li class="position-absolute pos-top pos-right d-none d-sm-block"><span class="js-get-date"></span></li>
</ol> </ol>
<div class="subheader"> <div class="subheader">
<h1 class="subheader-title"> <h1 class="subheader-title">
<i class='subheader-icon fal fa-globe'></i> 合併電站 <i class='subheader-icon fal fa-globe'></i> 合併電站
@ -23,7 +45,7 @@
<div id="panel-5" class="panel"> <div id="panel-5" class="panel">
<div class="panel-container show"> <div class="panel-container show">
<div class="panel-content"> <div class="panel-content">
<div class="row mb-3 d-flex align-items-center px-3"> @*<div class="row mb-3 d-flex align-items-center px-3">
<div class="pr-3"> <div class="pr-3">
<button type="button" class="btn btn-secondary waves-effect waves-themed" onclick="Allcity()">全部縣市</button> <button type="button" class="btn btn-secondary waves-effect waves-themed" onclick="Allcity()">全部縣市</button>
</div> </div>
@ -49,7 +71,7 @@
</div> </div>
</div> </div>
</div> </div>*@
<div class="row mb-5 d-flex align-items-top px-3"> <div class="row mb-5 d-flex align-items-top px-3">
<div class="pr-3"> <div class="pr-3">
@ -82,7 +104,7 @@
<div class="card"> <div class="card">
<div class="card-header bg-fusion-25 pr-3 d-flex align-items-center flex-wrap"> <div class="card-header bg-fusion-25 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>
<div class="ml-auto">kwh</div> <div class="ml-auto">kW h</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
@ -114,15 +136,16 @@
<div class="card"> <div class="card">
<div class="card-header bg-fusion-25 pr-3 d-flex align-items-center flex-wrap"> <div class="card-header bg-fusion-25 pr-3 d-flex align-items-center flex-wrap">
<h4 class="mb-0 font-weight-bold"><span class="fal fa-sun mr-1"></span> kWh / kWp</h4> <h4 class="mb-0 font-weight-bold"><span class="fal fa-sun mr-1"></span>有效日照時數</h4>
<div class="ml-auto">hr</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
<p>平均 kWh / kWp</p> <p>平均有效日照時數</p>
<p><span class="color-info-700" id="total_kwhkwp">140.39</span></p> <p><span class="color-info-700" id="total_kwhkwp">140.39</span></p>
</div> </div>
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
<p>今日 kWh / kWp </p> <p>今日有效日照時數 </p>
<p><span class="color-info-700" id="today_kwhkwp">4.53</span></p> <p><span class="color-info-700" id="today_kwhkwp">4.53</span></p>
</div> </div>
</div> </div>
@ -130,6 +153,7 @@
<div class="card"> <div class="card">
<div class="card-header bg-fusion-25 pr-3 d-flex align-items-center flex-wrap"> <div class="card-header bg-fusion-25 pr-3 d-flex align-items-center flex-wrap">
<h4 class="mb-0 font-weight-bold"><span class="fal fa-bolt mr-1"></span> PR值</h4> <h4 class="mb-0 font-weight-bold"><span class="fal fa-bolt mr-1"></span> PR值</h4>
<div class="ml-auto">%</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
@ -194,6 +218,12 @@
</div> </div>
</div> </div>
</div> </div>
</main>
</div>
</div>
@section Scripts{ @section Scripts{
@ -206,6 +236,8 @@
var datepicker; var datepicker;
var timerange;//選取時間 var timerange;//選取時間
$(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";//隱藏
@ -224,167 +256,13 @@
//#endregion //#endregion
//#region 預設載入該使用者可以選擇的電站
var Nurl = "/PowerStation/GetSolarCitySummary";
$.post(Nurl, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
for (var i = 0; i < rel.data.length; i++) {
$('#city').append("<button type='button' class='btn btn-success waves-effect waves-themed ml-2' id='" + 'cityID_' + rel.data[i].cityId + "'>" +
rel.data[i].city +
"<span class= 'badge bg-success-700 ml-2' >" + rel.data[i].amount + "</span >" +
"</button >");
ids.push(String(rel.data[i].cityId));
Allids.push(String(rel.data[i].cityId));
}
var send_data = {
cityid: ids
}
ids.sort();
var Nurl = "/PowerStation/GetSolarByCity";
$.post(Nurl, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
$('#CheckPowerStation').empty(); //#region 載入左邊選單列表
$.each(rel.data, function (index, val) { GetPowerStationCollapse("");
$('#CheckPowerStation').append("<div class='col-2 mb-2 custom-control custom-checkbox custom-control-inline' id='station_" + val.id + "' ></div>");
$('#station_' + val.id).append("<input type='checkbox' class='custom-control-input' id='check_" + val.id + "' checked>");
$('#station_' + val.id).append("<label class='custom-control-label' for='check_" + val.id + "'>" + val.name + "</label>");
powerids.push(String(val.id));
Allpowerids.push(String(val.id));
});
GetStationsCard();//5張卡片值
photoshow();//輪播圖片
})
})
//#endregion //#endregion
}) })
//#region 選擇電站checkbox
$('#CheckPowerStation').on("click", "input", function () {
var clickid = $(this).attr('id');
var classid = clickid.split("_");
var job = document.getElementById(clickid);
if (job.checked == true) {
powerids.push(classid[1]);
}
else {
powerids.remove(classid[1]);
}
GetStationsCard();
})
//#endregion
//#region 縣市全選
function Allcity() {
var Newpowerids = new Array(0);
ids = [];
$.each(Allids, function (index, val) {
var cityid = 'cityID_' + val;
document.getElementById(cityid).setAttribute("class", 'btn btn-success waves-effect waves-themed ml-2');
ids.push(val);
});
var send_data = {
cityid: ids
}
var Nurl = "/PowerStation/GetSolarByCity";
$.post(Nurl, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
$('#CheckPowerStation').empty();
Allpowerids = [];
$.each(rel.data, function (index, val) {
if (powerids.includes(String(val.id))) {
$('#CheckPowerStation').append("<div class='col-2 mb-2 custom-control custom-checkbox custom-control-inline' id='station_" + val.id + "' > ");
$('#station_' + val.id).append("<input type='checkbox' class='custom-control-input' id='check_" + val.id + "' checked>");
$('#station_' + val.id).append("<label class='custom-control-label' for='check_" + val.id + "'>" + val.name + "</label>");
Newpowerids.push(String(val.id));
}
else {
$('#CheckPowerStation').append("<div class='col-2 mb-2 custom-control custom-checkbox custom-control-inline' id='station_" + val.id + "' > ");
$('#station_' + val.id).append("<input type='checkbox' class='custom-control-input' id='check_" + val.id + "'>");
$('#station_' + val.id).append("<label class='custom-control-label' for='check_" + val.id + "'>" + val.name + "</label>");
}
Allpowerids.push(String(val.id));
});
powerids = [];
powerids = Newpowerids;
})
GetStationsCard();
}
//#endregion
//#region 電站全選
function Allpowerstation() {
powerids = [];
$.each(Allpowerids, function (index, val) {
$('#check_' + val).prop("checked", true);
powerids.push(val);
})
GetStationsCard();
}
//#endregion
//#region 選擇縣市
$('#city').on("click", "button", function () {
var clickid = $(this).attr('id');
var classid = clickid.split("_");
var Newpowerids = new Array(0);
var value = document.getElementById(clickid).className;
ids.sort(function (a, b) {
return a - b;
});
var send_data = {
cityid: ids
}
if (value == 'btn btn-outline-success waves-effect waves-themed ml-2') { //選擇
document.getElementById(clickid).setAttribute("class", 'btn btn-success waves-effect waves-themed ml-2');
ids.push(classid[1]);
}
else { //取消
document.getElementById(clickid).setAttribute("class", 'btn btn-outline-success waves-effect waves-themed ml-2');
ids.remove(classid[1]);
}
ids.sort();
var Nurl = "/PowerStation/GetSolarByCity";
$.post(Nurl, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
$('#CheckPowerStation').empty();
Allpowerids = [];
$.each(rel.data, function (index, val) {
if (powerids.includes(String(val.id))) {
$('#CheckPowerStation').append("<div class='col-2 mb-2 custom-control custom-checkbox custom-control-inline' id='station_" + val.id + "' > ");
$('#station_' + val.id).append("<input type='checkbox' class='custom-control-input' id='check_" + val.id + "' checked>");
$('#station_' + val.id).append("<label class='custom-control-label' for='check_" + val.id + "'>" + val.name + "</label>");
Newpowerids.push(String(val.id));
}
else {
$('#CheckPowerStation').append("<div class='col-2 mb-2 custom-control custom-checkbox custom-control-inline' id='station_" + val.id + "' > ");
$('#station_' + val.id).append("<input type='checkbox' class='custom-control-input' id='check_" + val.id + "'>");
$('#station_' + val.id).append("<label class='custom-control-label' for='check_" + val.id + "'>" + val.name + "</label>");
}
Allpowerids.push(String(val.id));
});
powerids = [];
powerids = Newpowerids;
})
GetStationsCard();
})
//#endregion
//#region 更換搜尋條件(日,日區間,月,年) //#region 更換搜尋條件(日,日區間,月,年)
function changeType(type, e) { function changeType(type, e) {
searchType = type; searchType = type;
@ -461,10 +339,8 @@
//#endregion //#endregion
//#region 快速填入條件(EX.今昨天) //#region 快速填入條件(EX.今昨天)
function quickSearch(day) function quickSearch(day) {
{ switch (searchType) {
switch (searchType)
{
case 0: case 0:
if (day == 0) { if (day == 0) {
var today = new Date().toISOString().substring(0, 10); var today = new Date().toISOString().substring(0, 10);
@ -534,8 +410,7 @@
//#endregion //#endregion
//#region 5張卡片值 //#region 5張卡片值
function GetStationsCard() function GetStationsCard() {
{
var send_data = { var send_data = {
stationIds: powerids, stationIds: powerids,
timerange: timerange, timerange: timerange,
@ -567,8 +442,7 @@
//#endregion //#endregion
//#region 圖片輪播 //#region 圖片輪播
function photoshow() function photoshow() {
{
var url_image = "/PowerStation/GetAllPowerStationsALLImage"; var url_image = "/PowerStation/GetAllPowerStationsALLImage";
var send_data = { var send_data = {
powerStationId: powerids powerStationId: powerids
@ -612,6 +486,7 @@
} }
var listmonth = new Array(0); var listmonth = new Array(0);
var listirradiance = new Array(0); var listirradiance = new Array(0);
var listtemperature = new Array(0);
var listkwh = new Array(0); var listkwh = new Array(0);
var Nurl = "/AnalysisStationCombine/GetChart"; var Nurl = "/AnalysisStationCombine/GetChart";
@ -622,8 +497,9 @@
} }
$.each(rel.data, function (index, val) { $.each(rel.data, function (index, val) {
listmonth.push(val.time); listmonth.push(val.time);
listirradiance.push(val.irradiance); listirradiance.push(val.irradiance.toFixed(2));
listkwh.push(val.kwh); listkwh.push(val.kwh.toFixed(2));
listtemperature.push(val.temperature.toFixed(2));
}) })
$('#station-convas-div').empty(); $('#station-convas-div').empty();
$('#station-convas-div').append('<canvas id="station-convas"></canvas>'); $('#station-convas-div').append('<canvas id="station-convas"></canvas>');
@ -634,6 +510,16 @@
data: { data: {
labels: listmonth, labels: listmonth,
datasets: [{ datasets: [{
type: 'line',
label: '模組溫度(℃)',
borderColor: 'rgb(255, 192, 0)',
pointBackgroundColor: 'rgb(255, 192, 0)',
pointBorderColor: 'rgb(255, 192, 0)',
pointRadius: 4,
yAxisID: 'C',
fill: false,
data: listtemperature
},{
type: 'line', type: 'line',
label: '日照度(kWh/㎡)', label: '日照度(kWh/㎡)',
borderColor: 'rgb(190, 45, 45)', borderColor: 'rgb(190, 45, 45)',
@ -684,6 +570,17 @@
display: true, display: true,
labelString: 'kWh/㎡' labelString: 'kWh/㎡'
} }
}, {
id: 'C',
type: 'linear',
position: 'right',
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: '℃'
}
}] }]
} }
} }
@ -693,5 +590,109 @@
} }
//#endregion //#endregion
//#region 左邊的搜索欄位
function myfunc(div) {
var className = div.getAttribute("class");
if (className == "fal fa-angle-left fa-lg py-3") {
div.className = "fal fa-angle-right fa-lg py-3";
}
else {
div.className = "fal fa-angle-left fa-lg py-3";
}
}
$("#js_list_accordion_filter").change(function (e) {
GetPowerStationCollapse($(this).val());
});
$('#js_list_accordion').on("change", 'input[name="selectedPowerStationLayer2[]"]', function (event) {
if (this.checked) {
powerids.push(this.value);
} else {
powerids.splice($.inArray(this.value, powerids), 1);
}
GetStationsCard();//5張卡片值
photoshow();//輪播圖片
});
function GetPowerStationCollapse(filter) {
var url = "/StationReport/GetPowerStationNameList"
var send_data = {
Filter: filter
}
$.post(url, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
var powerStationCollapse = rel.data;
$('#js_list_accordion').empty();
var xxx = Object.keys(powerStationCollapse).length
if (Object.keys(powerStationCollapse).length <= 0) {
$('#js_list_accordion').append("<div>查無結果</div>");
}
var str = "";
Object.keys(powerStationCollapse).map(function (key, index) {
str += '<div class="card border-top-left-radius-0 border-top-right-radius-0" id="templateCard">' +
'<div class="card-header">' +
'<a href="javascript:void(0);" class="card-title collapsed" data-toggle="collapse" data-target="#js_list_accordion-' + index + '" aria-expanded="false" data-filter-tags="settings">' +
'<i class="fal fa-globe width-2 fs-xl"></i>' +
'<span class="city-name">' + key + '</span>' +
'<span class="ml-auto">' +
'<span class="collapsed-reveal"><i class="fal fa-chevron-up fs-xl"></i></span>' +
'<span class="collapsed-hidden"><i class="fal fa-chevron-down fs-xl"></i></span>' +
'</span>' +
'</a>' +
'</div>' +
'<div id="js_list_accordion-' + index + '" class="collapse" data-parent="#js_list_accordion-' + index + '" style="">' +
'<div class="card-body">' +
'<ul class="list-group list-group-flush">';
$.each(powerStationCollapse[key], function (index, powerStation) {
str += '<li class="list-group-item">' +
'<div class="d-flex justify-content-between">' +
'<h4 class="font-weight-bold"><i class="fal fa-charging-station"></i> ' + powerStation.powerStationName + '</h4>' +
'<div class="">' +
'<input type="checkbox" class="" name="selectedPowerStationLayer2[]" value="' + powerStation.powerStationId + '" valueName ="' + powerStation.powerStationName + '">' +
'</div>' +
'</div>' +
'</li>';
});
str += '</ul>';
str += '</div>';
str += '</div>';
});
$('#js_list_accordion').append(str);
$('#js_list_accordion').find('.card').first().addClass(" border-top-left-radius-0 border-top-right-radius-0");
if (powerids.length <= 0) {
$('input[name="selectedPowerStationLayer2[]"]').trigger("click");
}
$('input[name="selectedPowerStationLayer2[]"]').each(function () {
if ($.inArray(this.value, powerids) > -1) {
$(this).prop('checked', true);
}
});
$("#js_list_accordion .collapse").collapse('show');
}, 'json');
}
//#endregion
</script> </script>
} }

View File

@ -967,7 +967,22 @@
$("#power_station_operation_personnel").select2(); $("#power_station_operation_personnel").select2();
var ps_company_text = $("#select_power_station_company").find(':selected').text();
@if (ViewBag.myUser.Role.Layer == (int)RoleLayerEnum.PlatformAdmin || ViewBag.myUser.Role.Layer == (int)RoleLayerEnum.PlatformUser)
{
<text>
Swal.fire(
{
title: "",
text: "你確定是否要將該電站加入至【" + ps_company_text + "】?",
type: "question",
icon: 'question',
showCancelButton: true,
confirmButtonText: "是",
cancelButtonText: "否"
}).then(function (result) {
if (result.value) {
var url = "/PowerStation/SavePowerStationInfo"; var url = "/PowerStation/SavePowerStationInfo";
var send_data = { var send_data = {
@ -1016,6 +1031,64 @@
} }
}, 'json'); }, 'json');
} }
});
</text>
}
else
{
<text>
var url = "/PowerStation/SavePowerStationInfo";
var send_data = {
Id: stationId,
CityId: $("#select_city").val(),
AreaId: $("#select_area").val(),
Address: $("#address_detail").val(),
Name: $("#power_station_name").val(),
IsEscrow: $('#check_escrow').is(':checked') ? 1 : 0,
ElectricityMeterAt: $("#electricity_meter_at").val(),
EstimatedRecoveryTime: $("#estimated_recovery_time").val(),
GeneratingCapacity: $("#generating_capacity").val(),
EscrowName: $('#check_escrow').is(':checked') ? $("#escrow_name").val() : "",
PowerRate: $("#power_rate").val(),
Coordinate: $("#coordinate").val(),
OperationPersonnelIds: $("#power_station_operation_personnel").val(),
InverterBrand: $("#inverter_brand").val(),
InverterProductModel: $("#inverter_product_model").val(),
InverterAmount: $("#inverter_amount").val(),
PhotovoltaicPanelBrand: $("#photovoltaic_panel_brand").val(),
PhotovoltaicPanelSpecification: $("#photovoltaic_panel_specification").val(),
PhotovoltaicPanelAmount: $("#photovoltaic_panel_amount").val(),
PhotovoltaicPanelProductModel: $("#photovoltaic_panel_product_model").val(),
SolarType: $("#select_solar_tpye").val(),
line_token: $("#line_token").val(),
Estimate_kwh: $("#estimate_kwh").val(),
EstimateEfficacy: $("#estimate_efficacy").val(),
CompanyId: $("#select_power_station_company").val(),
}
$.post(url, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
toast_ok(rel.msg);
if (stationId == "new") {
window.location = "/PowerStation/Edit?stationId=" + rel.data.id
} else {
//回填資料
powerStationData = rel.data;
SetStationInfo();
ChangeMode("station_info", "view");
}
}, 'json');
</text>
}
}
//#endregion //#endregion
//#region 儲存能源局台電資料資訊 //#region 儲存能源局台電資料資訊

View File

@ -1252,8 +1252,8 @@
</div> </div>
<!--Base JS--> <!--Base JS-->
<script src="~/js/vendors.bundle.js"></script> <script src="~/js/vendors.bundle.js" asp-append-version="true"></script>
<script src="~/js/app.bundle.js"></script> <script src="~/js/app.bundle.js" asp-append-version="true"></script>
<!-- JQuery Validate --> <!-- JQuery Validate -->
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script> <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation/dist/localization/messages_zh_TW.js"></script> <script src="~/lib/jquery-validation/dist/localization/messages_zh_TW.js"></script>

View File

@ -398,6 +398,7 @@
default: default:
console.log(`Sorry, we are out of ${val.solarType}.`); console.log(`Sorry, we are out of ${val.solarType}.`);
} }
$('#card_' + val.id).find('#editSolarUrl').find('#Solarimg').attr('src', val.mainDisplay);
$('#card_' + val.id).find('#stationtype').html(type); $('#card_' + val.id).find('#stationtype').html(type);
var time = new Date(val.createdAt); var time = new Date(val.createdAt);
$('#card_' + val.id).find('#editSolarUrl').attr('href', localurl + '/Info?stationId=' + val.id); $('#card_' + val.id).find('#editSolarUrl').attr('href', localurl + '/Info?stationId=' + val.id);

View File

@ -303,7 +303,7 @@
label: '輸出功率', label: '輸出功率',
yAxisID: 'A', yAxisID: 'A',
backgroundColor: 'rgb(103, 180, 172)', backgroundColor: 'rgb(103, 180, 172)',
order: 2, order: 3,
data: chartToday.powerDatas data: chartToday.powerDatas
}, { }, {
type: 'line', type: 'line',
@ -317,8 +317,22 @@
pointRadius: 4, pointRadius: 4,
pointHoverRadius: 5, pointHoverRadius: 5,
fill: false, fill: false,
order: 1, order: 2,
data: chartToday.irradianceDatas, data: chartToday.irradianceDatas,
}, {
type: 'line',
label: '模組溫度',
yAxisID: 'C',
borderColor: 'rgb(255, 192, 0)',
pointBackgroundColor: 'rgb(255, 192, 0)',
pointBorderColor: 'rgb(255, 192, 0)',
pointBorderWidth: 1,
borderWidth: 2,
pointRadius: 4,
pointHoverRadius: 5,
fill: false,
order: 1,
data: chartToday.temperatureDatas,
}] }]
}, },
options: { options: {
@ -353,6 +367,17 @@
display: true, display: true,
labelString: 'W/㎡' labelString: 'W/㎡'
} }
}, {
id: 'C',
type: 'linear',
position: 'right',
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: '℃'
}
}] }]
} }
} }
@ -370,7 +395,7 @@
label: '輸出功率', label: '輸出功率',
yAxisID: 'A', yAxisID: 'A',
backgroundColor: 'rgb(103, 180, 172)', backgroundColor: 'rgb(103, 180, 172)',
order: 2, order: 3,
data: chart7day.powerDatas data: chart7day.powerDatas
}, { }, {
type: 'line', type: 'line',
@ -383,9 +408,23 @@
borderWidth: 2, borderWidth: 2,
pointRadius: 4, pointRadius: 4,
pointHoverRadius: 5, pointHoverRadius: 5,
order: 1, order: 2,
fill: false, fill: false,
data: chart7day.irradianceDatas, data: chart7day.irradianceDatas,
}, {
type: 'line',
label: '模組溫度',
yAxisID: 'C',
borderColor: 'rgb(255, 192, 0)',
pointBackgroundColor: 'rgb(255, 192, 0)',
pointBorderColor: 'rgb(255, 192, 0)',
pointBorderWidth: 1,
borderWidth: 2,
pointRadius: 4,
pointHoverRadius: 5,
fill: false,
order: 1,
data: chart7day.temperatureDatas,
}] }]
}, },
options: { options: {
@ -420,6 +459,17 @@
display: true, display: true,
labelString: 'W/㎡' labelString: 'W/㎡'
} }
}, {
id: 'C',
type: 'linear',
position: 'right',
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: '℃'
}
}] }]
} }
} }
@ -437,7 +487,7 @@
label: '輸出功率', label: '輸出功率',
yAxisID: 'A', yAxisID: 'A',
backgroundColor: 'rgb(103, 180, 172)', backgroundColor: 'rgb(103, 180, 172)',
order: 2, order: 3,
data: chartMonth.powerDatas data: chartMonth.powerDatas
}, { }, {
type: 'line', type: 'line',
@ -450,9 +500,23 @@
borderWidth: 2, borderWidth: 2,
pointRadius: 4, pointRadius: 4,
pointHoverRadius: 5, pointHoverRadius: 5,
order: 1, order: 2,
fill: false, fill: false,
data: chartMonth.irradianceDatas, data: chartMonth.irradianceDatas,
}, {
type: 'line',
label: '模組溫度',
yAxisID: 'C',
borderColor: 'rgb(255, 192, 0)',
pointBackgroundColor: 'rgb(255, 192, 0)',
pointBorderColor: 'rgb(255, 192, 0)',
pointBorderWidth: 1,
borderWidth: 2,
pointRadius: 4,
pointHoverRadius: 5,
fill: false,
order: 1,
data: chartMonth.temperatureDatas,
}] }]
}, },
options: { options: {
@ -487,6 +551,17 @@
display: true, display: true,
labelString: 'W/㎡' labelString: 'W/㎡'
} }
}, {
id: 'C',
type: 'linear',
position: 'right',
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: '℃'
}
}] }]
} }
} }
@ -520,6 +595,20 @@
order: 1, order: 1,
fill: false, fill: false,
data: chartYear.irradianceDatas, data: chartYear.irradianceDatas,
}, {
type: 'line',
label: '模組溫度',
yAxisID: 'C',
borderColor: 'rgb(255, 192, 0)',
pointBackgroundColor: 'rgb(255, 192, 0)',
pointBorderColor: 'rgb(255, 192, 0)',
pointBorderWidth: 1,
borderWidth: 2,
pointRadius: 4,
pointHoverRadius: 5,
fill: false,
order: 1,
data: chartYear.temperatureDatas,
}] }]
}, },
options: { options: {
@ -554,6 +643,17 @@
display: true, display: true,
labelString: 'W/㎡' labelString: 'W/㎡'
} }
}, {
id: 'C',
type: 'linear',
position: 'right',
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: '℃'
}
}] }]
} }
} }
@ -2216,6 +2316,9 @@
var listcolor = new Array(0); var listcolor = new Array(0);
var listcolor2 = new Array(0); var listcolor2 = new Array(0);
var listirradiance = new Array(0); var listirradiance = new Array(0);
var listtemperature = new Array(0);
var listsolarhour = new Array(0);
var listpr = new Array(0);
var color = rgba(1); var color = rgba(1);
var color2 = rgba(2); var color2 = rgba(2);
$.each(rel.data, function (index, val) { $.each(rel.data, function (index, val) {
@ -2241,10 +2344,13 @@
'<td>' + val.temp.toFixed(2) + '</td>' + '<td>' + val.temp.toFixed(2) + '</td>' +
'</tr>'); '</tr>');
listmonth.push(val.timestamp); listmonth.push(val.timestamp);
listkwh.push(val.kwh); listkwh.push(val.kwh.toFixed(2));
listcolor.push(color); listcolor.push(color);
listcolor2.push(color2); listcolor2.push(color2);
listirradiance.push(val.irradiance); listirradiance.push(val.irradiance.toFixed(2));
listtemperature.push(val.temp.toFixed(2));
listsolarhour.push(val.solarhour.toFixed(2));
listpr.push(val.pr.toFixed(2));
} }
else else
{ {
@ -2259,10 +2365,13 @@
'<td>' + val.temp.toFixed(2) + '</td>' + '<td>' + val.temp.toFixed(2) + '</td>' +
'</tr>'); '</tr>');
listmonth.push(val.timestamp); listmonth.push(val.timestamp);
listkwh.push(val.kwh); listkwh.push(val.kwh.toFixed(2));
listcolor.push(color); listcolor.push(color);
listcolor2.push(color2); listcolor2.push(color2);
listirradiance.push(val.irradiance); listirradiance.push(val.irradiance.toFixed(2));
listtemperature.push(val.temp.toFixed(2));
listsolarhour.push(val.solarhour.toFixed(2));
listpr.push(val.pr.toFixed(2));
} }
@ -2280,12 +2389,57 @@
type: 'bar', type: 'bar',
data: { data: {
labels: listmonth, labels: listmonth,
datasets: [{ datasets: [
{
type: 'line',
label: '溫度(℃)',
yAxisID: 'E',
borderColor: 'rgb(255, 192, 0)',
pointBackgroundColor: 'rgb(255, 192, 0)',
pointBorderColor: 'rgb(255, 192, 0)',
pointBorderWidth: 1,
borderWidth: 2,
pointRadius: 4,
pointHoverRadius: 5,
fill: false,
data: listtemperature
},{
type: 'line',
label: 'PR(%)',
yAxisID: 'D',
borderColor: 'rgba(68, 114, 196)',
pointBackgroundColor: 'rgb(68, 114, 196)',
pointBorderColor: 'rgb(68, 114, 196)',
pointBorderWidth: 1,
borderWidth: 2,
pointRadius: 4,
pointHoverRadius: 5,
fill: false,
data: listpr
},{
type: 'line',
label: '發電小時',
yAxisID: 'C',
borderColor: 'rgba(165, 165, 165)',
pointBackgroundColor: 'rgb(165, 165, 165)',
pointBorderColor: 'rgb(165, 165, 165)',
pointBorderWidth: 1,
borderWidth: 2,
pointRadius: 4,
pointHoverRadius: 5,
fill: false,
data: listsolarhour
},{
type: 'line', type: 'line',
label: '日照度(kWh/㎡)', label: '日照度(kWh/㎡)',
borderColor: 'rgba(190, 45, 45,1)',
pointRadius: 4,
yAxisID: 'B', yAxisID: 'B',
borderColor: 'rgba(190, 45, 45,1)',
pointBackgroundColor: 'rgb(190, 45, 45,1)',
pointBorderColor: 'rgb(190, 45, 45,1)',
pointBorderWidth: 1,
borderWidth: 2,
pointRadius: 4,
pointHoverRadius: 5,
fill: false, fill: false,
data: listirradiance data: listirradiance
}, { }, {
@ -2329,6 +2483,39 @@
display: true, display: true,
labelString: 'kWh/㎡' labelString: 'kWh/㎡'
} }
}, {
id: 'C',
type: 'linear',
position: 'right',
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: 'hr'
}
}, {
id: 'D',
type: 'linear',
position: 'right',
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: 'PR(%)'
}
}, {
id: 'E',
type: 'linear',
position: 'right',
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: '℃'
}
}] }]
} }
} }

View File

@ -557,7 +557,7 @@
$.post(url, send_data, function (rel) { $.post(url, send_data, function (rel) {
if (rel.code != "0000") { if (rel.code != "0000") {
toast_error(rel.data.msg); toast_error(rel.msg);
return; return;
} }

View File

@ -7,26 +7,26 @@
} }
}, },
"LoginExpireMinute": 60, //() "LoginExpireMinute": 60, //()
//"DBConfig": {
// "Server": "MVgHWzR3rGDgD57TUoFunA==",
// "port": "r4AoXMUDodcQjIzofGNCcg==",
// "Database": "z8TVtiXZ6MwgWbUEAOXA/fiHzd7c0iUhFqn1mHzxhKo=",
// "Root": "mWlR2HshQNhRRE34jg4kdg==",
// "Password": "y4uPqlH9ncTgR/I07qpwaA=="
//},
"DBConfig": { "DBConfig": {
"Server": "AVXfxd+IRlLtJ0MCi9HU1g==", "Server": "MVgHWzR3rGDgD57TUoFunA==",
"port": "CrEmevYrUsSo7Mkb7Gxn8A==", "port": "r4AoXMUDodcQjIzofGNCcg==",
"Database": "CEyYZnO8B5+yTXQcFSsiBA==", "Database": "z8TVtiXZ6MwgWbUEAOXA/fiHzd7c0iUhFqn1mHzxhKo=",
"Root": "Aph7AzoiwAmmBHCfS1rqeQ==", "Root": "mWlR2HshQNhRRE34jg4kdg==",
"Password": "8WMHBEWuT0XoAB4kzduQHA==" "Password": "y4uPqlH9ncTgR/I07qpwaA=="
}, },
//"DBConfig": {
// "Server": "AVXfxd+IRlLtJ0MCi9HU1g==",
// "port": "CrEmevYrUsSo7Mkb7Gxn8A==",
// "Database": "CEyYZnO8B5+yTXQcFSsiBA==",
// "Root": "Aph7AzoiwAmmBHCfS1rqeQ==",
// "Password": "8WMHBEWuT0XoAB4kzduQHA=="
//},
"BackgroundServiceCron": { "BackgroundServiceCron": {
"CalcPowerStationJob": "0 5 * * * ?", "CalcPowerStationJob": "0 5 * * * ?",
"CalcAvgPowerStationJob": "0 0 2 * * ?", "CalcAvgPowerStationJob": "0 0 2 * * ?",
"OperationScheduleJob": "0 0 2 * * ?", "OperationScheduleJob": "0 0 2 * * ?",
"CalcInverter15minJob": "0 2/15 * * * ?", "CalcInverter15minJob": "0 2/15 * * * ?",
"SendEmailJob": "0/10 * * * * ?" "SendEmailJob": "0 15 2 * * ?"
}, },
"SMTPConfig": { "SMTPConfig": {
"Host": "smtp.gmail.com", "Host": "smtp.gmail.com",

View File

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB