[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