using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using SolarPower.Models; using SolarPower.Models.Role; using SolarPower.Repository.Interface; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace SolarPower.Controllers { public class OperationController : MyBaseController { private readonly IOperationRepository operationRepository; private string operationRecodeFilePath = "/upload/operation_recode/"; private string operationRecodeSaveAsPath = ""; public OperationController( IOperationRepository operationRepository) : base() { this.operationRepository = operationRepository; operationRecodeSaveAsPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "upload", "operation_recode"); } public IActionResult Index() { return View(); } public IActionResult Record() { return View("~/Views/Operation/OperationRecord.cshtml"); } /// /// 取得電站Option /// /// /// public async Task>> GetPowerStationSelectOption() { ApiResult> apiResult = new ApiResult>(); try { var PowerStationIdLists = new List(); PowerStationIdLists = await operationRepository.GetPowerStationIdList(myUser.Id); apiResult.Code = "0000"; apiResult.Data = PowerStationIdLists; } catch (Exception exception) { apiResult.Code = "9999"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } /// /// 儲存計畫 /// /// /// public async Task> SaveOperationPlan(OperationCreatePlanModal post) { ApiResult apiResult = new ApiResult(); try { if (post.Id == 0) { var now = DateTime.Now.ToString("yyyy-MM-dd"); var finalid = await operationRepository.GetCurrentSerialNumber("operation_plan_create", $"PowerStationId = {post.PowerStationId} AND CreatedAt LIKE '%{now}%'"); var newSerialNumber = GetLastSerialNumber(finalid); var OperationPlan = new OperationCreatePlan() { EmailType = post.EmailType, ScheduleNum = post.ScheduleNum, Description = post.Description, WorkDay = post.WorkDay, ScheduleType = post.ScheduleType, SerialNumber = newSerialNumber, StartTime = post.StartTime, PowerStationId = post.PowerStationId, Type = post.Type, PlanId = DateTime.Now.ToString("yyyyMMdd") + newSerialNumber, CreatedBy = myUser.Id }; List properties = new List() { "EmailType", "ScheduleNum", "Description", "WorkDay", "ScheduleType", "SerialNumber", "StartTime", "PowerStationId", "Type", "PlanId", "CreatedBy" }; await operationRepository.AddOperationPlan(OperationPlan, properties); var record = new PlanToRecord() { WorkType = post.Type, PowerStationId = post.PowerStationId, StartTime = post.StartTime, CreatedBy = myUser.Id, EndTime = post.EndTime }; List properties2 = new List() { "WorkType", "PowerStationId", "StartTime", "CreatedBy", "EndTime" }; await operationRepository.AddToRecord(record, properties2); apiResult.Code = "0000"; apiResult.Msg = "新增成功"; } else { var OperationPlan = new OperationCreatePlan() { Id = post.Id, EmailType = post.EmailType, ScheduleNum = post.ScheduleNum, Description = post.Description, WorkDay = post.WorkDay, ScheduleType = post.ScheduleType, StartTime = post.StartTime, PowerStationId = post.PowerStationId, Type = post.Type, UpdatedBy = myUser.Id }; List properties = new List() { "Id", "EmailType", "ScheduleNum", "Description", "WorkDay", "ScheduleType", "StartTime", "PowerStationId", "Type", "UpdatedBy" }; await operationRepository.UpdateOperationPlan(OperationPlan, properties); apiResult.Code = "0000"; apiResult.Msg = "編輯成功"; } } catch (Exception exception) { apiResult.Code = "9999"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } /// /// 定時計畫datatable /// /// /// public async Task OperationPlanTable(List id, int type) { List OperationPlanTable = new List(); ApiResult> apiResult = new ApiResult>(); try { apiResult.Code = "0000"; OperationPlanTable = await operationRepository.OperationPlanTable(id, type); foreach (OperationPlanTable a in OperationPlanTable) { if (a.Type == 0) { a.TypeName = "清洗"; } else { a.TypeName = "巡檢"; } if (a.ScheduleType == 0) { a.Schedule = "每" + a.ScheduleNum.ToString() + "天"; } else if (a.ScheduleType == 1) { a.Schedule = "每" + a.ScheduleNum.ToString() + "周"; } else if (a.ScheduleType == 2) { a.Schedule = "每" + a.ScheduleNum.ToString() + "月"; } else if (a.ScheduleType == 3) { a.Schedule = "每" + a.ScheduleNum.ToString() + "季"; } else if (a.ScheduleType == 4) { a.Schedule = "每" + a.ScheduleNum.ToString() + "年"; } a.StartTimeString = a.StartTime; var crst = a.CreatedAt.Split(" "); a.CreateTimeString = crst[0]; if (a.EmailType == 0) { a.EmailTypeName = "當天"; } else if (a.EmailType == 1) { a.EmailTypeName = "前一天"; } else if (a.EmailType == 2) { a.EmailTypeName = "前兩天"; } else if (a.EmailType == 3) { a.EmailTypeName = "前三天"; } a.Function = @" "; } apiResult.Data = OperationPlanTable; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = exception.ToString(); } var result = Json(new { data = apiResult }); return result; } /// /// 刪除定時計畫 /// /// /// public async Task> DeleteOneOperationPlan(int Id) { ApiResult apiResult = new ApiResult(); OperationCreatePlan operation = new OperationCreatePlan(); try { operation = await operationRepository.GetOneOperation(Id); if (operation == null) { apiResult.Code = "9998"; apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } await operationRepository.DeleteOneByIdWithCustomTable(Id, "operation_plan_create"); apiResult.Code = "0000"; apiResult.Msg = "刪除成功"; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = errorCode.GetString(apiResult.Code); Logger.LogError("【" + controllerName + "/" + actionName + "】" + "Id=" + Id); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } public async Task> GetOneOperationPlan(int Id) { ApiResult apiResult = new ApiResult(); OperationCreatePlan operationCreatePlan = new OperationCreatePlan(); try { apiResult.Code = "0000"; operationCreatePlan = await operationRepository.GetOneOperation(Id); apiResult.Data = operationCreatePlan; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = exception.ToString(); Logger.LogError("【" + controllerName + "/" + actionName + "】" + "Id=" + Id); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 運維作業記錄列表 /// /// /// [HttpPost] public async Task OperationRecodeListAsync(PostOperationRecodeFilter post) { ApiResult> apiResult = new ApiResult>(); int totalRecords = 0; //總資料筆數 int recFilter = 0; //過濾後資料筆數 List recodes = null; try { recodes = await operationRepository.GetAllRecodeByFilterAsync(post); foreach (var recode in recodes) { if (string.IsNullOrEmpty(recode.FormId)) { recode.FormId = @$"填寫表單"; } else { recode.FormId = @$"{recode.FormId}"; } if (recode.RecodeFiles != null && recode.RecodeFiles.Count > 0) { foreach (var file in recode.RecodeFiles) { file.FileName = Path.Combine(operationRecodeFilePath, recode.Id.ToString()) + "/" + file.FileName; } } } totalRecords = recodes.Count(); recFilter = recodes.Count(); apiResult.Code = "0000"; apiResult.Data = recodes; } catch (Exception exception) { apiResult.Code = "9999"; string json = System.Text.Json.JsonSerializer.Serialize(post); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } apiResult.Msg = errorCode.GetString(apiResult.Code); var result = Json(new { recordsTotal = totalRecords, recordsFiltered = recFilter, data = apiResult }); return result; } /// /// 取得單一運維作業記錄列表 /// /// /// [HttpPost] public async Task> GetOneOperationRecode(int id) { ApiResult apiResult = new ApiResult(); OperationRecode operationRecode; try { //if (!IsPlatformLayer(myUser.Role.Layer)) //{ //如果只是身分公司管理員 或 公司使用者,就只能看自己公司的資料 // post.SelectedCompanyId = myUser.CompanyId; //} operationRecode = await operationRepository.GetOneOperationRecodeAsync(id); if (operationRecode == null) { apiResult.Code = "9989"; apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } foreach (var recodeFile in operationRecode.RecodeFiles) { recodeFile.FileName = Path.Combine(operationRecodeFilePath, operationRecode.Id.ToString()) + "/" + recodeFile.FileName; } apiResult.Code = "0000"; apiResult.Data = operationRecode; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = errorCode.GetString(apiResult.Code); Logger.LogError("【" + controllerName + "/" + actionName + "】" + "Id=" + id); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 新增 維修單 / 修改運維作業記錄 /// /// /// public async Task> SaveOperationRecode([FromForm] PostOperationRecode post) { ApiResult apiResult = new ApiResult(); OperationRecode operationRecode = null; try { operationRecode = await operationRepository.GetOneOperationRecodeAsync(post.Id); //取得運維作業記錄最後流水號 var currentSerialNumber = await operationRepository.GetCurrentSerialNumber("operation_record"); if (operationRecode == null) { if (post.Id != 0) { apiResult.Code = "9989"; apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } #region 新增運維作業記錄 - 維修單 var tempSerialNumber = GetLastSerialNumber(currentSerialNumber); var finishTime = string.Empty; if (post.Status == (int)OperationRecodeStatusEnum.Complete) { finishTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } operationRecode = new OperationRecode() { FormId = "op" + DateTime.Now.ToString("yyyyMMdd") + tempSerialNumber, SerialNumber = tempSerialNumber, PowerStationId = post.PowerStationId, WorkType = (int)OperationRecodeWorkTypeEnum.Fix, ErrorCode = post.ErrorCode, FixDo = post.FixDo, Status = post.Status, WorkPersonId = post.WorkPersonId, FinishTime = finishTime, WorkTime = post.WorkTime, Notice = post.Notice, Description = post.Description, CreatedBy = myUser.Id }; List properties = new List() { "FormId", "SerialNumber", "PowerStationId", "WorkType", "ErrorCode", "FixDo", "Status", "WorkPersonId", "FinishTime", "WorkTime", "Notice", "Description", "CreatedBy" }; var id = await operationRepository.AddOneOperationRecodeAsync(operationRecode, properties); apiResult.Code = "0000"; apiResult.Msg = "儲存成功"; #endregion } else { #region 修改運維作業記錄 var finishTime = string.Empty; if (post.Status == (int)OperationRecodeStatusEnum.Complete) { finishTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } if (operationRecode.WorkType != (int)OperationRecodeWorkTypeEnum.Fix) { //針對清洗、巡檢 var now = DateTime.Now; var startTime = DateTime.Parse(post.StartTime + " 00:00:00"); var endTime = DateTime.Parse(post.EndTime + " 23:59:59"); if (now > endTime) { if (post.Status == (int)OperationRecodeStatusEnum.NoneComplete) { //超過時間修改成 未完成-過期 post.Status = (int)OperationRecodeStatusEnum.NoneCompleteExpired; } else if (post.Status == (int)OperationRecodeStatusEnum.Complete) { //超過時間修改成 完成-過期 post.Status = (int)OperationRecodeStatusEnum.CompleteExpired; } } } UpdateOperationRecode update = new UpdateOperationRecode() { Id = post.Id, ErrorCode = post.ErrorCode, FixDo = post.FixDo, Status = post.Status, FinishTime = !string.IsNullOrEmpty(finishTime) ? finishTime : null, WorkTime = post.WorkTime, Notice = post.Notice, Description = post.Description, UpdatedBy = myUser.Id }; List properties = new List() { "Id", "ErrorCode", "FixDo", "Status", "FinishTime", "WorkTime", "Notice", "Description", "UpdatedBy", }; if (string.IsNullOrEmpty(operationRecode.FormId)) { var tempSerialNumber = GetLastSerialNumber(currentSerialNumber); update.FormId = "op" + DateTime.Now.ToString("yyyyMMdd") + tempSerialNumber; update.SerialNumber = tempSerialNumber; properties.Add("FormId"); properties.Add("SerialNumber"); } await operationRepository.UpdateOperationRecodeAsync(update, properties); apiResult.Code = "0000"; apiResult.Msg = "儲存成功"; #endregion } } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = errorCode.GetString(apiResult.Code); string json = System.Text.Json.JsonSerializer.Serialize(post); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 儲存運維作業記錄檔案 /// /// /// [HttpPost] public async Task> SaveOperationRecodeFile([FromForm] PostOperationRecode post) { ApiResult apiResult = new ApiResult(); OperationRecode operationRecode = null; try { operationRecode = await operationRepository.GetOneOperationRecodeAsync(post.Id); if (operationRecode == null) { apiResult.Code = "9989"; apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } #region 新增運維作業記錄檔案 List operationRecodeFiles; if (post.RecodeFiles != null && post.RecodeFiles.Length > 0) { FolderFunction folderFunction = new FolderFunction(); var fileSaveAsPath = Path.Combine(operationRecodeSaveAsPath, operationRecode.Id.ToString()); folderFunction.CreateFolder(fileSaveAsPath, 0); operationRecodeFiles = new List(); foreach (var file in post.RecodeFiles) { var split = file.FileName.Split("."); var fileName = Guid.NewGuid() + "." + split[split.Length - 1]; var fullPath = Path.Combine(fileSaveAsPath, fileName); using (var stream = new FileStream(fullPath, FileMode.Create)) { file.CopyTo(stream); } OperationRecodeFile operationRecodeFile = new OperationRecodeFile() { RecordId = operationRecode.Id, FileName = fileName, CreatedBy = myUser.Id }; operationRecodeFiles.Add(operationRecodeFile); } List fileProperties = new List() { "RecordId", "FileName", "CreatedBy" }; await operationRepository.AddOperationRecodeFilesAsync(operationRecodeFiles, fileProperties); } #endregion apiResult.Code = "0000"; apiResult.Msg = "儲存成功"; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = errorCode.GetString(apiResult.Code); string json = System.Text.Json.JsonSerializer.Serialize(post); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } public async Task> DeleteOperationRecodeFile(PostOperationRecodeIdAndSelectedId post) { ApiResult apiResult = new ApiResult(); OperationRecode operationRecode = null; OperationRecodeFile operationRecodeFile = null; try { operationRecode = await operationRepository.GetOneOperationRecodeAsync(post.ReocdeId); if (operationRecode == null) { apiResult.Code = "9989"; apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } operationRecodeFile = await operationRepository.GetOneOperationRecodeFileAsync(post.SelectedId); if (operationRecodeFile == null) { apiResult.Code = "9987"; apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } await operationRepository.DeleteOneOperationRecodeFile(post.SelectedId); apiResult.Code = "0000"; apiResult.Msg = "刪除成功"; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = errorCode.GetString(apiResult.Code); string json = System.Text.Json.JsonSerializer.Serialize(post); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } public async Task>> ExportOperationRecodeExcel(PostOperationRecodeFilter post) { ApiResult> apiResult = new ApiResult>(); List recodes = null; try { //if (!IsPlatformLayer(myUser.Role.Layer)) //{ //如果只是身分公司管理員 或 公司使用者,就只能看自己公司的資料 // post.SelectedCompanyId = myUser.CompanyId; //} recodes = await operationRepository.GetAllRecodeByFilterAsync(post); foreach (var recode in recodes) { recode.PowerStationName = !string.IsNullOrEmpty(recode.PowerStationName) ? recode.PowerStationName : ""; recode.FormId = !string.IsNullOrEmpty(recode.FormId) ? recode.FormId : ""; recode.FixDo = !string.IsNullOrEmpty(recode.FixDo) ? recode.FixDo : ""; recode.WorkPersonName = !string.IsNullOrEmpty(recode.WorkPersonName) ? recode.WorkPersonName : ""; //recode.FinishTime = !string.IsNullOrEmpty(recode.FinishTime) ? recode.FinishTime : ""; if (recode.RecodeFiles != null && recode.RecodeFiles.Count > 0) { foreach (var file in recode.RecodeFiles) { var hyperLink = "" + file.FileName + ""; recode.HyperLinks.Add(hyperLink); } } } apiResult.Code = "0000"; apiResult.Data = recodes; } catch (Exception exception) { apiResult.Code = "9999"; string json = System.Text.Json.JsonSerializer.Serialize(post); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } apiResult.Msg = errorCode.GetString(apiResult.Code); return apiResult; } public async void Schedule () { try { var getTime = await operationRepository.GetOperationSchedules(); foreach(OperationCreatePlanModal a in getTime) { DateTime Updatedtime; if (a.ScheduleType == 0)//日 { Updatedtime = Convert.ToDateTime(a.StartTime).AddDays(a.ScheduleNum); } else if(a.ScheduleType == 1)//周 { Updatedtime = Convert.ToDateTime(a.StartTime).AddDays(a.ScheduleNum * 7); } else if (a.ScheduleType == 2)//月 { Updatedtime = Convert.ToDateTime(a.StartTime).AddMonths(a.ScheduleNum); } else if (a.ScheduleType == 3)//季 { Updatedtime = Convert.ToDateTime(a.StartTime).AddMonths(a.ScheduleNum * 3); } else // 年 { Updatedtime = Convert.ToDateTime(a.StartTime).AddYears(a.ScheduleNum); } if (Updatedtime < DateTime.Now) { var now = DateTime.Now.ToString("yyyy-MM-dd"); var finalid = await operationRepository.GetCurrentSerialNumber("operation_plan_create", $"PowerStationId = {a.PowerStationId} AND CreatedAt LIKE '%{now}%'"); var newSerialNumber = GetLastSerialNumber(finalid); var OperationPlan = new OperationCreatePlan() { EmailType = a.EmailType, ScheduleNum = a.ScheduleNum, Description = a.Description, WorkDay = a.WorkDay, ScheduleType = a.ScheduleType, SerialNumber = newSerialNumber, StartTime = Updatedtime.ToString("yyyy-MM-dd hh:mm:ss"), PowerStationId = a.PowerStationId, Type = a.Type, PlanId = DateTime.Now.ToString("yyyyMMdd") + newSerialNumber, CreatedBy = myUser.Id }; List properties = new List() { "EmailType", "ScheduleNum", "Description", "WorkDay", "ScheduleType", "SerialNumber", "StartTime", "PowerStationId", "Type", "PlanId", "CreatedBy" }; await operationRepository.AddOperationPlan(OperationPlan, properties); var record = new PlanToRecord() { WorkType = a.Type, PowerStationId = a.PowerStationId, StartTime = Updatedtime.ToString("yyyy-MM-dd hh:mm:ss"), CreatedBy = myUser.Id, EndTime = Updatedtime.AddDays(a.WorkDay).ToString("yyyy-MM-dd hh:mm:ss") }; List properties2 = new List() { "WorkType", "PowerStationId", "StartTime", "CreatedBy", "EndTime" }; await operationRepository.AddToRecord(record, properties2); var operation = await operationRepository.GetOneOperation(a.Id); await operationRepository.DeleteOneByIdWithCustomTable(a.Id, "operation_plan_create"); } } } catch (Exception exception) { Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } } } }