[WebApi]緊急應變事件查詢頁面修改,只要發生過就會有紀錄
[BGService]新增緊急應變事件紀錄定期存DB排程
This commit is contained in:
		
							parent
							
								
									877055440c
								
							
						
					
					
						commit
						c147f79e96
					
				| @ -150,12 +150,19 @@ namespace BackendWorkerService | |||||||
|                     #endregion |                     #endregion | ||||||
| 
 | 
 | ||||||
|                     #region 定時檢查燈控排程 |                     #region 定時檢查燈控排程 | ||||||
|                     services.AddSingleton< LightScheduleJob>(); |                     services.AddSingleton<LightScheduleJob>(); | ||||||
|                     services.AddSingleton( |                     services.AddSingleton( | ||||||
|                     new JobSchedule(jobType: typeof(LightScheduleJob), cronExpression: configuration.GetValue<string>("BackgroundServiceCron:LightScheduleJob ")) |                     new JobSchedule(jobType: typeof(LightScheduleJob), cronExpression: configuration.GetValue<string>("BackgroundServiceCron:LightScheduleJob ")) | ||||||
|                     ); |                     ); | ||||||
|                     #endregion |                     #endregion | ||||||
| 
 | 
 | ||||||
|  |                     #region 定時記錄緊急應變告警排程 | ||||||
|  |                     services.AddSingleton<EmergencyRecordJob>(); | ||||||
|  |                     services.AddSingleton( | ||||||
|  |                     new JobSchedule(jobType: typeof(EmergencyRecordJob), cronExpression: configuration.GetValue<string>("BackgroundServiceCron:EmergencyRecordJob ")) | ||||||
|  |                     ); | ||||||
|  |                     #endregion | ||||||
|  | 
 | ||||||
|                 }).ConfigureLogging((hostContext, logFactory) => { |                 }).ConfigureLogging((hostContext, logFactory) => { | ||||||
|                     IConfiguration configuration = hostContext.Configuration; |                     IConfiguration configuration = hostContext.Configuration; | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										156
									
								
								BackendWorkerService/Quartz/Jobs/EmergencyRecordJob.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								BackendWorkerService/Quartz/Jobs/EmergencyRecordJob.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,156 @@ | |||||||
|  | using FrontendWebApi.Models; | ||||||
|  | using Microsoft.Extensions.Logging; | ||||||
|  | using Quartz; | ||||||
|  | using Repository.BackendRepository.Interface; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.IO; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Net.Http; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using System.Xml.Linq; | ||||||
|  | 
 | ||||||
|  | namespace BackendWorkerService.Quartz.Jobs | ||||||
|  | { | ||||||
|  |     [DisallowConcurrentExecution] | ||||||
|  | 
 | ||||||
|  |     class EmergencyRecordJob : IJob | ||||||
|  |     { | ||||||
|  |         private readonly ILogger<EmergencyRecordJob> logger; | ||||||
|  |         private readonly IBackendRepository backendRepository; | ||||||
|  |         private readonly ILogger<Task_Detail> loggers; | ||||||
|  |         public EmergencyRecordJob(ILogger<EmergencyRecordJob> logger, IBackendRepository backendRepository, ILogger<Task_Detail> loggers) | ||||||
|  |         { | ||||||
|  |             this.logger = logger; | ||||||
|  |             this.backendRepository = backendRepository; | ||||||
|  |             this.loggers = loggers; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public async Task Execute(IJobExecutionContext context) | ||||||
|  |         { | ||||||
|  |             Task_Detail task_Detail = new Task_Detail(loggers, backendRepository); | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (await task_Detail.GetNeedWorkTask("EmergencyRecordJob", "EmergencyRecord")) | ||||||
|  |                 { | ||||||
|  |                     try | ||||||
|  |                     { | ||||||
|  |                         await task_Detail.InsertWorkTime("EmergencyRecordJob", "EmergencyRecord"); | ||||||
|  | 
 | ||||||
|  |                         var sqlString = $@"SELECT system_value FROM variable WHERE system_type = 'obixConfig' AND system_key = 'ApiBase' AND deleted = 0"; | ||||||
|  |                         string baseApiUrl = await backendRepository.GetOneAsync<string>(sqlString); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                         sqlString = $@"SELECT system_value FROM variable WHERE system_type = 'emergencyConfig' AND system_key = 'getNiagaraAlarmMoveDayNumStart' AND deleted = 0"; | ||||||
|  |                         int moveDayNum = int.Parse((await backendRepository.GetOneAsync<string>(sqlString)) ?? "-1"); | ||||||
|  | 
 | ||||||
|  |                         string apiUrl = Path.Combine(baseApiUrl, "obix/config/Services/AlarmService/~alarmQuery/"); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                         var device_disaster = await backendRepository.GetAllAsync<DeviceDisaster>("device_disaster",""); | ||||||
|  | 
 | ||||||
|  |                         using (HttpClient client = new HttpClient()) | ||||||
|  |                         { | ||||||
|  |                             string username = "stanGG"; | ||||||
|  |                             string password = "St12345678"; | ||||||
|  |                             string encoded = Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password)); | ||||||
|  | 
 | ||||||
|  |                             client.DefaultRequestHeaders.Add("Authorization", "Basic " + encoded); | ||||||
|  |                             // 建構 XML 數據 | ||||||
|  |                             string xmlData = @$"<obj href='obix:AlarmFilter'> 
 | ||||||
|  |                                           <abstime name='start' val='{DateTime.Now.AddDays(moveDayNum).ToString("yyyy-MM-ddTHH:mm:ss.fff")}+08:00' /> | ||||||
|  |                                           <abstime name='end' val='{DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fff")}+08:00'/> | ||||||
|  |                                         </obj>";
 | ||||||
|  |                             HttpContent content = new StringContent(xmlData, Encoding.UTF8, "application/xml"); | ||||||
|  | 
 | ||||||
|  |                             var response = await client.PostAsync(apiUrl, content); | ||||||
|  |                             var resString = (await response.Content.ReadAsStringAsync()).ToString(); | ||||||
|  | 
 | ||||||
|  |                             XDocument xmlDoc = XDocument.Parse(resString); | ||||||
|  | 
 | ||||||
|  |                             var list = xmlDoc.Descendants().Where(d => d.Name?.LocalName == "list").FirstOrDefault(); | ||||||
|  |                             var objs = list.Descendants().Where(d => d.Name?.LocalName == "obj" && (d.Attribute("is")?.Value?.Contains("obix:Alarm") ?? false)).ToList(); | ||||||
|  |                             var dictionaryList = new List<Dictionary<string, object>>(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                             List<string> filterList = device_disaster.Select(x => x.device_number).ToList(); | ||||||
|  | 
 | ||||||
|  |                             var filteredObjs = objs.Where(obj => | ||||||
|  |                             { | ||||||
|  |                                 var deviceNumber = obj.Descendants().Where(d => d.Name.LocalName == "str" && d.Attribute("name").Value == "sourceName") | ||||||
|  |                                                     .Select(d => d.Attribute("val").Value) | ||||||
|  |                                                     .Select(d => string.Join("_", d.Split("_").Take(5))) | ||||||
|  |                                                     .FirstOrDefault(); | ||||||
|  | 
 | ||||||
|  |                                 return filterList.Contains(deviceNumber); | ||||||
|  |                             }).ToList(); | ||||||
|  | 
 | ||||||
|  |                             foreach (var obj in filteredObjs) | ||||||
|  |                             { | ||||||
|  |                                 var newguid = Guid.NewGuid(); | ||||||
|  |                                 var alarm_timestamp = obj.Descendants().Where(d => d.Name.LocalName == "abstime" && d.Attribute("name").Value == "timestamp") | ||||||
|  |                                                         .Select(d => | ||||||
|  |                                                         { | ||||||
|  |                                                             DateTime valid; | ||||||
|  |                                                             if (DateTime.TryParse(d.Attribute("val").Value, out valid)) | ||||||
|  |                                                             { | ||||||
|  |                                                                 return DateTime.Parse(d.Attribute("val").Value).ToString("yyyy-MM-dd HH:mm:ss"); | ||||||
|  |                                                             } | ||||||
|  |                                                             else | ||||||
|  |                                                             { | ||||||
|  |                                                                 return null; | ||||||
|  |                                                             } | ||||||
|  |                                                         }).FirstOrDefault(); | ||||||
|  |                                 var device_number = obj.Descendants().Where(d => d.Name.LocalName == "str" && d.Attribute("name").Value == "sourceName") | ||||||
|  |                                                         .Select(d => d.Attribute("val").Value) | ||||||
|  |                                                         .Select(d => string.Join("_", d.Split("_").Take(5))) | ||||||
|  |                                                         .FirstOrDefault(); | ||||||
|  |                                 var filterDevice = device_disaster.Where(x => x.device_number == device_number).FirstOrDefault(); | ||||||
|  | 
 | ||||||
|  |                                 var dictionary = new Dictionary<string, object>() | ||||||
|  |                                 { | ||||||
|  |                                      {"@emergency_event_guid",newguid}, | ||||||
|  |                                      {"@disaster",filterDevice.device_system_value}, | ||||||
|  |                                      {"@building_tag", filterDevice.device_building_tag}, | ||||||
|  |                                      {"@device_guid",filterDevice.device_guid }, | ||||||
|  |                                      {"@type",0}, | ||||||
|  |                                      {"@alarm_time",alarm_timestamp} | ||||||
|  |                                 }; | ||||||
|  |                                 dictionaryList.Add(dictionary); | ||||||
|  | 
 | ||||||
|  |                             } | ||||||
|  | 
 | ||||||
|  |                             var mergeSql = @"
 | ||||||
|  |                             INSERT INTO emergency_event  | ||||||
|  |                             (emergency_event_guid, disaster, device_guid, building_tag, type, alarm_time)  | ||||||
|  |                             VALUES  | ||||||
|  |                             (@emergency_event_guid, @disaster, @device_guid, @building_tag, @type, @alarm_time) | ||||||
|  |                             ON DUPLICATE KEY UPDATE  | ||||||
|  |                             disaster = VALUES(disaster),  | ||||||
|  |                             building_tag = VALUES(building_tag),  | ||||||
|  |                             type = VALUES(type)";
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                             await backendRepository.ExecuteSql(mergeSql, dictionaryList); | ||||||
|  | 
 | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         await task_Detail.InsertWorkTime_End("EmergencyRecordJob", "EmergencyRecord"); | ||||||
|  |                     } | ||||||
|  |                     catch (Exception ex) | ||||||
|  |                     { | ||||||
|  |                         await task_Detail.WorkFail("EmergencyRecordJob", "EmergencyRecord", ex.Message.ToString()); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch (Exception exception) | ||||||
|  |             { | ||||||
|  |                 logger.LogError("【EmergencyRecordJob】【任務失敗】"); | ||||||
|  |                 logger.LogError("【EmergencyRecordJob】【任務失敗】[Exception]:{0}", exception.ToString()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -16,6 +16,7 @@ | |||||||
|     "ArchiveElectricMeterHourJob": "0 0 2 * * ?", |     "ArchiveElectricMeterHourJob": "0 0 2 * * ?", | ||||||
|     "ArchiveElectricMeterDayJob": "0/5 * * * * ?", |     "ArchiveElectricMeterDayJob": "0/5 * * * * ?", | ||||||
|     "LightScheduleJob ": "0/5 * * * * ?", |     "LightScheduleJob ": "0/5 * * * * ?", | ||||||
|  |     "EmergencyRecordJob ": "0/5 * * * * ?", | ||||||
|     "WeatherAPIJob": "0/5 * * * * ?" |     "WeatherAPIJob": "0/5 * * * * ?" | ||||||
|   }, |   }, | ||||||
|   "DBConfig": { |   "DBConfig": { | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ | |||||||
|     "ArchiveElectricMeterHourJob": "0 0 2 * * ?", |     "ArchiveElectricMeterHourJob": "0 0 2 * * ?", | ||||||
|     "ArchiveElectricMeterDayJob": "0/5 * * * * ?", |     "ArchiveElectricMeterDayJob": "0/5 * * * * ?", | ||||||
|     "LightScheduleJob ": "0 0/1 * * * ?", |     "LightScheduleJob ": "0 0/1 * * * ?", | ||||||
|  |     "EmergencyRecordJob ": "0 0/1 * * * ?", | ||||||
|     "WeatherAPIJob": "0 0 2 * * ?" |     "WeatherAPIJob": "0 0 2 * * ?" | ||||||
|   }, |   }, | ||||||
|   "DBConfig": { |   "DBConfig": { | ||||||
|  | |||||||
| @ -121,7 +121,7 @@ namespace FrontendWebApi.ApiControllers | |||||||
|                             DateTime valid; |                             DateTime valid; | ||||||
|                             if (DateTime.TryParse(d.Attribute("val").Value, out valid)) |                             if (DateTime.TryParse(d.Attribute("val").Value, out valid)) | ||||||
|                             { |                             { | ||||||
|                                 return DateTime.Parse(d.Attribute("val").Value).ToString("yyyy-MM-dd HH:mm:ss.fff"); |                                 return DateTime.Parse(d.Attribute("val").Value).ToString("yyyy-MM-dd HH:mm:ss"); | ||||||
|                             } |                             } | ||||||
|                             else |                             else | ||||||
|                             { |                             { | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ using Newtonsoft.Json; | |||||||
| using Repository.BackendRepository.Interface; | using Repository.BackendRepository.Interface; | ||||||
| using Repository.FrontendRepository.Interface; | using Repository.FrontendRepository.Interface; | ||||||
| using System; | using System; | ||||||
|  | using System.Collections; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Data.SqlTypes; | using System.Data.SqlTypes; | ||||||
| using System.Diagnostics; | using System.Diagnostics; | ||||||
| @ -256,18 +257,44 @@ namespace FrontendWebApi.ApiControllers | |||||||
|             } |             } | ||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 var newguid = Guid.NewGuid(); |                 if (eventpost.emergency_event_guid != null) | ||||||
|                 var dictionary = new Dictionary<string, object>() |                 { | ||||||
|  |                     var dictionary = new Dictionary<string, object>() | ||||||
|  |                     { | ||||||
|  |                         {"@finish_time",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} | ||||||
|  |                     }; | ||||||
|  |                     await backendRepository.UpdateOneByCustomTable(dictionary, "emergency_event", $"emergency_event_guid = '{eventpost.emergency_event_guid}'"); | ||||||
|  |                     apiResult.Code = "0000"; | ||||||
|  |                     apiResult.Msg = "更新完成時間"; | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     // 檢查是否有該紀錄 | ||||||
|  |                     var sql = "SELECT * FROM emergency_event WHERE alarm_time = @alarmTime AND device_guid = @deviceGuid"; | ||||||
|  |                     var count = await backendRepository.GetOneAsync<EmergencyRecordEvent>(sql, new { alarmTime = eventpost.alarm_time, deviceGuid = eventpost.device }); | ||||||
|  |                     if (count != null) | ||||||
|  |                     { | ||||||
|  |                         apiResult.Code = "0000"; | ||||||
|  |                         apiResult.Msg = "已有該筆紀錄"; | ||||||
|  |                         apiResult.Data = count.emergency_event_guid; | ||||||
|  | 
 | ||||||
|  |                         return Ok(apiResult); | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     var newguid = Guid.NewGuid(); | ||||||
|  |                     var dictionary = new Dictionary<string, object>() | ||||||
|                     { |                     { | ||||||
|                         {"@emergency_event_guid",newguid}, |                         {"@emergency_event_guid",newguid}, | ||||||
|                         {"@disaster",eventpost.disaster}, |                         {"@disaster",eventpost.disaster}, | ||||||
|                         {"@building_tag", eventpost.build}, |                         {"@building_tag", eventpost.build}, | ||||||
|                         {"@device_guid",eventpost.device }, |                         {"@device_guid",eventpost.device }, | ||||||
|                         {"@type",eventpost.type} |                         {"@type",eventpost.type}, | ||||||
|  |                         {"@alarm_time",eventpost.alarm_time} | ||||||
|                     }; |                     }; | ||||||
|                 await backendRepository.AddOneByCustomTable(dictionary, "emergency_event"); |                     await backendRepository.AddOneByCustomTable(dictionary, "emergency_event"); | ||||||
|                 apiResult.Data = newguid.ToString(); |                     apiResult.Data = newguid.ToString(); | ||||||
|                 apiResult.Code = "0000"; |                     apiResult.Code = "0000"; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             catch (Exception exception) |             catch (Exception exception) | ||||||
|             { |             { | ||||||
|  | |||||||
| @ -71,7 +71,7 @@ namespace FrontendWebApi.ApiControllers | |||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 EmergencyRecordEvent = await backendRepository.GetAllAsync<EmergencyRecordEventTable>($@"
 |                 EmergencyRecordEvent = await backendRepository.GetAllAsync<EmergencyRecordEventTable>($@"
 | ||||||
|                     select d.device_number device_name,v.system_key disaster_name,ee.*,b.full_name building_name from emergency_event ee  |                     select d.device_number device_name,v.system_key disaster_name,ee.*,b.full_name building_name,ee.alarm_time,ee.finish_time from emergency_event ee  | ||||||
|                     left join (select * from variable v where v.system_type = 'disaster') v on v.system_value = ee.disaster |                     left join (select * from variable v where v.system_type = 'disaster') v on v.system_value = ee.disaster | ||||||
|                     left join device d on d.device_guid = ee.device_guid  |                     left join device d on d.device_guid = ee.device_guid  | ||||||
|                     left join building b on b.building_tag = ee.building_tag |                     left join building b on b.building_tag = ee.building_tag | ||||||
|  | |||||||
| @ -113,10 +113,13 @@ namespace FrontendWebApi.Models | |||||||
| 
 | 
 | ||||||
|     public class Eventpost |     public class Eventpost | ||||||
|     { |     { | ||||||
|  |         public string emergency_event_guid { get; set; } | ||||||
|         public int disaster { get; set; } |         public int disaster { get; set; } | ||||||
|         public string build { get; set; } |         public string build { get; set; } | ||||||
|         public byte type { get; set; } |         public byte type { get; set; } | ||||||
|         public string device { get; set; } |         public string device { get; set; } | ||||||
|  |         public string alarm_time { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public class EmergencySetting |     public class EmergencySetting | ||||||
|  | |||||||
| @ -19,11 +19,15 @@ namespace FrontendWebApi.Models | |||||||
| 
 | 
 | ||||||
|     public class EmergencyRecordEvent : Actor |     public class EmergencyRecordEvent : Actor | ||||||
|     { |     { | ||||||
|  |         private string _alarm_time; | ||||||
|  |         private string _finish_time; | ||||||
|         public string emergency_event_guid { get; set; } |         public string emergency_event_guid { get; set; } | ||||||
|         public int disaster { get; set; } |         public int disaster { get; set; } | ||||||
|         public string device_guid { get; set; } |         public string device_guid { get; set; } | ||||||
|         public string building_guid { get; set; } |         public string building_guid { get; set; } | ||||||
|         public byte type { get; set; } |         public byte type { get; set; } | ||||||
|  |         public string alarm_time { get { return Convert.ToDateTime(_alarm_time).ToString("yyyy-MM-dd HH:mm:ss"); } set { _alarm_time = value; } } | ||||||
|  |         public string finish_time { get { return Convert.ToDateTime(_finish_time).ToString("yyyy-MM-dd HH:mm:ss"); } set { _finish_time = value; } } | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|     public class EmergencyRecordEventTable : EmergencyRecordEvent |     public class EmergencyRecordEventTable : EmergencyRecordEvent | ||||||
|  | |||||||
| @ -1,12 +1,12 @@ | |||||||
| @{ | @{ | ||||||
|     ViewData["MainNum"] = "4"; |     ViewData["MainNum"] = "4"; | ||||||
|     ViewData["SubNum"] = "1"; |     ViewData["SubNum"] = "1"; | ||||||
|     ViewData["Title"] = "設備總覽"; |     ViewData["Title"] = "事件清單"; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| <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> | ||||||
| 
 | 
 | ||||||
| @ -94,7 +94,10 @@ | |||||||
|             @*<button type="button" class="close p-sm-2 p-md-4 text-dark fs-xxl position-absolute pos-right mr-sm-2 mt-sm-1 z-index-space" data-dismiss="modal" aria-label="Close"> |             @*<button type="button" class="close p-sm-2 p-md-4 text-dark fs-xxl position-absolute pos-right mr-sm-2 mt-sm-1 z-index-space" data-dismiss="modal" aria-label="Close"> | ||||||
|                     <span aria-hidden="true"><i class="fal fa-times"></i></span> |                     <span aria-hidden="true"><i class="fal fa-times"></i></span> | ||||||
|                 </button>*@ |                 </button>*@ | ||||||
|             <button type="button" class=" position-absolute pos-right mr-sm-3 mt-sm-3 z-index-space btn btn-danger waves-effect waves-themed" id="closemodal" onclick="Closemodal()">關閉流程</button> |             <div class="position-absolute pos-right mr-sm-3 mt-sm-3 z-index-space"> | ||||||
|  |                 @*<button type="button" class="btn btn-danger waves-effect waves-themed mr-2" id="Tcp" onclick="SendMessageAsync('D002')">取消上牆</button>*@ | ||||||
|  |                 <button type="button" class="btn btn-danger waves-effect waves-themed" id="closemodal" onclick="Closemodal()">關閉流程</button> | ||||||
|  |             </div> | ||||||
|             <div class="modal-body bg-white"> |             <div class="modal-body bg-white"> | ||||||
|                 <div class="container-fluid"> |                 <div class="container-fluid"> | ||||||
|                     <div class="row"> |                     <div class="row"> | ||||||
| @ -621,6 +624,7 @@ | |||||||
|                 'createdRow': function (row, data, dataIndex) { |                 'createdRow': function (row, data, dataIndex) { | ||||||
|                     $(row).attr('data-guid', data.device_guid); |                     $(row).attr('data-guid', data.device_guid); | ||||||
|                     $(row).attr('data-disaster', data.disaster); |                     $(row).attr('data-disaster', data.disaster); | ||||||
|  |                     $(row).attr('data-time', data.alarm_timestamp); | ||||||
|                 }, |                 }, | ||||||
|                 "ajax": { |                 "ajax": { | ||||||
|                     "url": "/api/EmergencyDevice", |                     "url": "/api/EmergencyDevice", | ||||||
| @ -651,7 +655,7 @@ | |||||||
| 
 | 
 | ||||||
|                             enable_alarm_timer = true; |                             enable_alarm_timer = true; | ||||||
|                             is_need_reload = false; |                             is_need_reload = false; | ||||||
| 
 |                             // 如果是告警頁面則會進行設備清單跟alarm設備的比對 | ||||||
|                             if (show_mode == 'alarm') { |                             if (show_mode == 'alarm') { | ||||||
|                                 backfill_building_alarm_device_amount = []; |                                 backfill_building_alarm_device_amount = []; | ||||||
|                                 backfill_layer2_alarm_device_amount = []; |                                 backfill_layer2_alarm_device_amount = []; | ||||||
| @ -748,9 +752,10 @@ | |||||||
| 
 | 
 | ||||||
|                 selected_device_guid = $(this).parents('tr').attr('data-guid'); |                 selected_device_guid = $(this).parents('tr').attr('data-guid'); | ||||||
|                 selected_device_disaster = $(this).parents('tr').attr('data-disaster'); |                 selected_device_disaster = $(this).parents('tr').attr('data-disaster'); | ||||||
|  |                 selected_device_time = $(this).parents('tr').attr('data-time'); | ||||||
| 
 | 
 | ||||||
|                 OnSimulationExercise(selected_device_guid, selected_device_disaster, 0); |                 OnSimulationExercise(selected_device_guid, selected_device_disaster, 0, selected_device_time); | ||||||
| 
 |                 // SendMessageAsync("D001"); | ||||||
|             }); |             }); | ||||||
|             //#endregion |             //#endregion | ||||||
| 
 | 
 | ||||||
| @ -1389,7 +1394,7 @@ | |||||||
|         //#endregion |         //#endregion | ||||||
| 
 | 
 | ||||||
|         //#region 模擬演練 / SOP 開啟畫面 |         //#region 模擬演練 / SOP 開啟畫面 | ||||||
|         function OnSimulationExercise(guid, disaster, type) { |         function OnSimulationExercise(guid, disaster, type ,time) { | ||||||
| 
 | 
 | ||||||
|             if (type === 1 && SelectedFilter.disasters.length > 1) { |             if (type === 1 && SelectedFilter.disasters.length > 1) { | ||||||
|                 toast_warning("防災類別只能單選,請修改防災類別"); |                 toast_warning("防災類別只能單選,請修改防災類別"); | ||||||
| @ -1415,6 +1420,7 @@ | |||||||
|                 build: SelectedFilter.building_tag[0] ?? null, |                 build: SelectedFilter.building_tag[0] ?? null, | ||||||
|                 disaster: disaster, |                 disaster: disaster, | ||||||
|                 type: type, |                 type: type, | ||||||
|  |                 alarm_time: time, | ||||||
|                 device: guid |                 device: guid | ||||||
|             }; |             }; | ||||||
|             $.post(url, send_data, function (rel) { |             $.post(url, send_data, function (rel) { | ||||||
| @ -1433,6 +1439,49 @@ | |||||||
|         } |         } | ||||||
|         //#endregion |         //#endregion | ||||||
| 
 | 
 | ||||||
|  |         //#region 更新事件完成時間 | ||||||
|  |         function UpdateRecordFinishTime() { | ||||||
|  | 
 | ||||||
|  |             var url = "/api/EmergencyDevice/SaveAndOpenSimulationExercise"; | ||||||
|  |             var send_data = { | ||||||
|  |                 emergency_event_guid: SimulationExerciseGuid | ||||||
|  |             }; | ||||||
|  |             $.post(url, send_data, function (rel) { | ||||||
|  |                 if (rel.code != "0000") { | ||||||
|  |                     if (rel.code == "9999") { | ||||||
|  |                         toast_error(rel.msg); | ||||||
|  |                     } | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 else { | ||||||
|  | 
 | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             }, 'json'); | ||||||
|  |         } | ||||||
|  |         //#endregion | ||||||
|  | 
 | ||||||
|  |         //#region 發送電視牆訊號 | ||||||
|  |         function SendMessageAsync(message) { | ||||||
|  | 
 | ||||||
|  |             var url = "/api/Send"; | ||||||
|  |             var send_data = { | ||||||
|  |                 message: message | ||||||
|  |             }; | ||||||
|  |             $.post(url, send_data, function (rel) { | ||||||
|  |                 if (rel.code != "0000") { | ||||||
|  |                     if (rel.code == "9999") { | ||||||
|  |                         toast_error("電視牆送訊號" + message + "失敗"); | ||||||
|  |                     } | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 else { | ||||||
|  | 
 | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             }, 'json'); | ||||||
|  |         } | ||||||
|  |         //#endregion | ||||||
|         //#region 模擬演練 / SOP modal 取得組別 |         //#region 模擬演練 / SOP modal 取得組別 | ||||||
|         function GetbuttonList(selected_disaster) { |         function GetbuttonList(selected_disaster) { | ||||||
|             var url = "/api/EmergencyDevice/GetGroupingList"; |             var url = "/api/EmergencyDevice/GetGroupingList"; | ||||||
| @ -1805,7 +1854,7 @@ | |||||||
| 
 | 
 | ||||||
|                         if (tablist == undefined) { |                         if (tablist == undefined) { | ||||||
|                             $('#button_' + EmerNowsetting).find('button').attr('disabled', true); |                             $('#button_' + EmerNowsetting).find('button').attr('disabled', true); | ||||||
|                             CloseVerify = true; |                             // CloseVerify = true; | ||||||
|                             //$('#closemodal').attr('disabled', false); |                             //$('#closemodal').attr('disabled', false); | ||||||
|                         } else { |                         } else { | ||||||
|                             $('#' + tablist).trigger('click'); |                             $('#' + tablist).trigger('click'); | ||||||
| @ -1903,6 +1952,9 @@ | |||||||
|                                 CloseVerify = true; |                                 CloseVerify = true; | ||||||
|                                 $('#emergency-verify-modal').modal('hide'); |                                 $('#emergency-verify-modal').modal('hide'); | ||||||
|                                 $('#SimulationExercisemodal').modal('hide'); |                                 $('#SimulationExercisemodal').modal('hide'); | ||||||
|  |                                 // SendMessageAsync("D002"); | ||||||
|  |                                 UpdateRecordFinishTime() | ||||||
|  |                                 CloseVerify = false; // 每次關閉流程都要驗證一次 | ||||||
|                             } else { |                             } else { | ||||||
|                                 toast_warning('密碼驗證失敗,請重新驗證'); |                                 toast_warning('密碼驗證失敗,請重新驗證'); | ||||||
|                             } |                             } | ||||||
|  | |||||||
| @ -359,56 +359,56 @@ | |||||||
|             }) |             }) | ||||||
| 
 | 
 | ||||||
|             //#region 定時取得報警設備(3s) |             //#region 定時取得報警設備(3s) | ||||||
|             interval_id = setInterval(function () { |             // interval_id = setInterval(function () { | ||||||
|                 if (!enable_alarm_timer) { |             //     if (!enable_alarm_timer) { | ||||||
|                     return; |             //         return; | ||||||
|                 } |             //     } | ||||||
|                 var url = "/api/Device/Getalarm"; |             //     var url = "/api/Device/Getalarm"; | ||||||
|                 $.post(url, null, function (rel) { |             //     $.post(url, null, function (rel) { | ||||||
|                     if (rel.code != "0000") { |             //         if (rel.code != "0000") { | ||||||
|                         if (rel.code == "9999") { |             //             if (rel.code == "9999") { | ||||||
|                             toast_error(rel.msg); |             //                 toast_error(rel.msg); | ||||||
|                         } |             //             } | ||||||
|                         else { |             //             else { | ||||||
|                             toast_warning(rel.msg); |             //                 toast_warning(rel.msg); | ||||||
|                         } |             //             } | ||||||
|                         return; |             //             return; | ||||||
|                     } |             //         } | ||||||
|                     else { |             //         else { | ||||||
|                          |                          | ||||||
|                         var is_diff = false; |             //             var is_diff = false; | ||||||
|                         if (Object.keys(temp_alarm_device).length == Object.keys(rel.data.alarmorion).length) { |             //             if (Object.keys(temp_alarm_device).length == Object.keys(rel.data.alarmorion).length) { | ||||||
| 
 | 
 | ||||||
|                             for (var i = 0; i < Object.keys(rel.data.alarmorion).length; i++) { |             //                 for (var i = 0; i < Object.keys(rel.data.alarmorion).length; i++) { | ||||||
| 
 | 
 | ||||||
|                                 var index = temp_alarm_device.findIndex(x => x.alarm_timestamp == rel.data.alarmorion[i].alarm_timestamp |             //                     var index = temp_alarm_device.findIndex(x => x.alarm_timestamp == rel.data.alarmorion[i].alarm_timestamp | ||||||
|                                     && x.device_number == rel.data.alarmorion[i].device_number) |             //                         && x.device_number == rel.data.alarmorion[i].device_number) | ||||||
| 
 | 
 | ||||||
|                                 if (index > -1) { |             //                     if (index > -1) { | ||||||
|                                     is_diff = false; |             //                         is_diff = false; | ||||||
|                                 } else { |             //                     } else { | ||||||
|                                     is_diff = true; |             //                         is_diff = true; | ||||||
|                                 } |             //                     } | ||||||
|                             } |             //                 } | ||||||
| 
 | 
 | ||||||
|                         } else { |             //             } else { | ||||||
|                             is_diff = true; |             //                 is_diff = true; | ||||||
|                         } |             //             } | ||||||
| 
 | 
 | ||||||
|                         temp_alarm_device = rel.data.alarmorion; |             //             temp_alarm_device = rel.data.alarmorion; | ||||||
| 
 | 
 | ||||||
|                         if (show_mode == "alarm" && (is_need_reload || is_diff)) { |             //             if (show_mode == "alarm" && (is_need_reload || is_diff)) { | ||||||
|                             enable_alarm_timer = false; //關閉查詢異常設備,避免重複呼叫 |             //                 enable_alarm_timer = false; 關閉查詢異常設備,避免重複呼叫 | ||||||
| 
 | 
 | ||||||
|                             $("#building").find(".building_device_amount").html(0); |             //                 $("#building").find(".building_device_amount").html(0); | ||||||
|                             rel.data.buildingAlarmDeviceAmount.forEach(function (item) { |             //                 rel.data.buildingAlarmDeviceAmount.forEach(function (item) { | ||||||
|                                 $(`#${item.building_tag}_device_amount`).html(item.device_amount); |             //                     $(`#${item.building_tag}_device_amount`).html(item.device_amount); | ||||||
|                             }); |             //                 }); | ||||||
|                             ResetDeviceTable(); |             //                 ResetDeviceTable(); | ||||||
|                         } |             //             } | ||||||
|                     } |             //         } | ||||||
|                 }, 'json'); |             //     }, 'json'); | ||||||
|             }, 3000); |             // }, 3000); | ||||||
|             //#endregion |             //#endregion | ||||||
| 
 | 
 | ||||||
|             //#region 模擬演練 / SOP modal 聯絡清單Table |             //#region 模擬演練 / SOP modal 聯絡清單Table | ||||||
|  | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user