diff --git a/SolarPower/Controllers/ExceptionRecordController.cs b/SolarPower/Controllers/ExceptionRecordController.cs new file mode 100644 index 0000000..34fc682 --- /dev/null +++ b/SolarPower/Controllers/ExceptionRecordController.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SolarPower.Controllers +{ + public class ExceptionRecordController : MyBaseController + { + public IActionResult Index() + { + return View(); + } + } +} diff --git a/SolarPower/Controllers/StationOverviewController.cs b/SolarPower/Controllers/StationOverviewController.cs index f95e50b..252a5ed 100644 --- a/SolarPower/Controllers/StationOverviewController.cs +++ b/SolarPower/Controllers/StationOverviewController.cs @@ -405,6 +405,51 @@ namespace SolarPower.Controllers return result; } + public async Task GetExceptionTable2(ExceptionSent2 post) + { + List exceptionDataTable = new List(); + ApiResult> apiResult = new ApiResult>(); + + //PowerStation powerStation = null; + + try + { + //powerStation = await powerStationRepository.GetOneAsync(post.Id); + exceptionDataTable = await overviewRepository.GetExceptionTable2(post); + + foreach (ExceptionDataTable a in exceptionDataTable) + { + if (string.IsNullOrEmpty(a.FormId)) + { + if (a.Err_status == 1) + { + a.Function = @$"填寫表單"; + } + } + else + { + a.Function = @$"{a.FormId}"; + } + } + + apiResult.Code = "0000"; + apiResult.Data = exceptionDataTable; + } + catch (Exception exception) + { + apiResult.Code = "9999"; + apiResult.Msg = errorCode.GetString(apiResult.Code); + Logger.LogError("【" + controllerName + "/" + actionName + "】"); + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + } + var result = Json(new + { + data = apiResult + }); + + return result; + } + public async Task> GetInverterkwhBarAnalysis(PostInverterkwhBarAnalysis post) { ApiResult apiResult = new ApiResult(); diff --git a/SolarPower/Controllers/StationReportController.cs b/SolarPower/Controllers/StationReportController.cs new file mode 100644 index 0000000..16724b3 --- /dev/null +++ b/SolarPower/Controllers/StationReportController.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SolarPower.Controllers +{ + public class StationReportController : MyBaseController + { + public IActionResult Index() + { + return View(); + } + } +} diff --git a/SolarPower/DBSchema/solar_power_schema.sql b/SolarPower/DBSchema/solar_power_schema.sql index 372db9f..8481455 100644 --- a/SolarPower/DBSchema/solar_power_schema.sql +++ b/SolarPower/DBSchema/solar_power_schema.sql @@ -1971,6 +1971,11 @@ ALTER TABLE `power_station` ADD COLUMN `Estimate_kwh` DECIMAL(10,2) NULL DEFAULT '0.00' COMMENT '預估發電度數' AFTER `line_token`, ADD COLUMN `EstimateEfficacy` DECIMAL(10,2) NULL DEFAULT '0.00' COMMENT '預估發電效能' AFTER `Estimate_kwh`; +-- 判定是否有建立發送email資料 20210722 +ALTER TABLE `operation_plan_create` + ADD COLUMN `IsDelivery` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否建立 發送Email資料 0:否 1:是' AFTER `LastCreateTime`; + + /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; diff --git a/SolarPower/Models/ExceptionRecord.cs b/SolarPower/Models/ExceptionRecord.cs new file mode 100644 index 0000000..784e4db --- /dev/null +++ b/SolarPower/Models/ExceptionRecord.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SolarPower.Models +{ + public class ExceptionRecord + { + public string asd { get; set; } + } +} diff --git a/SolarPower/Models/Operation.cs b/SolarPower/Models/Operation.cs index 6d44b76..76dfc0c 100644 --- a/SolarPower/Models/Operation.cs +++ b/SolarPower/Models/Operation.cs @@ -55,6 +55,7 @@ namespace SolarPower.Models public int ScheduleNum { get; set; } public int ScheduleType { get; set; } public int WorkDay { get; set; } + public int IsDelivery { get; set; } public string StartTime { get diff --git a/SolarPower/Models/Overview.cs b/SolarPower/Models/Overview.cs index 29616cb..da8af3b 100644 --- a/SolarPower/Models/Overview.cs +++ b/SolarPower/Models/Overview.cs @@ -93,6 +93,15 @@ namespace SolarPower.Models public string StartTime { get; set; } //起始日期 public string EndTime { get; set; } //結束日期 } + public class ExceptionSent2 + { + public List Id { get; set; } + public int Status { get; set; } + public string Range { get; set; } + public string StartTime { get; set; } //起始日期 + public string EndTime { get; set; } //結束日期 + } + public class ExceptionInfo { public int Id { get; set; } @@ -110,6 +119,7 @@ namespace SolarPower.Models public string PowerStationName { get; set; } public int ErrorID { get; set; } public string FormId { get; set; } + public int PowerStationId { get; set; } } public class PostInverterHeatMapAnalysis diff --git a/SolarPower/Quartz/Jobs/OperationScheduleJob.cs b/SolarPower/Quartz/Jobs/OperationScheduleJob.cs index 3c5e90d..8755779 100644 --- a/SolarPower/Quartz/Jobs/OperationScheduleJob.cs +++ b/SolarPower/Quartz/Jobs/OperationScheduleJob.cs @@ -29,38 +29,24 @@ namespace SolarPower.Quartz.Jobs var getTime = await operationRepository.GetOperationSchedules(); foreach (var a in getTime) { - DateTime Updatedtime; + //最後製作紀錄時間 var useday = a.LastCreateTime; - if(a.LastCreateTime == "0001-01-01 00:00:00") + if (a.LastCreateTime == "0001-01-01 00:00:00") { useday = a.StartTime; } - - if (a.ScheduleType == 0)//日 + #region 產生紀錄 + DateTime Updatedtime;//下次生成紀錄時間 + Updatedtime = a.ScheduleType switch { - Updatedtime = Convert.ToDateTime(useday).AddDays(a.ScheduleNum); - } - else if (a.ScheduleType == 1)//周 - { - Updatedtime = Convert.ToDateTime(useday).AddDays(a.ScheduleNum * 7); - } - else if (a.ScheduleType == 2)//月 - { - Updatedtime = Convert.ToDateTime(useday).AddMonths(a.ScheduleNum); - } - else if (a.ScheduleType == 3)//季 - { - Updatedtime = Convert.ToDateTime(useday).AddMonths(a.ScheduleNum * 3); - } - else // 年 - { - Updatedtime = Convert.ToDateTime(useday).AddYears(a.ScheduleNum); - } - - - - + 0 => Convert.ToDateTime(useday).AddDays(a.ScheduleNum), + 1 => Convert.ToDateTime(useday).AddDays(a.ScheduleNum * 7), + 2 => Convert.ToDateTime(useday).AddMonths(a.ScheduleNum), + 3 => Convert.ToDateTime(useday).AddMonths(a.ScheduleNum * 3), + 4 => Convert.ToDateTime(useday).AddYears(a.ScheduleNum), + _ => Convert.ToDateTime(useday).AddYears(999) + }; if (Updatedtime < DateTime.Now) { @@ -77,7 +63,8 @@ namespace SolarPower.Quartz.Jobs PowerStationId = a.PowerStationId, Type = a.Type, UpdatedBy = a.UpdatedBy, - LastCreateTime = Updatedtime.ToString("yyyy-MM-dd") + LastCreateTime = Updatedtime.ToString("yyyy-MM-dd"), + IsDelivery = 0 }; List properties = new List() { @@ -91,7 +78,8 @@ namespace SolarPower.Quartz.Jobs "PowerStationId", "Type", "UpdatedBy", - "LastCreateTime" + "LastCreateTime", + "IsDelivery" }; await operationRepository.UpdateOperationPlan(OperationPlan, properties); @@ -128,8 +116,65 @@ namespace SolarPower.Quartz.Jobs "EndTime" }; + await operationRepository.AddToRecord(record, properties2); + } + #endregion + + + + + #region 發送Email + DateTime EmailNoticeDay; + string noticeName; + EmailNoticeDay = a.EmailType switch + { + 0 => Updatedtime, + 1 => Updatedtime.AddDays(-1), + 2 => Updatedtime.AddDays(-2), + 3 => Updatedtime.AddDays(-3), + _ => Updatedtime.AddYears(999) + }; + noticeName = a.EmailType switch + { + 0 => "此紀錄於當天建立", + 1 => "此紀錄於一天後建立", + 2 => "此紀錄於兩天後建立", + 3 => "此紀錄於三天後建立", + _ => "此紀錄不建立" + }; + string WorkType = a.Type switch + { + 0 => "清洗", + 1 => "巡檢", + _ => "維修" + }; + if(EmailNoticeDay < DateTime.Now && a.IsDelivery == 0) + { + //Get所有運維人員 + var personal = await operationRepository.GetOperationPersonnel(a.PowerStationId); + var Title = $@"編號:{a.PlanId} - {WorkType}單 - 作業紀錄建立通知"; + var content = $@" {noticeName} {Environment.NewLine} 內容描述:{a.Description}"; + await operationRepository.InsertNoticeSchedule(personal, Title, content); + + var OperationPlans = new OperationCreatePlan() + { + Id = a.Id, + IsDelivery = 1 + }; + List propertiess = new List() + { + "Id", + "IsDelivery" + }; + await operationRepository.UpdateOperationPlan(OperationPlans, propertiess); + } + + + #endregion + + } } catch (Exception exception) diff --git a/SolarPower/Repository/Implement/ExceptionRecordRepository.cs b/SolarPower/Repository/Implement/ExceptionRecordRepository.cs new file mode 100644 index 0000000..54fe895 --- /dev/null +++ b/SolarPower/Repository/Implement/ExceptionRecordRepository.cs @@ -0,0 +1,18 @@ +using SolarPower.Helper; +using SolarPower.Models; +using SolarPower.Repository.Interface; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SolarPower.Repository.Implement +{ + public class ExceptionRecordRepository : RepositoryBase, IExceptionRecordRepository + { + public ExceptionRecordRepository(IDatabaseHelper databaseHelper) : base(databaseHelper) + { + tableName = "power_station"; + } + } +} diff --git a/SolarPower/Repository/Implement/OperationRepository.cs b/SolarPower/Repository/Implement/OperationRepository.cs index 0004af0..907506f 100644 --- a/SolarPower/Repository/Implement/OperationRepository.cs +++ b/SolarPower/Repository/Implement/OperationRepository.cs @@ -541,5 +541,59 @@ namespace SolarPower.Repository.Implement return result; } } + + + public async Task> GetOperationPersonnel(int PowerStationId) + { + List result; + using (IDbConnection conn = this._databaseHelper.GetConnection()) + { + try + { + var sql = @$"SELECT us.* FROM power_station_operation_personnel ps LEFT JOIN user us ON ps.UserId = us.Id WHERE PowerStationId = {PowerStationId}"; + result = (await conn.QueryAsync(sql)).ToList(); + } + catch (Exception exception) + { + throw exception; + } + return result; + } + } + + public async Task InsertNoticeSchedule(List personal, string Title, string content) + { + using (IDbConnection conn = this._databaseHelper.GetConnection()) + { + conn.Open(); + using (var trans = conn.BeginTransaction()) + { + try + { + List value = new List() ; + foreach (MyUser a in personal) + { + value.Add($@"(1,'{a.Name}','{a.Email}','{Title}','{content}')"); + } + string values = string.Join(",", value.ToArray()); + + var sql = $"INSERT INTO `notice_schedule` (`Type`, `RecipientName`, `RecipientEmail`, `Subject`, `Content`) VALUES {values};"; + + await conn.ExecuteAsync(sql,trans); + + trans.Commit(); + } + catch (Exception exception) + { + trans.Rollback(); + throw exception; + } + finally + { + conn.Close(); + } + } + } + } } } diff --git a/SolarPower/Repository/Implement/OverviewRepository.cs b/SolarPower/Repository/Implement/OverviewRepository.cs index c08a9e9..a8dc432 100644 --- a/SolarPower/Repository/Implement/OverviewRepository.cs +++ b/SolarPower/Repository/Implement/OverviewRepository.cs @@ -382,6 +382,58 @@ namespace SolarPower.Repository.Implement } } + public async Task> GetExceptionTable2(ExceptionSent2 post) + { + + + List result; + using (IDbConnection conn = this._databaseHelper.GetConnection()) + { + try + { + DateTime start; + DateTime end; + var sql = @$"select pr.FormId as FormId, pr.Id as ErrorID, a.id, site_id, `timestamp`, FROM_UNIXTIME((`timestamp` / 1000), '%Y-%m-%d %H:%i:%s') dev_time , a.sourceState err_status, FROM_UNIXTIME( (a.normalTime / 1000), '%Y-%m-%d %H:%i:%s') normalTime, + a.alarmClass, b.alarmClass as alarmClassName,ps.Name as PowerStationName,ps.Id as PowerStationId, + errDevice, err_valueKind, errValue, FROM_UNIXTIME( (a.lastUpdate / 1000), '%Y-%m-%d %H:%i:%s') lastUpdate, + case when c.errMsg_tw is null then d.errMsg_tw else c.errMsg_tw end errMsg + from err_main a + join alarmorion_orionalarmclass b on a.alarmclass = b.id + left join ref_err_device c on trim(b.alarmClass) = c.deviceType + left join ref_err_inv d on lower(b.alarmClass) = d.deviceType + and case when lower(b.alarmClass) = 'inverter' and err_valuekind = 'e' then errvalue else '' end = d.errCode + left join power_station ps on ps.Code = site_id + left join operation_record pr on pr.ErrorCode = a.id + WHERE a.sourceState = @Status AND ps.Id IN @PowerStationId"; + + + if (!string.IsNullOrEmpty(post.Range)) + { + post.StartTime = post.Range.Split('-')[0]; + post.EndTime = post.Range.Split('-')[1]; + start = Convert.ToDateTime(post.StartTime); + end = Convert.ToDateTime(post.EndTime); + var startime = (Int64)(start.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; + var endtime = (Int64)(end.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; + sql += @$" AND `timestamp` BETWEEN {startime * 1000} AND {endtime * 1000}"; + } + + result = (await conn.QueryAsync(sql, + new + { + PowerStationId = post.Id, + Status = post.Status, + })).ToList(); + } + catch (Exception exception) + { + throw exception; + } + return result; + } + } + + public async Task> GetListInverterDayByPowerStationId(int powerStationId, string day) { List result; diff --git a/SolarPower/Repository/Interface/IExceptionRecordRepository.cs b/SolarPower/Repository/Interface/IExceptionRecordRepository.cs new file mode 100644 index 0000000..add4ae8 --- /dev/null +++ b/SolarPower/Repository/Interface/IExceptionRecordRepository.cs @@ -0,0 +1,12 @@ +using SolarPower.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SolarPower.Repository.Interface +{ + public interface IExceptionRecordRepository : IRepositoryBase + { + } +} diff --git a/SolarPower/Repository/Interface/IOperationRepository.cs b/SolarPower/Repository/Interface/IOperationRepository.cs index 3abeed0..4f8e253 100644 --- a/SolarPower/Repository/Interface/IOperationRepository.cs +++ b/SolarPower/Repository/Interface/IOperationRepository.cs @@ -71,6 +71,10 @@ namespace SolarPower.Repository.Interface Task DeleteOneOperationRecodeFile(int id); Task> GetOperationSchedules(); + + Task> GetOperationPersonnel(int PowerStationId); + + Task InsertNoticeSchedule(List personal, string Title, string content); } } diff --git a/SolarPower/Repository/Interface/IOverviewRepository.cs b/SolarPower/Repository/Interface/IOverviewRepository.cs index b8bd902..d599b6c 100644 --- a/SolarPower/Repository/Interface/IOverviewRepository.cs +++ b/SolarPower/Repository/Interface/IOverviewRepository.cs @@ -29,5 +29,6 @@ namespace SolarPower.Repository.Interface Task> GetListInverterQuaryerlyByPowerStationId(int powerStationId, string startMonth, string endMonth); Task> GetListInverterYearByPowerStationId(int powerStationId, string year); Task> GethistoryTable(HistorySent post); + Task> GetExceptionTable2(ExceptionSent2 post); } } diff --git a/SolarPower/Startup.cs b/SolarPower/Startup.cs index e13a2e9..5eb163f 100644 --- a/SolarPower/Startup.cs +++ b/SolarPower/Startup.cs @@ -77,6 +77,7 @@ namespace SolarPower services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); #endregion double loginExpireMinute = this.Configuration.GetValue("LoginExpireMinute"); diff --git a/SolarPower/Views/AnalysisStationInfo/Index.cshtml b/SolarPower/Views/AnalysisStationInfo/Index.cshtml index 7a827ea..0c24e7d 100644 --- a/SolarPower/Views/AnalysisStationInfo/Index.cshtml +++ b/SolarPower/Views/AnalysisStationInfo/Index.cshtml @@ -4,4 +4,86 @@ ViewData["Title"] = "電站交叉分析"; } @using SolarPower.Models.Role -@model RoleLayerEnum \ No newline at end of file +@model RoleLayerEnum + + +
+

+ 電站交叉分析 +

+
+ + +
+
+
+
+
+
+
+
+ + + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+ +
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ +
+ +
+

放圖表

+
+
+
+
+
+
+
\ No newline at end of file diff --git a/SolarPower/Views/ExceptionRecord/Index.cshtml b/SolarPower/Views/ExceptionRecord/Index.cshtml new file mode 100644 index 0000000..de9b70f --- /dev/null +++ b/SolarPower/Views/ExceptionRecord/Index.cshtml @@ -0,0 +1,799 @@ +@{ + ViewData["MainNum"] = "5"; + ViewData["SubNum"] = "1"; + ViewData["Title"] = "異常記錄查詢"; +} +@using SolarPower.Models.Role +@model RoleLayerEnum + + + +
+
+
+
+
+
+

+ 即時告警管理 +

+
+
+
+
+
+
+ + +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + +
電站名稱異常ID號發生時間復歸時間異常類別設備編號異常訊息派工/維運單
+
+
+
+
+
+
+
+
+
+ + + + + +@section Scripts{ + +} \ No newline at end of file diff --git a/SolarPower/Views/ExceptionRecord/_ExceptionRecord.cshtml b/SolarPower/Views/ExceptionRecord/_ExceptionRecord.cshtml new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/SolarPower/Views/ExceptionRecord/_ExceptionRecord.cshtml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SolarPower/Views/ExceptionRecord/_NoticeSetting.cshtml b/SolarPower/Views/ExceptionRecord/_NoticeSetting.cshtml new file mode 100644 index 0000000..d6ac8ff --- /dev/null +++ b/SolarPower/Views/ExceptionRecord/_NoticeSetting.cshtml @@ -0,0 +1,139 @@ +
+
+ +
+
+
+ + + + + +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
電站名稱通知對象逆變器異常網路異常設備斷線PR值異常異常等級派工/維運單
新竹巨城站鋼鐵人 + + + + + 修改 + +
新竹巨城站蜘蛛人 + + + + + 修改 + +
新竹交大站雷神索爾 + + + + + 修改 + +
+
+
+
\ No newline at end of file diff --git a/SolarPower/Views/Shared/_Layout.cshtml b/SolarPower/Views/Shared/_Layout.cshtml index 0fe8801..a39376c 100644 --- a/SolarPower/Views/Shared/_Layout.cshtml +++ b/SolarPower/Views/Shared/_Layout.cshtml @@ -261,8 +261,8 @@ 報表查詢
    -
  • - +
  • + 電站報表
  • @@ -288,8 +288,8 @@ 即時告警
      -
    • - +
    • + 即時告警管理
    • diff --git a/SolarPower/Views/StationOverview/StationOverviewInfo.cshtml b/SolarPower/Views/StationOverview/StationOverviewInfo.cshtml index 3d50c11..3848958 100644 --- a/SolarPower/Views/StationOverview/StationOverviewInfo.cshtml +++ b/SolarPower/Views/StationOverview/StationOverviewInfo.cshtml @@ -149,11 +149,11 @@ var recode; var selected_work_type = -1; var err_status = 1;//異常紀錄,1:未解決 0:已解決 - var err_status = 1;//異常紀錄,1:未解決 0:已解決 var groupType = 0; //0:日 1:月 2:年 3:歷年 var historyRange = ""; var selectInverterkwhBarType = 0; var HeapMapXAxis = []; + var countOperationRecodeFile = 0; $(function () { var url = new URL(location.href); @@ -2182,8 +2182,8 @@ if (val.length != 0) { - if (groupType != 0) { - diffSOLARHOURALL += val.solarhour; + if (groupType != 6) { + diffSOLARHOURALL = val.solarhour; $('#HistoryDetailTable').append('' + '' + val.timestamp + '' + '' + val.kwh.toFixed(2) + '' + diff --git a/SolarPower/Views/StationReport/Index.cshtml b/SolarPower/Views/StationReport/Index.cshtml new file mode 100644 index 0000000..7f2c478 --- /dev/null +++ b/SolarPower/Views/StationReport/Index.cshtml @@ -0,0 +1,234 @@ +@{ + ViewData["MainNum"] = "4"; + ViewData["SubNum"] = "1"; + ViewData["Title"] = "電站報表"; +} +@using SolarPower.Models.Role +@model RoleLayerEnum + +
      +
      + +
      + +
      + +
      +
      +

      + @ViewData["Title"] +

      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      + + + + +
      +
      +
      + + +
      +
      +
      + +
      +
      + +
      +
      +
      + + + +
      +
      +
      +
      + +
      +
      + + + + +
      +
      +
      +
      +
      +
      +
      + +
      + + + +
      +
      diff --git a/SolarPower/wwwroot/upload/operation_recode/49/c79d25f6-8905-427f-ab7b-3264fb1bd9bd.xlsx b/SolarPower/wwwroot/upload/operation_recode/49/c79d25f6-8905-427f-ab7b-3264fb1bd9bd.xlsx new file mode 100644 index 0000000..cfd5e03 Binary files /dev/null and b/SolarPower/wwwroot/upload/operation_recode/49/c79d25f6-8905-427f-ab7b-3264fb1bd9bd.xlsx differ diff --git a/SolarPower/wwwroot/upload/operation_recode/50/f3fa16ea-9c25-4bf8-90df-9329c734722e.png b/SolarPower/wwwroot/upload/operation_recode/50/f3fa16ea-9c25-4bf8-90df-9329c734722e.png new file mode 100644 index 0000000..7024b48 Binary files /dev/null and b/SolarPower/wwwroot/upload/operation_recode/50/f3fa16ea-9c25-4bf8-90df-9329c734722e.png differ diff --git a/SolarPower/wwwroot/upload/operation_recode/51/89315478-33be-4004-b49c-ab10823d01b3.png b/SolarPower/wwwroot/upload/operation_recode/51/89315478-33be-4004-b49c-ab10823d01b3.png new file mode 100644 index 0000000..7024b48 Binary files /dev/null and b/SolarPower/wwwroot/upload/operation_recode/51/89315478-33be-4004-b49c-ab10823d01b3.png differ