Merge branch 'master' of https://gitea.mjm-staging.developers-homelab.net/BIMS/BIMS
This commit is contained in:
		
						commit
						de52fc27b9
					
				@ -20,6 +20,7 @@ using NPOI.SS.Formula.Functions;
 | 
			
		||||
using Microsoft.AspNetCore.Localization;
 | 
			
		||||
using MySqlX.XDevAPI.Relational;
 | 
			
		||||
using Backend.Models;
 | 
			
		||||
using NPOI.OpenXmlFormats.Dml;
 | 
			
		||||
 | 
			
		||||
namespace Backend.Services.Implement
 | 
			
		||||
{
 | 
			
		||||
@ -263,9 +264,12 @@ namespace Backend.Services.Implement
 | 
			
		||||
 | 
			
		||||
                        row.parent_path = stationName;
 | 
			
		||||
                        //full_name 其實是點位名稱 point_name 
 | 
			
		||||
                        row.full_name = conPoint.Where(x => x.name.Contains(tagName.Replace('_', '/')) && !x.isHistory).Select(x => x.displayName).FirstOrDefault();
 | 
			
		||||
                        if (conPoint.Where(x => x.name.Contains(tagName.Replace('_', '/')) && !x.isHistory).FirstOrDefault() != null)
 | 
			
		||||
                            conPoint.Where(x => x.name.Contains(tagName.Replace('_', '/')) && !x.isHistory).FirstOrDefault().isHistory = true;
 | 
			
		||||
                        var deviceNumber = tagName.Substring(0, tagName.LastIndexOf(tagName.Split("_")[5]) - 1);
 | 
			
		||||
                        var point = tagName.Split("_")[5];
 | 
			
		||||
                        conPoint = conPoint.Where(x => x.name.Split("/").Length > 6).ToList();
 | 
			
		||||
                        row.full_name = conPoint.Where(x => x.name.Split("/")[5] == deviceNumber && x.name.Split("/")[6] == point && !x.isHistory).Select(x => x.displayName).FirstOrDefault();
 | 
			
		||||
                        if (conPoint.Where(x => x.name.Split("/")[5] == deviceNumber && x.name.Split("/")[6] == point && !x.isHistory).FirstOrDefault() != null)
 | 
			
		||||
                            conPoint.Where(x => x.name.Split("/")[5] == deviceNumber && x.name.Split("/")[6] == point && !x.isHistory).FirstOrDefault().isHistory = true;
 | 
			
		||||
                        row.isHistory = true;
 | 
			
		||||
                        result.Add(row);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@
 | 
			
		||||
      //"Database": "IgYBsgG2VLKKxFb64j7LOA==", //wsp
 | 
			
		||||
      "Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
 | 
			
		||||
      //"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
 | 
			
		||||
      //"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office
 | 
			
		||||
      "Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
 | 
			
		||||
      "Password": "FVAPxztxpY4gJJKQ/se4bQ=="
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@
 | 
			
		||||
      //"Database": "VJB2XC+lAtzuHObDGMVOAA==", //三菱
 | 
			
		||||
      //"Database": "IgYBsgG2VLKKxFb64j7LOA==", //wsp
 | 
			
		||||
      "Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
 | 
			
		||||
      //"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office
 | 
			
		||||
      "Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
 | 
			
		||||
      "Password": "FVAPxztxpY4gJJKQ/se4bQ=="
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
    public class AlarmRecordController : MyBaseApiController<AlarmRecordController>
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IFrontendRepository frontendRepository;
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        public AlarmRecordController
 | 
			
		||||
        (
 | 
			
		||||
            IFrontendRepository frontendRepository
 | 
			
		||||
@ -47,41 +47,41 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var sqlBuildingMain = $@"SELECT
 | 
			
		||||
                                            b.building_guid,
 | 
			
		||||
                                            b.building_tag,
 | 
			
		||||
                                            b.full_name AS building_name,
 | 
			
		||||
                                            ms.main_system_guid,
 | 
			
		||||
                                            ms.full_name AS main_system_name
 | 
			
		||||
                                            v1.system_value,
 | 
			
		||||
										    v1.system_key
 | 
			
		||||
                                        FROM building_menu bm
 | 
			
		||||
                                        INNER JOIN (
 | 
			
		||||
                                            SELECT
 | 
			
		||||
                                               ap.building_guid, ap.ShowView
 | 
			
		||||
                                               ap.building_tag, ap.ShowView
 | 
			
		||||
                                           FROM role_auth ra
 | 
			
		||||
                                           JOIN auth_page ap ON ra.AuthCode = ap.AuthCode
 | 
			
		||||
                                           JOIN userinfo u ON u.role_guid = ra.role_guid WHERE u.account = @Account
 | 
			
		||||
                                           AND ap.building_guid IS NOT NULL
 | 
			
		||||
                                        ) ap ON bm.building_guid = ap.building_guid AND bm.sub_system_guid = ap.ShowView
 | 
			
		||||
                                        LEFT JOIN building b ON bm.building_guid = b.building_guid
 | 
			
		||||
                                        LEFT JOIN main_system ms ON bm.main_system_guid = ms.main_system_guid
 | 
			
		||||
                                        GROUP BY bm.building_guid, bm.main_system_guid
 | 
			
		||||
                                        ORDER BY b.priority, ms.priority";
 | 
			
		||||
                                           AND ap.building_tag IS NOT NULL
 | 
			
		||||
                                        ) ap ON bm.building_tag = ap.building_tag 
 | 
			
		||||
                                        LEFT JOIN building b ON bm.building_tag = b.building_tag
 | 
			
		||||
                                        left join variable v2 on ap.ShowView = v2.id and v2.deleted = 0
 | 
			
		||||
                                        left join variable v1 on v2.system_parent_id = v1.id
 | 
			
		||||
                                        GROUP BY b.building_tag, b.full_name, v1.system_value, v1.system_key";
 | 
			
		||||
 | 
			
		||||
                var alarmRecordPanelRawDatas = await frontendRepository.GetAllAsync<AlarmRecordPanelRawData>(sqlBuildingMain, new { Account = account });
 | 
			
		||||
 | 
			
		||||
                List<AlarmRecordPanel> alarmRecordPanels = new List<AlarmRecordPanel>();
 | 
			
		||||
 | 
			
		||||
                var alarmRecordPanelRawDatas_GroupBy = alarmRecordPanelRawDatas.GroupBy(x => x.building_guid);
 | 
			
		||||
                var alarmRecordPanelRawDatas_GroupBy = alarmRecordPanelRawDatas.GroupBy(x => x.building_tag);
 | 
			
		||||
 | 
			
		||||
                foreach (var building in alarmRecordPanelRawDatas_GroupBy)
 | 
			
		||||
                {
 | 
			
		||||
                    AlarmRecordPanel alarmRecordPanel = new AlarmRecordPanel();
 | 
			
		||||
                    alarmRecordPanel.building_guid = building.Key;
 | 
			
		||||
                    alarmRecordPanel.building_tag = building.Key;
 | 
			
		||||
                    alarmRecordPanel.building_name = building.First().building_name;
 | 
			
		||||
                    alarmRecordPanel.mainSystemPanels = new List<MainSystemPanel>();
 | 
			
		||||
                    foreach (var tempData in building)
 | 
			
		||||
                    {
 | 
			
		||||
                        MainSystemPanel mainSystemPanel = new MainSystemPanel();
 | 
			
		||||
                        mainSystemPanel.main_system_guid = tempData.main_system_guid;
 | 
			
		||||
                        mainSystemPanel.main_system_name = tempData.main_system_name;
 | 
			
		||||
                        mainSystemPanel.system_value = tempData.system_value;
 | 
			
		||||
                        mainSystemPanel.system_key = tempData.system_key;
 | 
			
		||||
 | 
			
		||||
                        alarmRecordPanel.mainSystemPanels.Add(mainSystemPanel);
 | 
			
		||||
                    }
 | 
			
		||||
@ -115,31 +115,31 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var sql = $@"SELECT 
 | 
			
		||||
                                temp_path.source AS alarm_path,
 | 
			
		||||
                                temp_msg.source_msg AS msgText,
 | 
			
		||||
                                from_unixtime(record.timestamp/1000,'%Y-%m-%d %H:%i:%s') alarm_timestamp,
 | 
			
		||||
                                record.priority,
 | 
			
		||||
                                CASE WHEN record.normalTime > 0 THEN from_unixtime(record.normalTime/1000,'%Y-%m-%d %H:%i:%s')
 | 
			
		||||
                                ELSE NULL
 | 
			
		||||
                                END AS normal_timestamp,
 | 
			
		||||
                                record.sourceState AS ackState,
 | 
			
		||||
                                class.alarmclass AS alarm_className,
 | 
			
		||||
                                record.userAccount
 | 
			
		||||
    
 | 
			
		||||
                            FROM alarmorion_orionalarmrecord record 
 | 
			
		||||
		                            temp_path.source AS alarm_path,
 | 
			
		||||
		                            temp_msg.source_msg AS msgText,
 | 
			
		||||
		                            from_unixtime(record.timestamp/1000,'%Y-%m-%d %H:%i:%s') alarm_timestamp,
 | 
			
		||||
		                            record.priority,
 | 
			
		||||
		                            CASE WHEN record.normalTime > 0 THEN from_unixtime(record.normalTime/1000,'%Y-%m-%d %H:%i:%s')
 | 
			
		||||
		                            ELSE NULL
 | 
			
		||||
		                            END AS normal_timestamp,
 | 
			
		||||
		                            record.sourceState AS ackState,
 | 
			
		||||
		                            class.alarmclass AS alarm_className,
 | 
			
		||||
		                            record.userAccount
 | 
			
		||||
 | 
			
		||||
                            FROM alarmOrion_OrionAlarmRecord record 
 | 
			
		||||
                            JOIN (
 | 
			
		||||
                                SELECT sourceorder.* ,temp_source.source
 | 
			
		||||
                                FROM alarmorion_orionalarmsourceorder sourceorder
 | 
			
		||||
                                JOIN alarmorion_orionalarmsource temp_source ON sourceorder.alarmSource = temp_source.id
 | 
			
		||||
		                            SELECT sourceorder.* ,temp_source.source
 | 
			
		||||
		                            FROM alarmOrion_OrionAlarmSourceOrder sourceorder
 | 
			
		||||
		                            JOIN alarmOrion_OrionAlarmSource temp_source ON sourceorder.alarmSource = temp_source.id
 | 
			
		||||
                            ) temp_path ON record.id = temp_path.alarm
 | 
			
		||||
                            JOIN(
 | 
			
		||||
                                  SELECT 
 | 
			
		||||
                                      val.alarm,
 | 
			
		||||
                                      val.value AS source_msg
 | 
			
		||||
                                  FROM alarmorion_orionalarmfacetvalue val 
 | 
			
		||||
                                  JOIN alarmorion_orionalarmfacetname nam ON val.facetName = nam.id AND nam.facetName = 'msgText'
 | 
			
		||||
			                            SELECT 
 | 
			
		||||
					                            val.alarm,
 | 
			
		||||
					                            val.value AS source_msg
 | 
			
		||||
			                            FROM alarmOrion_OrionAlarmFacetValue val 
 | 
			
		||||
			                            JOIN alarmOrion_OrionAlarmFacetName nam ON val.facetName = nam.id AND nam.facetName = 'msgText'
 | 
			
		||||
                            ) temp_msg ON record.id = temp_msg.alarm
 | 
			
		||||
                            JOIN alarmorion_orionalarmclass class ON record.alarmClass = class.id
 | 
			
		||||
                            JOIN alarmOrion_OrionAlarmClass class ON record.alarmClass = class.id
 | 
			
		||||
                            WHERE from_unixtime(record.timestamp/1000,'%Y-%m-%d %H:%i:%s') BETWEEN @StartTimestamp AND @EndTimeStamp";
 | 
			
		||||
 | 
			
		||||
                if (post.IsSolve != 0)
 | 
			
		||||
@ -183,8 +183,8 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                var sql_device = $@"SELECT * 
 | 
			
		||||
                                    FROM device d 
 | 
			
		||||
                                    WHERE d.deleted = 0 
 | 
			
		||||
                                        AND d.building_guid = @building_guid
 | 
			
		||||
                                        AND d.main_system_guid IN @main_system_guids";
 | 
			
		||||
                                        AND d.device_building_tag = @building_tag
 | 
			
		||||
                                        AND d.device_system_tag IN @main_system_tag";
 | 
			
		||||
 | 
			
		||||
                var devices = await frontendRepository.GetAllAsync<Device>(sql_device, post);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -532,6 +532,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                                    left join device_master dm ON d.device_building_tag = dm.device_building_tag 
 | 
			
		||||
                                                              AND d.device_name_tag = dm.device_name_tag
 | 
			
		||||
                                    left join device_item di ON d.device_name_tag = di.device_name_tag 
 | 
			
		||||
                                                              AND di.device_building_tag = '{post.building_tag}'
 | 
			
		||||
                                                              AND di.deleted = 0 
 | 
			
		||||
                                                              AND di.is_show_riserDiagram = 1
 | 
			
		||||
                                    left join floor f on d.device_floor_tag = f.full_name and f.deleted = 0
 | 
			
		||||
@ -581,41 +582,41 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                    {
 | 
			
		||||
                        var device_url = string.Empty;
 | 
			
		||||
 | 
			
		||||
                        if (((de.icon_click & 1) > 0) && !string.IsNullOrEmpty(de.icon_click_url))
 | 
			
		||||
                        if (((de.left_icon_click & 1) > 0) && !string.IsNullOrEmpty(de.left_icon_click_url))
 | 
			
		||||
                        {
 | 
			
		||||
                            device_url = de.icon_click_url;
 | 
			
		||||
                            device_url = de.left_icon_click_url;
 | 
			
		||||
                            //點擊顯示系統圖
 | 
			
		||||
                            if (de.icon_click_url.Contains("[device_building_tag]"))
 | 
			
		||||
                            if (de.left_icon_click_url.Contains("[device_building_tag]"))
 | 
			
		||||
                            {
 | 
			
		||||
                                device_url = device_url.Replace("[device_building_tag]", de.device_building_tag);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (de.icon_click_url.Contains("[device_system_tag]"))
 | 
			
		||||
                            if (de.left_icon_click_url.Contains("[device_system_tag]"))
 | 
			
		||||
                            {
 | 
			
		||||
                                device_url = device_url.Replace("[device_system_tag]", de.device_system_tag);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (de.icon_click_url.Contains("[device_floor_tag]"))
 | 
			
		||||
                            if (de.left_icon_click_url.Contains("[device_floor_tag]"))
 | 
			
		||||
                            {
 | 
			
		||||
                                device_url = device_url.Replace("[device_floor_tag]", de.device_floor_tag);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (de.icon_click_url.Contains("[device_name_tag]"))
 | 
			
		||||
                            if (de.left_icon_click_url.Contains("[device_name_tag]"))
 | 
			
		||||
                            {
 | 
			
		||||
                                device_url = device_url.Replace("[device_name_tag]", de.device_name_tag);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (de.icon_click_url.Contains("[device_serial_tag]"))
 | 
			
		||||
                            if (de.left_icon_click_url.Contains("[device_serial_tag]"))
 | 
			
		||||
                            {
 | 
			
		||||
                                device_url = device_url.Replace("[device_serial_tag]", de.device_serial_tag);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (de.icon_click_url.Contains("[tag_name]"))
 | 
			
		||||
                            if (de.left_icon_click_url.Contains("[tag_name]"))
 | 
			
		||||
                            {
 | 
			
		||||
                                device_url = device_url.Replace("[tag_name]", de.device_number);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            de.icon_click_url = null;
 | 
			
		||||
                            de.left_icon_click_url = null;
 | 
			
		||||
                            de.DeviceURL = device_url;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
@ -641,7 +642,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                        //    priority = de.priority,
 | 
			
		||||
                        //    status = de.status,
 | 
			
		||||
                        //    DeviceURL = device_url,
 | 
			
		||||
                        //    icon_click = de.icon_click
 | 
			
		||||
                        //    left_icon_click = de.left_icon_click
 | 
			
		||||
                        //};
 | 
			
		||||
                        //afloor.device.Add(device);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -581,8 +581,8 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                                        LENGTH(SUBSTRING_INDEX(errmsg, '_', -1) -1) -- 最後一段的長度
 | 
			
		||||
                                        -1 -- 減掉最後的 _ ex:D3_B_B1F_CO_
 | 
			
		||||
                                       ) device_tag
 | 
			
		||||
                                  FROM alarmorion_orionalarmrecord a 
 | 
			
		||||
                                    JOIN alarmorion_orionalarmfacetvalue b on a.id = b.alarm
 | 
			
		||||
                                  FROM alarmOrion_OrionAlarmRecord a 
 | 
			
		||||
                                    JOIN alarmOrion_OrionAlarmFacetValue b on a.id = b.alarm
 | 
			
		||||
                                   WHERE a.sourceState = 1 and b.facetName = 9
 | 
			
		||||
                                 ) a 
 | 
			
		||||
                                 left join device b on a.device_tag = b.device_number AND b.deleted = 0
 | 
			
		||||
@ -618,12 +618,12 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                var device_amount_sql = $@"SELECT 
 | 
			
		||||
                                            d.building_guid, 
 | 
			
		||||
                                            d.device_building_tag, 
 | 
			
		||||
                                            COUNT(*) AS device_amount
 | 
			
		||||
                                            FROM device d
 | 
			
		||||
                                            WHERE d.deleted = 0
 | 
			
		||||
                                            AND d.device_number IN @devices
 | 
			
		||||
                                            GROUP BY d.building_guid";
 | 
			
		||||
                                            GROUP BY d.device_building_tag";
 | 
			
		||||
                alarmObj.buildingAlarmDeviceAmount = await frontendRepository.GetAllAsync<BuildingAlarmDeviceAmount>(device_amount_sql, new { devices = alarmObj.alarmorion.Select(x => x.device_number).ToList() });
 | 
			
		||||
 | 
			
		||||
                apiResult.Data = alarmObj;
 | 
			
		||||
 | 
			
		||||
@ -90,7 +90,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Emergency_member_tables = await backendRepository.GetAllAsync<EmergencyContactTable>($@"
 | 
			
		||||
                    select  v.system_key groupingName,va.system_key departmentName,* from emergency_member em left join variable v on em.grouping = v.id
 | 
			
		||||
                    select v.system_key groupingName,va.system_key departmentName, em.* from emergency_member em left join variable v on em.grouping = v.id
 | 
			
		||||
                    left join (select * from variable vs where vs.system_type = 'department' and vs.deleted = 0) va on va.system_value = em.department
 | 
			
		||||
                    where em.grouping in @groupinglist and em.deleted = 0", new { groupinglist = selectgroupidlist });
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
@ -120,7 +120,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var Emergency_member_tables = await backendRepository.GetAllAsync<EmergencyContactTable>($@"
 | 
			
		||||
                    select  v.system_key groupingName,va.system_key departmentName,* from emergency_member em left join variable v on em.grouping = v.id
 | 
			
		||||
                    select v.system_key groupingName,va.system_key departmentName, em.* from emergency_member em left join variable v on em.grouping = v.id
 | 
			
		||||
                    left join (select * from variable vs where vs.system_type = 'department' and vs.deleted = 0) va on va.system_value = em.department
 | 
			
		||||
                    where em.grouping in @groupinglist and em.deleted = 0", new { groupinglist = post.groupidlist });
 | 
			
		||||
                using (var doc = new Document())
 | 
			
		||||
@ -236,7 +236,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var Emergency_member_tables = await backendRepository.GetAllAsync<EmergencyContactTable>($@"
 | 
			
		||||
                    select  v.system_key groupingName,va.system_key departmentName,* from emergency_member em left join variable v on em.grouping = v.id
 | 
			
		||||
                    select v.system_key groupingName,va.system_key departmentName, em.* from emergency_member em left join variable v on em.grouping = v.id
 | 
			
		||||
                    left join (select * from variable vs where vs.system_type = 'department' and vs.deleted = 0) va on va.system_value = em.department
 | 
			
		||||
                    where em.grouping in @groupinglist and em.deleted = 0", new { groupinglist = post.groupidlist });
 | 
			
		||||
                var sheet = workbook.CreateSheet(post.disaster + "-聯絡清單");
 | 
			
		||||
 | 
			
		||||
@ -70,15 +70,15 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            List<BuildingToF> buildingToF = new List<BuildingToF>();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var sqlString = @$"select f.floor_guid ,f.full_name floorname,b.building_guid,b.full_name buildingname from floor f left join building b on b.building_guid = f.building_guid order by f.building_guid , f.priority";
 | 
			
		||||
                var sqlString = @$"select f.floor_guid ,f.full_name floorname,b.building_tag,b.full_name buildingname from floor f left join building b on b.building_tag = f.building_tag order by f.building_tag , f.priority";
 | 
			
		||||
                Building_floor = await backendRepository.GetAllAsync<building_floor>(sqlString);
 | 
			
		||||
 | 
			
		||||
                var builds = Building_floor.GroupBy(a => a.building_guid).ToList();
 | 
			
		||||
                var builds = Building_floor.GroupBy(a => a.building_tag).ToList();
 | 
			
		||||
                foreach (var floor in builds)
 | 
			
		||||
                {
 | 
			
		||||
                    BuildingToF buildingToF1 = new BuildingToF()
 | 
			
		||||
                    {
 | 
			
		||||
                        building_guid = floor.Select(a => a.building_guid).FirstOrDefault(),
 | 
			
		||||
                        building_tag = floor.Select(a => a.building_tag).FirstOrDefault(),
 | 
			
		||||
                        building_name = floor.Select(a => a.buildingname).FirstOrDefault(),
 | 
			
		||||
                        floors = new List<FloorForB>()
 | 
			
		||||
                    };
 | 
			
		||||
@ -125,7 +125,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                                    d.device_guid,
 | 
			
		||||
                                    d.device_number,
 | 
			
		||||
                                    d.full_name AS device_name,
 | 
			
		||||
                                    d.building_guid,
 | 
			
		||||
                                    d.device_building_tag,
 | 
			
		||||
                                    b.full_name AS building_name,
 | 
			
		||||
                                    CONCAT(b.ip_address , ':', b.ip_port) AS ip_address,
 | 
			
		||||
                                    v.layer2,
 | 
			
		||||
@ -137,27 +137,27 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                                    floor.full_name floorname,
 | 
			
		||||
                                    floor.floor_guid floorguid
 | 
			
		||||
                                    from 
 | 
			
		||||
                                        (SELECT * 
 | 
			
		||||
                                            FROM device d
 | 
			
		||||
                                        WHERE d.deleted = 0 
 | 
			
		||||
                                          AND d.building_guid = '{selectdevice.selectbuilding}'
 | 
			
		||||
                                          AND d.floor_guid in @floor
 | 
			
		||||
                                          AND d.device_system_category_layer3 IN @layer3) d
 | 
			
		||||
                                    left join floor on floor.floor_guid = d.floor_guid
 | 
			
		||||
		                            (SELECT * 
 | 
			
		||||
				                            FROM device d
 | 
			
		||||
		                            WHERE d.deleted = 0 
 | 
			
		||||
			                            AND d.device_building_tag = '{selectdevice.selectbuilding}'
 | 
			
		||||
			                            AND d.device_floor_tag in @floor
 | 
			
		||||
			                            AND d.device_name_tag IN @layer3) d
 | 
			
		||||
                                    left join floor on floor.full_name = d.device_floor_tag and floor.building_tag = d.device_building_tag
 | 
			
		||||
                                    left join (
 | 
			
		||||
                                                SELECT 
 | 
			
		||||
                                                    v.*,
 | 
			
		||||
                                                    v2.system_key AS layer2_name,
 | 
			
		||||
                                                    v2.system_value AS layer2
 | 
			
		||||
                                                FROM (
 | 
			
		||||
                                                    select * 
 | 
			
		||||
                                                    from variable v 
 | 
			
		||||
                                                    where v.system_type = 'device_system_category_layer3') v
 | 
			
		||||
                                                LEFT JOIN variable v2 ON v2.deleted = 0 AND v.system_parent_id = v2.id
 | 
			
		||||
                                              ) v on v.system_value = d.device_system_category_layer3
 | 
			
		||||
						                SELECT 
 | 
			
		||||
								                v.*,
 | 
			
		||||
								                v2.system_key AS layer2_name,
 | 
			
		||||
								                v2.system_value AS layer2
 | 
			
		||||
						                FROM (
 | 
			
		||||
								                select * 
 | 
			
		||||
								                from variable v 
 | 
			
		||||
								                where v.system_type = 'device_system_category_layer3') v
 | 
			
		||||
						                LEFT JOIN variable v2 ON v2.deleted = 0 AND v.system_parent_id = v2.id
 | 
			
		||||
					                ) v on v.system_value = d.device_system_category_layer3
 | 
			
		||||
                                    left join device_disaster dd on dd.device_guid = d.device_guid
 | 
			
		||||
                                    left join (select * from variable v where v.system_type = 'disaster') ddd on ddd.system_value = dd.device_system_value
 | 
			
		||||
                                    LEFT JOIN building b ON b.deleted = 0 AND d.building_guid = b.building_guid
 | 
			
		||||
                                    LEFT JOIN building b ON b.deleted = 0 AND d.device_building_tag = b.building_tag
 | 
			
		||||
                                    where dd.device_system_value IN @disasters
 | 
			
		||||
                                    ORDER BY d.device_number
 | 
			
		||||
                                    ";
 | 
			
		||||
@ -194,7 +194,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                    {
 | 
			
		||||
                        {"@emergency_event_guid",newguid},
 | 
			
		||||
                        {"@disaster",eventpost.disaster},
 | 
			
		||||
                        {"@building_guid", eventpost.build},
 | 
			
		||||
                        {"@building_tag", eventpost.build},
 | 
			
		||||
                        {"@device_guid",eventpost.device },
 | 
			
		||||
                        {"@type",eventpost.type}
 | 
			
		||||
                    };
 | 
			
		||||
@ -267,7 +267,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Emergency_Setting_tables = await backendRepository.GetAllAsync<EmergencySettingTable>($@"
 | 
			
		||||
                    select v.system_key big_setting_name,* from emergency_setting es left join variable v on es.big_setting = v.id
 | 
			
		||||
                    select v.system_key big_setting_name,es.* from emergency_setting es left join variable v on es.big_setting = v.id
 | 
			
		||||
                    where es.big_setting = {selectsetting} and es.deleted = 0 order by es.priority");
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
                apiResult.Data = Emergency_Setting_tables;
 | 
			
		||||
@ -296,7 +296,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var Emergency_Setting_tables = await backendRepository.GetOneAsync<EmergencyitemWithguid>($@"
 | 
			
		||||
                    select v.system_key big_setting_name,* from emergency_setting es left join variable v on es.big_setting = v.id
 | 
			
		||||
                    select v.system_key big_setting_name,es.* from emergency_setting es left join variable v on es.big_setting = v.id
 | 
			
		||||
                    where es.emergency_guid = '{post.emergency_guid}'");
 | 
			
		||||
 | 
			
		||||
                if (post.make_item == 1)
 | 
			
		||||
@ -451,7 +451,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Emergency_member_tables = await backendRepository.GetAllAsync<EmergencyContactTable>($@"
 | 
			
		||||
                    select  v.system_key groupingName,va.system_key departmentName,* from emergency_member em left join variable v on em.grouping = v.id
 | 
			
		||||
                    select v.system_key groupingName,va.system_key departmentName, em.* from emergency_member em left join variable v on em.grouping = v.id
 | 
			
		||||
                    left join (select * from variable vs where vs.system_type = 'department' and vs.deleted = 0) va on va.system_value = em.department
 | 
			
		||||
                    where em.grouping in @groupinglist and em.deleted = 0", new { groupinglist = selectgroupidlist });
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
@ -486,13 +486,16 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                getDeviceGroup = await backendRepository.GetAllAsync<EmergencyDeviceGroup>($@"
 | 
			
		||||
                    select dg.*,vd.system_key disater_name,b.full_name building_name,f.full_name floor_name,v2.system_key system_category_layer2,v3.system_key system_category_layer3 from (SELECT * FROM device_group dg WHERE dg.device_disaster != 0) dg
 | 
			
		||||
                    left join (select * from variable v where v.system_type = 'disaster' and v.deleted = 0) vd on vd.system_value = dg.device_disaster
 | 
			
		||||
                    left join building b on b.building_guid = dg.device_building_guid
 | 
			
		||||
                    left join floor f on f.floor_guid = dg.device_floor_guid
 | 
			
		||||
                    left join (select * from variable v where v.system_type = 'device_system_category_layer2' and v.deleted = 0) v2 on v2.system_value = dg.device_system_category_layer2
 | 
			
		||||
                    left join (select * from variable v where v.system_type = 'device_system_category_layer3' and v.deleted = 0) v3 on v3.system_value = dg.device_system_category_layer3
 | 
			
		||||
                    order by vd.system_priority,b.priority,f.priority,v2.system_priority,v3.system_priority");
 | 
			
		||||
                   select dg.*,vd.system_key disater_name,b.full_name building_name,f.full_name floor_name,v2.system_key system_category_layer2,v3.system_key system_category_layer3
 | 
			
		||||
                    from (
 | 
			
		||||
	                    SELECT *
 | 
			
		||||
	                    FROM device_group dg WHERE dg.device_disaster != 0) dg
 | 
			
		||||
	                    left join (select * from variable v where v.system_type = 'disaster' and v.deleted = 0) vd on vd.system_value = dg.device_disaster
 | 
			
		||||
	                    left join building b on b.building_tag = dg.device_building_tag
 | 
			
		||||
	                    left join floor f on f.floor_guid = dg.device_floor_guid
 | 
			
		||||
	                    left join (select * from variable v where v.system_type = 'device_system_category_layer2' and v.deleted = 0) v2 on v2.system_value = dg.device_system_category_layer2
 | 
			
		||||
	                    left join (select * from variable v where v.system_type = 'device_system_category_layer3' and v.deleted = 0) v3 on v3.system_value = dg.device_system_category_layer3
 | 
			
		||||
                      order by vd.system_priority,b.priority,f.priority,v2.system_priority,v3.system_priority");
 | 
			
		||||
 | 
			
		||||
                var dis = getDeviceGroup.GroupBy(a => a.device_disaster);
 | 
			
		||||
                //finalDeviceGroup.disaster = new List<KeyValue>();
 | 
			
		||||
@ -504,13 +507,13 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                        Name = diss.Select(a => a.disater_name).FirstOrDefault().ToString(),
 | 
			
		||||
                        groupBuildings = new List<GroupBuildings>()
 | 
			
		||||
                    };
 | 
			
		||||
                    var buds = diss.GroupBy(a => a.device_building_guid);
 | 
			
		||||
                    var buds = diss.GroupBy(a => a.device_building_tag);
 | 
			
		||||
                    getDeviceGroup1.groupBuildings = new List<GroupBuildings>();
 | 
			
		||||
                    foreach (var bud in buds)
 | 
			
		||||
                    {
 | 
			
		||||
                        GroupBuildings groupBuildings = new GroupBuildings()
 | 
			
		||||
                        {
 | 
			
		||||
                            guid = bud.Key,
 | 
			
		||||
                            tag = bud.Key,
 | 
			
		||||
                            name = bud.Select(a => a.building_name).FirstOrDefault().ToString(),
 | 
			
		||||
                            device_amount = 0,
 | 
			
		||||
                            groupFloors = new List<GroupFloor>()
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var sqlString = @$"select building_guid as Value, full_name as Name from building a where a.deleted = 0 and a.status = 0";
 | 
			
		||||
                var sqlString = @$"select building_tag as Value, full_name as Name from building a where a.deleted = 0 and a.status = 0";
 | 
			
		||||
                KeyValue = await backendRepository.GetAllAsync<KeyValue>(sqlString);
 | 
			
		||||
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
@ -74,8 +74,8 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                    select d.device_number device_name,v.system_key disaster_name,ee.*,b.full_name building_name from emergency_event ee 
 | 
			
		||||
                    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 building b on b.building_guid = ee.building_guid
 | 
			
		||||
                    where ee.deleted = 0 and ee.building_guid = '{post.selectaBuild}' and ee.disaster = '{post.selectaDisaster}'  {sqlplus}
 | 
			
		||||
                    left join building b on b.building_tag = ee.building_tag
 | 
			
		||||
                    where ee.deleted = 0 and ee.building_tag = '{post.selectaBuild}' and ee.disaster = '{post.selectaDisaster}'  {sqlplus}
 | 
			
		||||
                    ");
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
                apiResult.Data = EmergencyRecordEvent;
 | 
			
		||||
 | 
			
		||||
@ -825,7 +825,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
 | 
			
		||||
                return Ok(apiResult);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            apiResult.Code = "0000";
 | 
			
		||||
            return Ok(apiResult);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1118,27 +1118,27 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            {
 | 
			
		||||
                //依據被選擇的設備找出相對應資料
 | 
			
		||||
                var sqlDeviceItemInfo = $@"select 
 | 
			
		||||
			                                    b.full_name as building_name,
 | 
			
		||||
			                                    v1.system_key as Main_system_name,
 | 
			
		||||
			                                    v2.system_key as Sub_system_name,
 | 
			
		||||
			                                    temp.device_number,
 | 
			
		||||
			                                    temp.device_name,
 | 
			
		||||
			                                    temp.full_name as item_name,
 | 
			
		||||
			                                    temp.points,
 | 
			
		||||
			                                    temp.unit
 | 
			
		||||
		                                    from (
 | 
			
		||||
			                                    select 
 | 
			
		||||
				                                    di.*,
 | 
			
		||||
				                                    d.device_number,
 | 
			
		||||
				                                    d.full_name as device_name,
 | 
			
		||||
				                                    d.priority
 | 
			
		||||
			                                    from device_item di
 | 
			
		||||
			                                    inner join device d on di.device_building_tag COLLATE utf8mb4_unicode_ci = d.device_building_tag 
 | 
			
		||||
																		and di.device_system_tag COLLATE utf8mb4_unicode_ci = d.device_system_tag
 | 
			
		||||
																		and di.device_name_tag COLLATE utf8mb4_unicode_ci = d.device_name_tag
 | 
			
		||||
                                                                        and d.deleted = 0
 | 
			
		||||
			                                    where di.deleted = 0 and di.unit is not null and d.device_number IN @Device_number
 | 
			
		||||
		                                    ) temp
 | 
			
		||||
			                                            b.full_name as building_name,
 | 
			
		||||
			                                            v1.system_key as Main_system_name,
 | 
			
		||||
			                                            v2.system_key as Sub_system_name,
 | 
			
		||||
			                                            temp.device_number,
 | 
			
		||||
			                                            temp.device_name,
 | 
			
		||||
			                                            temp.full_name as item_name,
 | 
			
		||||
			                                            temp.points,
 | 
			
		||||
			                                            temp.unit
 | 
			
		||||
		                                            from (
 | 
			
		||||
			                                            select 
 | 
			
		||||
				                                            di.*,
 | 
			
		||||
				                                            d.device_number,
 | 
			
		||||
				                                            d.full_name as device_name,
 | 
			
		||||
				                                            d.priority
 | 
			
		||||
			                                            from device_item di
 | 
			
		||||
			                                            inner join device d on di.device_building_tag COLLATE utf8mb4_unicode_ci = d.device_building_tag 
 | 
			
		||||
																			    and di.device_system_tag COLLATE utf8mb4_unicode_ci = d.device_system_tag
 | 
			
		||||
																			    and di.device_name_tag COLLATE utf8mb4_unicode_ci = d.device_name_tag
 | 
			
		||||
                                                                                and d.deleted = 0
 | 
			
		||||
			                                            where di.deleted = 0 and di.unit is not null and d.device_number = @Device_number
 | 
			
		||||
		                                            ) temp
 | 
			
		||||
                                            inner join building b on temp.device_building_tag COLLATE utf8mb4_unicode_ci = b.building_tag and b.deleted = 0
 | 
			
		||||
                                            inner join variable v1 on temp.device_system_tag COLLATE utf8mb4_unicode_ci = v1.system_value and v1.deleted = 0 and v1.system_type = 'device_system_category_layer2'
 | 
			
		||||
                                            inner join variable v2 on temp.device_name_tag COLLATE utf8mb4_unicode_ci = v2.system_value and v2.deleted = 0 and v2.system_type = 'device_system_category_layer3'
 | 
			
		||||
@ -1151,7 +1151,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                    var tableName = await backgroundServiceMsSqlRepository.GetOneAsync<string>($"select table_name from INFORMATION_SCHEMA.TABLES where table_name like '%{device_number}_{point}%'");
 | 
			
		||||
                    if (!string.IsNullOrEmpty(tableName))
 | 
			
		||||
                    {
 | 
			
		||||
                        var device_item_infos = await frontendRepository.GetAllAsync<DeviceItemInfo>(sqlDeviceItemInfo, new { Device_number = hi.Device_number_point });
 | 
			
		||||
                        var device_item_infos = await frontendRepository.GetAllAsync<DeviceItemInfo>(sqlDeviceItemInfo, new { Device_number = device_number });
 | 
			
		||||
 | 
			
		||||
                        var device_item_info = device_item_infos.Where(x => x.Device_number == device_number && x.Points == point).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
@ -1170,7 +1170,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                    //{
 | 
			
		||||
                    //}
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
                apiResult.Data = apiResult.Data.OrderBy(x => x.Device_number).ThenBy(x => x.Timestamp).ToList();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception exception)
 | 
			
		||||
 | 
			
		||||
@ -87,6 +87,8 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
 | 
			
		||||
                var table = input.tableType == "year" ? "archive_electric_meter_day" : "archive_electric_meter_" + input.tableType;
 | 
			
		||||
                var dateFormat = input.tableType == "day" || input.tableType == "week" ? "%Y-%m-%d" : input.tableType == "month" ? "%Y-%m" : input.tableType == "year" ? "%Y" : null;
 | 
			
		||||
                var aemmEndDate = input.tableType == "year" ? $"year(DATE_ADD(fd.date, INTERVAL +1 {input.tableType}))" : $"DATE_ADD(fd.date, INTERVAL +1 {input.tableType})";
 | 
			
		||||
                var aemmStaDate = input.tableType == "year" ? "year(fd.date)" : "fd.date";
 | 
			
		||||
                var sql = $@"set @i = -1;
 | 
			
		||||
                            select fd.device_number, aemm.avg_rawdata, DATE_FORMAT(fd.date, @dateFormat) as timestamp
 | 
			
		||||
                            from (
 | 
			
		||||
@ -111,7 +113,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
		                            from {table}
 | 
			
		||||
 		                            where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' and SUBSTRING_INDEX(device_number, '_', 1) = @building_tag
 | 
			
		||||
                                    {sqlWhere} {sqlGroup}
 | 
			
		||||
                            ) aemm on aemm.start_timestamp >= fd.date and aemm.end_timestamp < DATE_ADD(fd.date, INTERVAL +1 {input.tableType}) and aemm.device_number = fd.device_number
 | 
			
		||||
                            ) aemm on aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} and aemm.device_number = fd.device_number
 | 
			
		||||
                            order by fd.device_number, fd.date";
 | 
			
		||||
                var rawData = await backendRepository.GetAllAsync<HydroMeterRawDataOutput>(sql,
 | 
			
		||||
                                new { startTime = startTime, endtime = endTime, building_tag = input.building_tag, floor_tag = input.floor_tag, dateFormat = dateFormat });
 | 
			
		||||
 | 
			
		||||
@ -58,8 +58,8 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                ControllerContext.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
 | 
			
		||||
                EDFunction eDFunction = new EDFunction();
 | 
			
		||||
 | 
			
		||||
                string SHA256Pwd = eDFunction.GetSHA256Encryption(login.password);
 | 
			
		||||
                var User = await backendRepository.GetOneAsync<User>("userinfo", @$"account = '{login.account}' and password = '{SHA256Pwd}' and deleted = 0");
 | 
			
		||||
                //string SHA256Pwd = eDFunction.GetSHA256Encryption(login.password);
 | 
			
		||||
                var User = await backendRepository.GetOneAsync<User>("userinfo", @$"account = '{login.account}' and deleted = 0");
 | 
			
		||||
                if (User == null)
 | 
			
		||||
                {
 | 
			
		||||
                    apiResult.Code = "9998";
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var sqlString = @$"select floor_guid as Value, full_name as Name from floor a where a.deleted = 0 and a.building_guid = '{Building}' and a.status = 0 order by a.priority";
 | 
			
		||||
                var sqlString = @$"select floor_guid as Value, full_name as Name from floor a where a.deleted = 0 and a.building_tag = '{Building}' and a.status = 0 order by a.priority";
 | 
			
		||||
                KeyValue = await backendRepository.GetAllAsync<KeyValue>(sqlString);
 | 
			
		||||
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
@ -61,7 +61,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
            ApiResult<List<RescueDeviceTable>> apiResult = new ApiResult<List<RescueDeviceTable>>();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                RescueDeviceTables = await backendRepository.GetAllAsync<RescueDeviceTable>("rescue_device", $"building_guid = '{post.build}' and floor_guid in @floors and rescue_device_kind = {post.kind}", new { floors = post.floors }, "floor_name");
 | 
			
		||||
                RescueDeviceTables = await backendRepository.GetAllAsync<RescueDeviceTable>("rescue_device", $"building_tag = '{post.build}' and floor_guid in @floors and rescue_device_kind = {post.kind}", new { floors = post.floors }, "floor_name");
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
                apiResult.Data = RescueDeviceTables;
 | 
			
		||||
            }
 | 
			
		||||
@ -88,7 +88,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var sqlString = @$"select building_guid as Value, full_name as Name from building a where a.deleted = 0 and a.status = 0 ORDER BY A.priority ASC, A.created_at DESC";
 | 
			
		||||
                var sqlString = @$"select building_tag as Value, full_name as Name from building a where a.deleted = 0 and a.status = 0 ORDER BY a.priority ASC, a.created_at DESC";
 | 
			
		||||
                KeyValue = await backendRepository.GetAllAsync<KeyValue>(sqlString);
 | 
			
		||||
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
@ -159,7 +159,7 @@ namespace FrontendWebApi.ApiControllers
 | 
			
		||||
                devicename = "AED";
 | 
			
		||||
            }
 | 
			
		||||
            var sheet = workbook.CreateSheet(devicename);
 | 
			
		||||
            var RescueDevices = backendRepository.GetAllAsync<RescueDevice>("rescue_device", $"building_guid = '{postObject.build}' and rescue_device_kind = {postObject.kind}",null, "floor_name");
 | 
			
		||||
            var RescueDevices = backendRepository.GetAllAsync<RescueDevice>("rescue_device", $"building_tag = '{postObject.build}' and rescue_device_kind = {postObject.kind}",null, "floor_name");
 | 
			
		||||
            int RowPosition = 0;
 | 
			
		||||
            IRow row = sheet.CreateRow(RowPosition);
 | 
			
		||||
            ICell cell = row.CreateCell(1);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								FrontendWebApi/Controllers/EmergencyContactController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								FrontendWebApi/Controllers/EmergencyContactController.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
using FrontendWebApi.Models;
 | 
			
		||||
using iTextSharp.text;
 | 
			
		||||
using iTextSharp.text.html.simpleparser;
 | 
			
		||||
using iTextSharp.text.pdf;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
using NPOI.SS.UserModel;
 | 
			
		||||
using NPOI.XSSF.UserModel;
 | 
			
		||||
using Repository.BackendRepository.Interface;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FrontendWebApi.Controllers
 | 
			
		||||
{
 | 
			
		||||
    public class EmergencyContactController : MyBaseController<EmergencyContactController>
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IBackendRepository backendRepository;
 | 
			
		||||
        public EmergencyContactController(IBackendRepository backendRepository)
 | 
			
		||||
        {
 | 
			
		||||
            this.backendRepository = backendRepository;
 | 
			
		||||
        }
 | 
			
		||||
        public IActionResult Index()
 | 
			
		||||
        {
 | 
			
		||||
            return View();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								FrontendWebApi/Controllers/EmergencyDeviceMenuController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								FrontendWebApi/Controllers/EmergencyDeviceMenuController.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FrontendWebApi.Controllers
 | 
			
		||||
{
 | 
			
		||||
    public class EmergencyDeviceMenuController : MyBaseController<EmergencyDeviceMenuController>
 | 
			
		||||
    {
 | 
			
		||||
        private readonly ILogger<EmergencyDeviceMenuController> _logger;
 | 
			
		||||
 | 
			
		||||
        public EmergencyDeviceMenuController(ILogger<EmergencyDeviceMenuController> logger)
 | 
			
		||||
        {
 | 
			
		||||
            _logger = logger;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IActionResult Index()
 | 
			
		||||
        {
 | 
			
		||||
            return View();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										48
									
								
								FrontendWebApi/Controllers/EmergencyRecordController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								FrontendWebApi/Controllers/EmergencyRecordController.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,48 @@
 | 
			
		||||
using FrontendWebApi.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Repository.BackendRepository.Interface;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FrontendWebApi.Controllers
 | 
			
		||||
{
 | 
			
		||||
    public class EmergencyRecordController : MyBaseController<EmergencyRecordController>
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IBackendRepository backendRepository;
 | 
			
		||||
        public EmergencyRecordController(IBackendRepository backendRepository)
 | 
			
		||||
        {
 | 
			
		||||
            this.backendRepository = backendRepository;
 | 
			
		||||
        }
 | 
			
		||||
        public IActionResult Index()
 | 
			
		||||
        {
 | 
			
		||||
            return View();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [HttpPost]
 | 
			
		||||
        public async Task<ApiResult<List<KeyValue>>> DisasterList()
 | 
			
		||||
        {
 | 
			
		||||
            ApiResult<List<KeyValue>> apiResult = new ApiResult<List<KeyValue>>();
 | 
			
		||||
            List<KeyValue> Variable = new List<KeyValue>();
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var sqlString = @$"select system_value as Value, system_key as Name from variable a where a.system_type = 'disaster' and a.deleted = 0";
 | 
			
		||||
                Variable = await backendRepository.GetAllAsync<KeyValue>(sqlString);
 | 
			
		||||
 | 
			
		||||
                apiResult.Code = "0000";
 | 
			
		||||
                apiResult.Data = Variable;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception exception)
 | 
			
		||||
            {
 | 
			
		||||
                apiResult.Code = "9999";
 | 
			
		||||
                apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
 | 
			
		||||
                Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return apiResult;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								FrontendWebApi/Controllers/HomeController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								FrontendWebApi/Controllers/HomeController.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FrontendWebApi.Controllers
 | 
			
		||||
{
 | 
			
		||||
    public class HomeController : MyBaseController<HomeController>
 | 
			
		||||
    {
 | 
			
		||||
        private readonly ILogger<HomeController> _logger;
 | 
			
		||||
 | 
			
		||||
        public HomeController(ILogger<HomeController> logger)
 | 
			
		||||
        {
 | 
			
		||||
            _logger = logger;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IActionResult Index()
 | 
			
		||||
        {
 | 
			
		||||
            return View();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								FrontendWebApi/Controllers/LoginController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								FrontendWebApi/Controllers/LoginController.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
using FrontendWebApi.Jwt;
 | 
			
		||||
using FrontendWebApi.Models;
 | 
			
		||||
using iTextSharp.text;
 | 
			
		||||
using iTextSharp.text.pdf;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
using NPOI.SS.UserModel;
 | 
			
		||||
using NPOI.XSSF.UserModel;
 | 
			
		||||
using Repository.BackendRepository.Interface;
 | 
			
		||||
using Repository.FrontendRepository.Interface;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Net;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FrontendWebApi.Controllers
 | 
			
		||||
{
 | 
			
		||||
    public class LoginController : Controller
 | 
			
		||||
    {
 | 
			
		||||
        private readonly ILogger<LoginController> logger;
 | 
			
		||||
        private readonly IBackendRepository backendRepository;
 | 
			
		||||
        private readonly IFrontendRepository frontendRepository;
 | 
			
		||||
        private readonly IJwtHelpers jwt;
 | 
			
		||||
        //string jwt_str = "login";
 | 
			
		||||
        protected MyUserInfo myUserInfo = null;
 | 
			
		||||
        protected JwtGet myUser;
 | 
			
		||||
        protected string jwt_str = null;
 | 
			
		||||
        protected bool jwtlife = true;
 | 
			
		||||
 | 
			
		||||
        public LoginController
 | 
			
		||||
        (
 | 
			
		||||
            ILogger<LoginController> logger,
 | 
			
		||||
            IBackendRepository backendRepository,
 | 
			
		||||
            IFrontendRepository frontendRepository,
 | 
			
		||||
            IJwtHelpers jwt
 | 
			
		||||
        )
 | 
			
		||||
        {
 | 
			
		||||
            this.logger = logger;
 | 
			
		||||
            this.jwt = jwt;
 | 
			
		||||
            this.backendRepository = backendRepository;
 | 
			
		||||
            this.frontendRepository = frontendRepository;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IActionResult Index(string jwt)
 | 
			
		||||
        {
 | 
			
		||||
            ViewBag.jwt = jwt;
 | 
			
		||||
            ViewBag.ProjectName = backendRepository.GetOneAsync<string>("select system_key from variable where deleted = 0 and system_type = 'project_name';").Result;
 | 
			
		||||
            return View();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										166
									
								
								FrontendWebApi/Controllers/MyBaseController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								FrontendWebApi/Controllers/MyBaseController.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,166 @@
 | 
			
		||||
using FrontendWebApi.Jwt;
 | 
			
		||||
using FrontendWebApi.Models;
 | 
			
		||||
using Microsoft.AspNetCore.Authorization;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc.Filters;
 | 
			
		||||
using Microsoft.Extensions.Configuration;
 | 
			
		||||
using Repository.BackendRepository.Interface;
 | 
			
		||||
using Repository.BaseRepository.Interface;
 | 
			
		||||
using Repository.FrontendRepository.Interface;
 | 
			
		||||
using Repository.Helper;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Microsoft.AspNetCore.Routing;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using Repository.BackendRepository.Implement;
 | 
			
		||||
 | 
			
		||||
namespace FrontendWebApi.Controllers
 | 
			
		||||
{
 | 
			
		||||
    public class MyBaseController<T> : Controller where T : MyBaseController<T>
 | 
			
		||||
    {
 | 
			
		||||
        private ILogger<T> _logger;
 | 
			
		||||
        protected ILogger<T> Logger => _logger ?? (_logger = HttpContext?.RequestServices.GetService<ILogger<T>>());
 | 
			
		||||
        private IJwtHelpers jwt => HttpContext?.RequestServices.GetService<IJwtHelpers>();
 | 
			
		||||
        private IFrontendRepository frontendRepository => HttpContext?.RequestServices.GetService<IFrontendRepository>();
 | 
			
		||||
 | 
			
		||||
        public MyBaseController() { }
 | 
			
		||||
        protected MyUserInfo myUserInfo = null;
 | 
			
		||||
        protected JwtGet myUser;
 | 
			
		||||
        protected string jwt_str = null;
 | 
			
		||||
        protected bool jwtlife = true;
 | 
			
		||||
        public string controllerName;
 | 
			
		||||
        public string actionName;
 | 
			
		||||
        public ErrorCode errorCode = new ErrorCode();
 | 
			
		||||
        [Authorize]
 | 
			
		||||
        public override void OnActionExecuting(ActionExecutingContext filterContext)
 | 
			
		||||
        {
 | 
			
		||||
            EDFunction edFunction = new EDFunction();
 | 
			
		||||
            var myAccount = edFunction.AESDecrypt(HttpContext.Session.GetString("MyApiAccount"));
 | 
			
		||||
            controllerName = ControllerContext.RouteData.Values["controller"].ToString();   //controller名稱
 | 
			
		||||
            actionName = ControllerContext.RouteData.Values["action"].ToString();   //action名稱
 | 
			
		||||
 | 
			
		||||
            //紀錄當前PID
 | 
			
		||||
            Process currentProcess = Process.GetCurrentProcess();
 | 
			
		||||
            Dictionary<string, object> updateProcess = new Dictionary<string, object>();
 | 
			
		||||
            updateProcess.Add("@system_value", currentProcess.Id.ToString());
 | 
			
		||||
 | 
			
		||||
            frontendRepository.UpdateProcessPID(updateProcess, "variable", "system_type = 'watchDogCongfig' AND system_key = 'AlarmPID'");
 | 
			
		||||
 | 
			
		||||
            bool isAjaxCall = filterContext.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest";
 | 
			
		||||
            if (string.IsNullOrEmpty(myAccount))
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
                if (isAjaxCall)
 | 
			
		||||
                {
 | 
			
		||||
                    filterContext.HttpContext.Response.Clear();
 | 
			
		||||
                    filterContext.HttpContext.Response.StatusCode = 499;
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    filterContext.Result = new RedirectToRouteResult(
 | 
			
		||||
                                        new RouteValueDictionary
 | 
			
		||||
                                        {
 | 
			
		||||
                                            {"controller", "Login"},
 | 
			
		||||
                                            {"action", "Index"}
 | 
			
		||||
                                        });
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                //取得當前登入使用者資訊
 | 
			
		||||
                myUserInfo = frontendRepository.GetMyUserInfoByAccount<MyUserInfo>(myAccount);
 | 
			
		||||
                var showview = frontendRepository.GetAllAsync<string>($@"select ap.ShowView from userinfo us
 | 
			
		||||
                    left join role_auth ra on ra.role_guid = us.role_guid
 | 
			
		||||
                    left join auth_page ap on ap.AuthCode = ra.AuthCode
 | 
			
		||||
                    where us.userinfo_guid = '{myUserInfo.Userinfo_guid}'");
 | 
			
		||||
                myUserInfo.ShowView = showview.Result;
 | 
			
		||||
                ViewBag.myUserInfo = myUserInfo;
 | 
			
		||||
                ViewBag.role = showview.Result;
 | 
			
		||||
 | 
			
		||||
                //var showviewt = new List<string>()
 | 
			
		||||
                //    {
 | 
			
		||||
                //        "EmergencyDeviceMenuIndex",
 | 
			
		||||
                //        "EmergencyContactIndex",
 | 
			
		||||
                //        "EmergencyRecordIndex",
 | 
			
		||||
                //        "RescueDeviceFireExtinguisher",
 | 
			
		||||
                //        "RescueDeviceAED",
 | 
			
		||||
                //    };
 | 
			
		||||
                //ViewBag.role = showviewt;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //var ctx = filterContext.HttpContext;
 | 
			
		||||
            //ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
 | 
			
		||||
            //ctx.Response.Headers.Add("Access-Control-Allow-Headers", "*");
 | 
			
		||||
            //ctx.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
 | 
			
		||||
            //var a = User.Claims.Select(p => new { Type = p.Type, Value = p.Value }).ToList();
 | 
			
		||||
            //myUser = new JwtGet()
 | 
			
		||||
            //{
 | 
			
		||||
            //    account = User.Claims.Where(a => a.Type == "account").Select(e => e.Value).FirstOrDefault(),
 | 
			
		||||
            //    email = User.Claims.Where(a => a.Type == "email").Select(e => e.Value).FirstOrDefault(),
 | 
			
		||||
            //    full_name = User.Claims.Where(a => a.Type == "full_name").Select(e => e.Value).FirstOrDefault(),
 | 
			
		||||
            //    exp = User.Claims.Where(a => a.Type == "exp").Select(e => Convert.ToInt32(e.Value)).FirstOrDefault(),
 | 
			
		||||
            //    nbf = User.Claims.Where(a => a.Type == "nbf").Select(e => Convert.ToInt32(e.Value)).FirstOrDefault(),
 | 
			
		||||
            //    userinfo_guid = User.Claims.Where(a => a.Type == "userinfo_guid").Select(e => e.Value).FirstOrDefault(),
 | 
			
		||||
            //};
 | 
			
		||||
 | 
			
		||||
            //TODO 模擬JWT,記得刪除
 | 
			
		||||
            //myUser.account = "Bajascript";
 | 
			
		||||
            //myUser.email = "asd@com";
 | 
			
		||||
            //myUser.full_name = "野原廣志";
 | 
			
		||||
            //myUser.exp = 3600;
 | 
			
		||||
            //myUser.userinfo_guid = "1EF9CEAC-4DBF-E2BE-8B1D-CB3014E0DA17";
 | 
			
		||||
 | 
			
		||||
            //if (myUser.exp == 0)
 | 
			
		||||
            //{
 | 
			
		||||
            //    jwt_str = "Jwt Token不合法";
 | 
			
		||||
            //    jwtlife = false;
 | 
			
		||||
 | 
			
		||||
            //    ViewBag.myUserInfo = null;
 | 
			
		||||
            //    ViewBag.role = null;
 | 
			
		||||
            //}
 | 
			
		||||
            //else
 | 
			
		||||
            //{
 | 
			
		||||
            //    if (myUser.exp <= DateTime.Now.AddHours(-8).AddMinutes(10).Subtract(new DateTime(1970, 1, 1)).TotalSeconds)
 | 
			
		||||
            //    {
 | 
			
		||||
            //        //取得當前登入使用者資訊
 | 
			
		||||
            //        myUserInfo = frontendRepository.GetMyUserInfoByAccount<MyUserInfo>(myUser.account);
 | 
			
		||||
            //        //var showview = frontendRepository.GetAllAsync<string>($@"select ap.ShowView from userinfo us
 | 
			
		||||
            //        //    left join role_auth ra on ra.role_guid = us.role_guid
 | 
			
		||||
            //        //    left join auth_page ap on ap.AuthCode = ra.AuthCode
 | 
			
		||||
            //        //    where us.userinfo_guid = '{myUserInfo.Userinfo_guid}'");
 | 
			
		||||
            //        //myUserInfo.ShowView = showview.Result;
 | 
			
		||||
            //        ViewBag.myUserInfo = myUserInfo;
 | 
			
		||||
 | 
			
		||||
            //        var showviewt = new List<string>()
 | 
			
		||||
            //        {
 | 
			
		||||
            //            "EmergencyDeviceMenuIndex",
 | 
			
		||||
            //            "EmergencyContactIndex",
 | 
			
		||||
            //            "EmergencyRecordIndex",
 | 
			
		||||
            //            "RescueDeviceFireExtinguisher",
 | 
			
		||||
            //            "RescueDeviceAED",
 | 
			
		||||
            //        };
 | 
			
		||||
            //        //ViewBag.role = showview.Result;
 | 
			
		||||
            //        ViewBag.role = showviewt;
 | 
			
		||||
 | 
			
		||||
            //        jwtlife = true;
 | 
			
		||||
            //        JwtLogin jwtLoing = new JwtLogin()
 | 
			
		||||
            //        {
 | 
			
		||||
            //            account = myUser.account,
 | 
			
		||||
            //            email = myUser.email,
 | 
			
		||||
            //            full_name = myUser.full_name,
 | 
			
		||||
            //            userinfo_guid = myUser.userinfo_guid
 | 
			
		||||
            //        };
 | 
			
		||||
            //        jwt_str = jwt.GenerateToken(jwtLoing).token;
 | 
			
		||||
            //    }
 | 
			
		||||
            //}
 | 
			
		||||
            base.OnActionExecuting(filterContext);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								FrontendWebApi/Controllers/RescueDeviceController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								FrontendWebApi/Controllers/RescueDeviceController.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.Extensions.Logging;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
using NPOI.HSSF.UserModel;
 | 
			
		||||
using NPOI.SS.UserModel;
 | 
			
		||||
using NPOI.XSSF.UserModel;
 | 
			
		||||
using Repository.BackendRepository.Interface;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FrontendWebApi.Controllers
 | 
			
		||||
{
 | 
			
		||||
    public class RescueDeviceController : MyBaseController<RescueDeviceController>
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IBackendRepository backendRepository;
 | 
			
		||||
 | 
			
		||||
        public RescueDeviceController(IBackendRepository backendRepository)
 | 
			
		||||
        {
 | 
			
		||||
            this.backendRepository = backendRepository;
 | 
			
		||||
        }
 | 
			
		||||
        public IActionResult FireExtinguisher()
 | 
			
		||||
        {
 | 
			
		||||
            return View();
 | 
			
		||||
        }
 | 
			
		||||
        public IActionResult AED()
 | 
			
		||||
        {
 | 
			
		||||
            return View();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -8,23 +8,23 @@ namespace FrontendWebApi.Models
 | 
			
		||||
{
 | 
			
		||||
    public class AlarmRecordPanelRawData
 | 
			
		||||
    {
 | 
			
		||||
        public string building_guid { get; set; }
 | 
			
		||||
        public string building_tag { get; set; }
 | 
			
		||||
        public string building_name { get; set; }
 | 
			
		||||
        public string main_system_guid { get; set; }
 | 
			
		||||
        public string main_system_name { get; set; }
 | 
			
		||||
        public string system_key { get; set; }
 | 
			
		||||
        public string system_value { get; set; }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    public class AlarmRecordPanel
 | 
			
		||||
    {
 | 
			
		||||
        public string building_guid { get; set; }
 | 
			
		||||
        public string building_tag { get; set; }
 | 
			
		||||
        public string building_name { get; set; }
 | 
			
		||||
        public List<MainSystemPanel> mainSystemPanels { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class MainSystemPanel
 | 
			
		||||
    {
 | 
			
		||||
        public string main_system_guid { get; set; }
 | 
			
		||||
        public string main_system_name { get; set; }
 | 
			
		||||
        public string system_key { get; set; }
 | 
			
		||||
        public string system_value { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class AlarmRecord
 | 
			
		||||
@ -52,8 +52,8 @@ namespace FrontendWebApi.Models
 | 
			
		||||
    {
 | 
			
		||||
        public string StartTimestamp { get; set; }
 | 
			
		||||
        public string EndTimestamp { get; set; }
 | 
			
		||||
        public string Building_guid { get; set; }
 | 
			
		||||
        public List<string> Main_system_guids { get; set; }
 | 
			
		||||
        public string Building_tag { get; set; }
 | 
			
		||||
        public List<string> Main_system_tag { get; set; }
 | 
			
		||||
        public byte IsSolve { get;set;}
 | 
			
		||||
        public byte IsAck { get;set;}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -186,10 +186,10 @@ namespace FrontendWebApi.Models
 | 
			
		||||
        public byte device_error_flashing { get; set; }
 | 
			
		||||
        public byte device_error_independent { get; set; }
 | 
			
		||||
        public int priority { get; set; }
 | 
			
		||||
        public byte icon_click { get; set; }
 | 
			
		||||
        public string icon_click_url { get; set; }
 | 
			
		||||
        public int icon_click_url_width { get; set; }
 | 
			
		||||
        public int icon_click_url_height { get; set; }
 | 
			
		||||
        public byte left_icon_click { get; set; }
 | 
			
		||||
        public string left_icon_click_url { get; set; }
 | 
			
		||||
        public int left_icon_click_url_width { get; set; }
 | 
			
		||||
        public int left_icon_click_url_height { get; set; }
 | 
			
		||||
        public string DeviceURL { get; set; }
 | 
			
		||||
        public string point_name { get; set; }
 | 
			
		||||
        public string points { get; set; }
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ namespace FrontendWebApi.Models
 | 
			
		||||
    public class EmergencyDeviceGroup
 | 
			
		||||
    {
 | 
			
		||||
        public string device_disaster { get; set; }
 | 
			
		||||
        public string device_building_guid { get; set; }
 | 
			
		||||
        public string device_building_tag { get; set; }
 | 
			
		||||
        public string device_floor_guid { get; set; }
 | 
			
		||||
        public string device_system_category_layer2 { get; set; }
 | 
			
		||||
        public string device_system_category_layer3 { get; set; }
 | 
			
		||||
@ -35,7 +35,7 @@ namespace FrontendWebApi.Models
 | 
			
		||||
 | 
			
		||||
    public class GroupBuildings
 | 
			
		||||
    {
 | 
			
		||||
        public string guid { get; set; }
 | 
			
		||||
        public string tag { get; set; }
 | 
			
		||||
        public string name { get; set; }
 | 
			
		||||
        public int device_amount { get; set; }
 | 
			
		||||
        public List<GroupFloor> groupFloors { get; set; }
 | 
			
		||||
@ -68,13 +68,13 @@ namespace FrontendWebApi.Models
 | 
			
		||||
    {
 | 
			
		||||
        public string floor_guid { get; set; }
 | 
			
		||||
        public string floorname { get; set; }
 | 
			
		||||
        public string building_guid { get; set; }
 | 
			
		||||
        public string building_tag { get; set; }
 | 
			
		||||
        public string buildingname { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class BuildingToF
 | 
			
		||||
    {
 | 
			
		||||
        public string building_guid { get; set; }
 | 
			
		||||
        public string building_tag { get; set; }
 | 
			
		||||
        public string building_name { get; set; }
 | 
			
		||||
        public List<FloorForB> floors { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
@ -89,7 +89,7 @@ namespace FrontendWebApi.Models
 | 
			
		||||
        public string device_guid { get; set; }
 | 
			
		||||
        public string device_number { get; set; }
 | 
			
		||||
        public string device_name { get; set; }
 | 
			
		||||
        public string building_guid { get; set; }
 | 
			
		||||
        public string building_tag { get; set; }
 | 
			
		||||
        public string building_name { get; set; }
 | 
			
		||||
        public string ip_address { get; set; }
 | 
			
		||||
        public string layer2 { get; set; }
 | 
			
		||||
 | 
			
		||||
@ -264,6 +264,7 @@ namespace FrontendWebApi.Models
 | 
			
		||||
    public class HistoryItem
 | 
			
		||||
    {
 | 
			
		||||
        public string Device_number_point { get; set; }
 | 
			
		||||
        public string Device_number { get; set; }
 | 
			
		||||
        public string Unit { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@ namespace FrontendWebApi.Models
 | 
			
		||||
    {
 | 
			
		||||
        public string rescue_device_guid { get; set; }
 | 
			
		||||
        public string rescue_device_id { get; set; }
 | 
			
		||||
        public string building_guid { get; set; }
 | 
			
		||||
        public string building_tag { get; set; }
 | 
			
		||||
        public string floor_guid { get; set; }
 | 
			
		||||
        public string floor_name { get; set; }
 | 
			
		||||
        public string location { get; set; }
 | 
			
		||||
 | 
			
		||||
@ -106,7 +106,7 @@
 | 
			
		||||
                    $(row).attr('guid', data.emergency_guid);
 | 
			
		||||
                },
 | 
			
		||||
                "ajax": {
 | 
			
		||||
                    "url": "/EmergencyContact/EmergencyContactTable",
 | 
			
		||||
                    "url": "/api/EmergencyContact/EmergencyContactTable",
 | 
			
		||||
                    "type": "POST",
 | 
			
		||||
                    "data": function (d) {
 | 
			
		||||
                        d.selectgroupidlist = selectgroupidlist
 | 
			
		||||
@ -116,7 +116,7 @@
 | 
			
		||||
                            toast_error(rel.msg);
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                        data = rel.data.data;
 | 
			
		||||
                        data = rel.data;
 | 
			
		||||
                        if (data == null || data.length == 0) {
 | 
			
		||||
 | 
			
		||||
                            this.data = [];
 | 
			
		||||
 | 
			
		||||
@ -224,7 +224,7 @@
 | 
			
		||||
                    </button>*@
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="modal-body">
 | 
			
		||||
                <form id="emergency-item-form">
 | 
			
		||||
                <form id="emergency-item-form" onsubmit="PassVerify(true)">
 | 
			
		||||
                    <div class="row">
 | 
			
		||||
                        <div class="form-group col-6">
 | 
			
		||||
                            <label class="form-label" for="emergency_verify_modal"><span class="text-danger">*</span>指揮官密碼</label>
 | 
			
		||||
@ -282,20 +282,23 @@
 | 
			
		||||
                        </table>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="col-6">
 | 
			
		||||
                        <textarea class="form-control mt-3 mb-2" rows="5"></textarea>
 | 
			
		||||
                        <textarea class="form-control mt-3 mb-2" rows="5" id="sms_messagebox"></textarea>
 | 
			
		||||
                        <span>發訊人:</span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="row justify-content-between">
 | 
			
		||||
                    <div class="col-auto">
 | 
			
		||||
                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
 | 
			
		||||
                        <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="PassVerify(false)">取消</button>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="col-auto row">
 | 
			
		||||
                        <div class="col-auto">
 | 
			
		||||
                            <input class="form-control" type="text" placeholder="請輸入指揮官密碼" />
 | 
			
		||||
                            <input class="form-control" type="password" id="sendSms_verify_input"  placeholder="請輸入指揮官密碼" />
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="col-auto">
 | 
			
		||||
                            <button type="button" class="btn btn-primary" onclick="SaveSubSetting()">儲存</button>
 | 
			
		||||
                            
 | 
			
		||||
                            <button type="button" class="btn btn-primary" onclick="PassVerify(true)">
 | 
			
		||||
                                <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" id="smsSaveBtnLoading" style="display:none"></span>
 | 
			
		||||
                                儲存</button>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
@ -337,7 +340,7 @@
 | 
			
		||||
        var SelectedFilter =
 | 
			
		||||
            {
 | 
			
		||||
                disasters: [],
 | 
			
		||||
                building_guid: '',
 | 
			
		||||
                building_tag: '',
 | 
			
		||||
                floor_guids: [],
 | 
			
		||||
                layer2: [],
 | 
			
		||||
                layer3: []
 | 
			
		||||
@ -346,8 +349,11 @@
 | 
			
		||||
        var Verifybool = false; //-驗證成功
 | 
			
		||||
        var CloseVerify = false;
 | 
			
		||||
        var ToVerifyType = 0;
 | 
			
		||||
 | 
			
		||||
       
 | 
			
		||||
        $(function () {
 | 
			
		||||
             $("#emergency-item-form").submit((e) => {
 | 
			
		||||
                e.preventDefault();
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
            //#region 定時取得報警設備(3s)
 | 
			
		||||
            interval_id = setInterval(function () {
 | 
			
		||||
@ -393,7 +399,7 @@
 | 
			
		||||
 | 
			
		||||
                            $("#building").find(".building_device_amount").html(0);
 | 
			
		||||
                            rel.data.buildingAlarmDeviceAmount.forEach(function (item) {
 | 
			
		||||
                                $(`#${item.building_guid}_device_amount`).html(item.device_amount);
 | 
			
		||||
                                $(`#${item.building_tag}_device_amount`).html(item.device_amount);
 | 
			
		||||
                            });
 | 
			
		||||
                            ResetDeviceTable();
 | 
			
		||||
                        }
 | 
			
		||||
@ -450,7 +456,7 @@
 | 
			
		||||
            SmsMemberTable = $("#smsMemberTable").DataTable({
 | 
			
		||||
                "columns": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "data": "full_name"
 | 
			
		||||
                        "data": "name"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "data": "departmentName"
 | 
			
		||||
@ -562,13 +568,13 @@
 | 
			
		||||
                        "data": "device_number",
 | 
			
		||||
                        "render": function (data, type, row, meta) {
 | 
			
		||||
                            @*var html = `
 | 
			
		||||
                                    <a href="javascript:void(0)" onclick="ChangeFloormap('${row.building_guid}', '${row.floorguid}', '${data}', '${row.layer3}')">
 | 
			
		||||
                                    <a href="javascript:void(0)" onclick="ChangeFloormap('${row.building_tag}', '${row.floorguid}', '${data}', '${row.layer3}')">
 | 
			
		||||
                                    ${data}
 | 
			
		||||
                                    </a>
 | 
			
		||||
                                `;*@
 | 
			
		||||
 | 
			
		||||
                            var html = `
 | 
			
		||||
                                    <a href="http://${row.ip_address}/file/BajascriptTest/_FloorMap.html?building_guid=${row.building_guid}&floor_guid=${row.floorguid}&layer3=${row.layer3}&device_number=${data}&show_cctv=1&jwt=${localStorage.getItem('JWT-Authorization')}" target="_blank">
 | 
			
		||||
                                    <a href="http://${row.ip_address}/file/BajascriptTest/_FloorMap.html?building_tag=${row.building_tag}&floor_guid=${row.floorguid}&layer3=${row.layer3}&device_number=${data}&show_cctv=1&jwt=${localStorage.getItem('JWT-Authorization')}" target="_blank">
 | 
			
		||||
                                    ${data}
 | 
			
		||||
                                    </a>
 | 
			
		||||
                                `;
 | 
			
		||||
@ -620,7 +626,7 @@
 | 
			
		||||
                    "type": "POST",
 | 
			
		||||
                    "data": function (d) {
 | 
			
		||||
                        d.select_disasters = SelectedFilter.disasters;
 | 
			
		||||
                        d.selectbuilding = SelectedFilter.building_guid;
 | 
			
		||||
                        d.selectbuilding = SelectedFilter.building_tag;
 | 
			
		||||
                        d.select_Floors = SelectedFilter.floor_guids;
 | 
			
		||||
                        d.select_Layer3 = SelectedFilter.layer3;
 | 
			
		||||
                    },
 | 
			
		||||
@ -656,7 +662,7 @@
 | 
			
		||||
                                        device_number: temp_device.device_number,
 | 
			
		||||
                                        device_name: temp_device.device_name,
 | 
			
		||||
                                        building_name: temp_device.building_name,
 | 
			
		||||
                                        building_guid: temp_device.building_guid,
 | 
			
		||||
                                        building_tag: temp_device.building_tag,
 | 
			
		||||
                                        ip_address: temp_device.ip_address,
 | 
			
		||||
                                        disaster: temp_device.disaster,
 | 
			
		||||
                                        disaster_name: temp_device.disaster_name,
 | 
			
		||||
@ -669,10 +675,10 @@
 | 
			
		||||
                                        alarm_timestamp: alarm_device.alarm_timestamp,
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    var temp_building_index = backfill_building_alarm_device_amount.findIndex(x => x.building_guid == temp_device.building_guid);
 | 
			
		||||
                                    var temp_building_index = backfill_building_alarm_device_amount.findIndex(x => x.building_tag == temp_device.building_tag);
 | 
			
		||||
                                    if (temp_building_index < 0) {
 | 
			
		||||
                                        var building_obj = {
 | 
			
		||||
                                            building_guid: temp_device.building_guid,
 | 
			
		||||
                                            building_tag: temp_device.building_tag,
 | 
			
		||||
                                            device_amount: 1
 | 
			
		||||
                                        }
 | 
			
		||||
 | 
			
		||||
@ -681,10 +687,10 @@
 | 
			
		||||
                                        backfill_building_alarm_device_amount[temp_building_index].device_amount += 1;
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    var temp_layer2_index = backfill_layer2_alarm_device_amount.findIndex(x => x.value == temp_device.layer2 && x.building_guid == temp_device.building_guid)
 | 
			
		||||
                                    var temp_layer2_index = backfill_layer2_alarm_device_amount.findIndex(x => x.value == temp_device.layer2 && x.building_tag == temp_device.building_tag)
 | 
			
		||||
                                    if (temp_layer2_index < 0) {
 | 
			
		||||
                                        var layer2_obj = {
 | 
			
		||||
                                            building_guid: temp_device.building_guid,
 | 
			
		||||
                                            building_tag: temp_device.building_tag,
 | 
			
		||||
                                            value: temp_device.layer2,
 | 
			
		||||
                                            device_amount: 1
 | 
			
		||||
                                        }
 | 
			
		||||
@ -694,10 +700,10 @@
 | 
			
		||||
                                        backfill_layer2_alarm_device_amount[temp_layer2_index].device_amount += 1;
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    var temp_layer3_index = backfill_layer3_alarm_device_amount.findIndex(x => x.layer3 == temp_device.layer3 && x.layer2 == temp_device.layer2 && x.building_guid == temp_device.building_guid)
 | 
			
		||||
                                    var temp_layer3_index = backfill_layer3_alarm_device_amount.findIndex(x => x.layer3 == temp_device.layer3 && x.layer2 == temp_device.layer2 && x.building_tag == temp_device.building_tag)
 | 
			
		||||
                                    if (temp_layer3_index < 0) {
 | 
			
		||||
                                        var layer3_obj = {
 | 
			
		||||
                                            building_guid: temp_device.building_guid,
 | 
			
		||||
                                            building_tag: temp_device.building_tag,
 | 
			
		||||
                                            layer2: temp_device.layer2,
 | 
			
		||||
                                            layer3: temp_device.layer3,
 | 
			
		||||
                                            device_amount: 1
 | 
			
		||||
@ -764,10 +770,10 @@
 | 
			
		||||
                                            device_amount: layer3.device_amount
 | 
			
		||||
                                        }
 | 
			
		||||
 | 
			
		||||
                                        var temp_building_index = backfill_building_device_amount.findIndex(x => x.building_guid == building.guid);
 | 
			
		||||
                                        var temp_building_index = backfill_building_device_amount.findIndex(x => x.building_tag == building.tag);
 | 
			
		||||
                                        if (temp_building_index < 0) {
 | 
			
		||||
                                            var building_obj = {
 | 
			
		||||
                                                building_guid: building.guid,
 | 
			
		||||
                                                building_tag: building.tag,
 | 
			
		||||
                                                device_amount: new_layer3.device_amount
 | 
			
		||||
                                            }
 | 
			
		||||
 | 
			
		||||
@ -776,10 +782,10 @@
 | 
			
		||||
                                            backfill_building_device_amount[temp_building_index].device_amount += new_layer3.device_amount;
 | 
			
		||||
                                        }
 | 
			
		||||
 | 
			
		||||
                                        var temp_layer2_index = backfill_layer2_device_amount.findIndex(x => x.value == layer2.value && x.building_guid == building.guid)
 | 
			
		||||
                                        var temp_layer2_index = backfill_layer2_device_amount.findIndex(x => x.value == layer2.value && x.building_tag == building.tag)
 | 
			
		||||
                                        if (temp_layer2_index < 0) {
 | 
			
		||||
                                            var layer2_obj = {
 | 
			
		||||
                                                building_guid: building.guid,
 | 
			
		||||
                                                building_tag: building.tag,
 | 
			
		||||
                                                value: layer2.value,
 | 
			
		||||
                                                device_amount: new_layer3.device_amount
 | 
			
		||||
                                            }
 | 
			
		||||
@ -789,10 +795,10 @@
 | 
			
		||||
                                            backfill_layer2_device_amount[temp_layer2_index].device_amount += new_layer3.device_amount;
 | 
			
		||||
                                        }
 | 
			
		||||
 | 
			
		||||
                                        var temp_layer3_index = backfill_layer3_device_amount.findIndex(x => x.layer3 == layer3.value && x.layer2 == layer2.value && x.building_guid == building.guid)
 | 
			
		||||
                                        var temp_layer3_index = backfill_layer3_device_amount.findIndex(x => x.layer3 == layer3.value && x.layer2 == layer2.value && x.building_tag == building.tag)
 | 
			
		||||
                                        if (temp_layer3_index < 0) {
 | 
			
		||||
                                            var layer3_obj = {
 | 
			
		||||
                                                building_guid: building.guid,
 | 
			
		||||
                                                building_tag: building.tag,
 | 
			
		||||
                                                layer2: layer2.value,
 | 
			
		||||
                                                layer3: layer3.value,
 | 
			
		||||
                                                device_amount: new_layer3.device_amount
 | 
			
		||||
@ -866,6 +872,7 @@
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ChangeFilterBuilding();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
            @*console.log("SelectedFilter", SelectedFilter);*@
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
@ -886,6 +893,7 @@
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ChangeFilterBuilding();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
            @*console.log("SelectedFilter", SelectedFilter);*@
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
@ -897,7 +905,7 @@
 | 
			
		||||
            all_device_group.forEach(function (disaster, disaster_index) {
 | 
			
		||||
                if (SelectedFilter.disasters.findIndex(x => x == disaster.value) > -1) { //表示已選擇該防災類型
 | 
			
		||||
                    disaster.groupBuildings.forEach(function (building, building_index) {
 | 
			
		||||
                        if (temp_all_building.findIndex(x => x.guid == building.guid) < 0) { //表示未加入,需加入
 | 
			
		||||
                        if (temp_all_building.findIndex(x => x.tag == building.tag) < 0) { //表示未加入,需加入
 | 
			
		||||
                            temp_all_building.push(building);
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
@ -909,16 +917,16 @@
 | 
			
		||||
                var html = "";
 | 
			
		||||
                temp_all_building.forEach(function (building, building_index) {
 | 
			
		||||
 | 
			
		||||
                    var building_device_amount = backfill_building_device_amount.filter(x => x.building_guid == building.guid)[0];
 | 
			
		||||
                    var building_device_amount = backfill_building_device_amount.filter(x => x.building_tag == building.tag)[0];
 | 
			
		||||
 | 
			
		||||
                    @*html += `<div class="btn-group ml-2" onclick="SelectBuilding('${building.guid}',this)">
 | 
			
		||||
                    @*html += `<div class="btn-group ml-2" onclick="SelectBuilding('${building.tag}',this)">
 | 
			
		||||
                                <button type="button" class="btn btn-secondary">${building.name}</button>
 | 
			
		||||
                                <button type="button" class="btn btn-secondary building_device_amount" id="${building.guid}_device_amount">${building_device_amount.device_amount}</button>
 | 
			
		||||
                                <button type="button" class="btn btn-secondary building_device_amount" id="${building.tag}_device_amount">${building_device_amount.device_amount}</button>
 | 
			
		||||
                            </div>`;*@
 | 
			
		||||
 | 
			
		||||
                    html += `<div class="btn-group ml-2" onclick="SelectBuilding('${building.guid}',this)">
 | 
			
		||||
                    html += `<div class="btn-group ml-2" onclick="SelectBuilding('${building.tag}',this)">
 | 
			
		||||
                                <button type="button" class="btn btn-secondary">${building.name}</button>
 | 
			
		||||
                                <button type="button" class="btn btn-secondary building_device_amount" id="${building.guid}_device_amount">0</button>
 | 
			
		||||
                                <button type="button" class="btn btn-secondary building_device_amount" id="${building.tag}_device_amount">0</button>
 | 
			
		||||
                            </div>`;
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
@ -929,7 +937,7 @@
 | 
			
		||||
            else {
 | 
			
		||||
                var html = "";
 | 
			
		||||
                temp_all_building.forEach(function (building, building_index) {
 | 
			
		||||
                    html += '<button type="button" class="btn btn-secondary ml-2" onclick="SelectBuilding(\'' + building.guid + '\',this)">' + building.name + '</button>';
 | 
			
		||||
                    html += '<button type="button" class="btn btn-secondary ml-2" onclick="SelectBuilding(\'' + building.tag + '\',this)">' + building.name + '</button>';
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                $('#building').append(html);
 | 
			
		||||
@ -941,10 +949,10 @@
 | 
			
		||||
        //#endregion
 | 
			
		||||
 | 
			
		||||
        //#region 選擇棟別
 | 
			
		||||
        function SelectBuilding(building_guid, e) {
 | 
			
		||||
        function SelectBuilding(building_tag, e) {
 | 
			
		||||
            $('#building').find('button').removeClass('btn-success').addClass('btn-secondary')
 | 
			
		||||
 | 
			
		||||
            SelectedFilter.building_guid = building_guid;
 | 
			
		||||
            SelectedFilter.building_tag = building_tag;
 | 
			
		||||
            if (show_mode == 'alarm') {
 | 
			
		||||
                $(e).find('button').addClass('btn-success');
 | 
			
		||||
            } else {
 | 
			
		||||
@ -953,6 +961,7 @@
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ChangeFilterFloor();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
            @*console.log("SelectedFilter", SelectedFilter);*@
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
@ -963,9 +972,9 @@
 | 
			
		||||
            all_device_group.forEach(function (disaster, disaster_index) {
 | 
			
		||||
                if (SelectedFilter.disasters.findIndex(x => x == disaster.value) > -1) { //抓取已選擇的防災類型的棟別內容
 | 
			
		||||
                    disaster.groupBuildings.forEach(function (building, building_index) {
 | 
			
		||||
                        if (building.guid == SelectedFilter.building_guid) { //抓取選擇棟別的底下樓層
 | 
			
		||||
                        if (building.tag == SelectedFilter.building_tag) { //抓取選擇棟別的底下樓層
 | 
			
		||||
                            building.groupFloors.forEach(function (floor, floor_index) {
 | 
			
		||||
                                if (temp_all_floor.findIndex(x => x.guid == floor.guid) < 0) { //表示未加入,需加入
 | 
			
		||||
                                if (temp_all_floor.findIndex(x => x.name == floor.name) < 0) { //表示未加入,需加入
 | 
			
		||||
                                    temp_all_floor.push(floor);
 | 
			
		||||
                                }
 | 
			
		||||
                            });
 | 
			
		||||
@ -978,7 +987,7 @@
 | 
			
		||||
            $("#floors").append(`<button type="button" class="btn btn-secondary ml-2 mb-2" onclick="AllFloor()">全選</button>`);
 | 
			
		||||
            var html = "";
 | 
			
		||||
            temp_all_floor.forEach(function (floor, floor_index) {
 | 
			
		||||
                html += '<button type="button" class="btn btn-outline-success ml-2 mb-2" onclick="SelectFloor(\'' + floor.guid + '\',this)">' + floor.name + '</button>';
 | 
			
		||||
                html += '<button type="button" class="btn btn-outline-success ml-2 mb-2" onclick="SelectFloor(\'' + floor.name + '\',this)">' + floor.name + '</button>';
 | 
			
		||||
            });
 | 
			
		||||
            $('#floors').append(html);
 | 
			
		||||
 | 
			
		||||
@ -998,32 +1007,34 @@
 | 
			
		||||
                $('#floors').find('.btn-outline-success').removeClass('btn-outline-success').addClass('btn-success');
 | 
			
		||||
                SelectedFilter.floor_guids = [];
 | 
			
		||||
                temp_all_floor.forEach(function (floor, floor_index) {
 | 
			
		||||
                    SelectedFilter.floor_guids.push(floor.guid);
 | 
			
		||||
                    SelectedFilter.floor_guids.push(floor.name);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ChangeFilterLayer2();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
            @*console.log("SelectedFilter", SelectedFilter);*@
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
 | 
			
		||||
        //#region 選擇樓層
 | 
			
		||||
        function SelectFloor(floor_guid, e) {
 | 
			
		||||
        function SelectFloor(floor_tag, e) {
 | 
			
		||||
            select_all_floor = false;
 | 
			
		||||
 | 
			
		||||
            var floor_index = SelectedFilter.floor_guids.findIndex(x => x == floor_guid);
 | 
			
		||||
            var floor_index = SelectedFilter.floor_guids.findIndex(x => x == floor_tag);
 | 
			
		||||
            if (floor_index > -1) { //已選擇 -> 未選擇
 | 
			
		||||
                SelectedFilter.floor_guids.splice(floor_index, 1);
 | 
			
		||||
                $(e).removeClass('btn-success').addClass('btn-outline-success');
 | 
			
		||||
            }
 | 
			
		||||
            else { //未選擇 -> 已選擇
 | 
			
		||||
                SelectedFilter.floor_guids.push(floor_guid);
 | 
			
		||||
                SelectedFilter.floor_guids.push(floor_tag);
 | 
			
		||||
                $(e).removeClass('btn-outline-success').addClass('btn-success');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ChangeFilterLayer2();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
            @*console.log("SelectedFilter", SelectedFilter);*@
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
@ -1034,9 +1045,9 @@
 | 
			
		||||
            all_device_group.forEach(function (disaster, disaster_index) {
 | 
			
		||||
                if (SelectedFilter.disasters.findIndex(x => x == disaster.value) > -1) { //抓取選擇防災類型的底下棟別
 | 
			
		||||
                    disaster.groupBuildings.forEach(function (building, building_index) {
 | 
			
		||||
                        if (building.guid == SelectedFilter.building_guid) { //抓取選擇棟別的底下樓層
 | 
			
		||||
                        if (building.tag == SelectedFilter.building_tag) { //抓取選擇棟別的底下樓層
 | 
			
		||||
                            building.groupFloors.forEach(function (floor, floor_index) {
 | 
			
		||||
                                if (SelectedFilter.floor_guids.findIndex(x => x == floor.guid) > -1) { //抓取選擇樓層的底下大類
 | 
			
		||||
                                if (SelectedFilter.floor_guids.findIndex(x => x == floor.name) > -1) { //抓取選擇樓層的底下大類
 | 
			
		||||
                                    floor.groupLayer2s.forEach(function (layer2, layer2_index) {
 | 
			
		||||
                                        if (temp_all_layer2.findIndex(x => x.value == layer2.value) < 0) {
 | 
			
		||||
                                            temp_all_layer2.push(layer2);
 | 
			
		||||
@ -1056,18 +1067,18 @@
 | 
			
		||||
            var html = "";
 | 
			
		||||
            temp_all_layer2.forEach(function (layer2, layer2_index) {
 | 
			
		||||
 | 
			
		||||
                var layer2_device_amount = backfill_layer2_device_amount.filter(x => x.value == layer2.value && x.building_guid == SelectedFilter.building_guid)[0];
 | 
			
		||||
                var layer2_device_amount = backfill_layer2_device_amount.filter(x => x.value == layer2.value && x.building_tag == SelectedFilter.building_tag)[0];
 | 
			
		||||
 | 
			
		||||
                @*html += `
 | 
			
		||||
                        <div class="btn-group ml-2 mb-2" onclick="SelectLayer2('${layer2.value}',this)">
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success">${layer2.name}</button>
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success device_amount" id="${layer2_device_amount.building_guid}_${layer2_device_amount.value}_device_amount">${layer2_device_amount.device_amount}</button>
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success device_amount" id="${layer2_device_amount.building_tag}_${layer2_device_amount.value}_device_amount">${layer2_device_amount.device_amount}</button>
 | 
			
		||||
                        </div>`;*@
 | 
			
		||||
 | 
			
		||||
                html += `
 | 
			
		||||
                        <div class="btn-group ml-2 mb-2" onclick="SelectLayer2('${layer2.value}',this)">
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success">${layer2.name}</button>
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success device_amount" id="${layer2_device_amount.building_guid}_${layer2_device_amount.value}_device_amount">0</button>
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success device_amount" id="${layer2_device_amount.building_tag}_${layer2_device_amount.value}_device_amount">0</button>
 | 
			
		||||
                        </div>`;
 | 
			
		||||
 | 
			
		||||
            });
 | 
			
		||||
@ -1095,6 +1106,7 @@
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ChangeFilterLayer3();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
            @*console.log("SelectedFilter", SelectedFilter);*@
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
@ -1115,6 +1127,7 @@
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ChangeFilterLayer3();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
            @*console.log("SelectedFilter", SelectedFilter);*@
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
@ -1125,9 +1138,9 @@
 | 
			
		||||
            all_device_group.forEach(function (disaster, disaster_index) {
 | 
			
		||||
                if (SelectedFilter.disasters.findIndex(x => x == disaster.value) > -1) { //抓取選擇防災類型的底下棟別
 | 
			
		||||
                    disaster.groupBuildings.forEach(function (building, building_index) {
 | 
			
		||||
                        if (building.guid == SelectedFilter.building_guid) { //抓取選擇棟別的底下樓層
 | 
			
		||||
                        if (building.tag == SelectedFilter.building_tag) { //抓取選擇棟別的底下樓層
 | 
			
		||||
                            building.groupFloors.forEach(function (floor, floor_index) {
 | 
			
		||||
                                if (SelectedFilter.floor_guids.findIndex(x => x == floor.guid) > -1) { //抓取選擇樓層的底下大類
 | 
			
		||||
                                if (SelectedFilter.floor_guids.findIndex(x => x == floor.name) > -1) { //抓取選擇樓層的底下大類
 | 
			
		||||
                                    floor.groupLayer2s.forEach(function (layer2, layer2_index) {
 | 
			
		||||
                                        if (SelectedFilter.layer2.findIndex(x => x == layer2.value) > -1) { //抓取選擇大類的底下小類
 | 
			
		||||
                                            layer2.groupLayer3s.forEach(function (layer3, layer3_index) {
 | 
			
		||||
@ -1161,18 +1174,18 @@
 | 
			
		||||
            var html = "";
 | 
			
		||||
            temp_all_layer3.forEach(function (layer3, layer3_index) {
 | 
			
		||||
 | 
			
		||||
                var layer3_device_amount = backfill_layer3_device_amount.filter(x => x.layer3 == layer3.value && x.building_guid == SelectedFilter.building_guid)[0];
 | 
			
		||||
                var layer3_device_amount = backfill_layer3_device_amount.filter(x => x.layer3 == layer3.value && x.building_tag == SelectedFilter.building_tag)[0];
 | 
			
		||||
 | 
			
		||||
                @*html += `
 | 
			
		||||
                        <div class="btn-group ml-2 mb-2" onclick="SelectLayer3('${layer3.value}',this)">
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success">${layer3.name}</button>
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success device_amount" id="${layer3_device_amount.building_guid}_${layer3_device_amount.layer3}_device_amount">${layer3_device_amount.device_amount}</button>
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success device_amount" id="${layer3_device_amount.building_tag}_${layer3_device_amount.layer3}_device_amount">${layer3_device_amount.device_amount}</button>
 | 
			
		||||
                        </div>`;*@
 | 
			
		||||
 | 
			
		||||
                html += `
 | 
			
		||||
                        <div class="btn-group ml-2 mb-2" onclick="SelectLayer3('${layer3.value}',this)">
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success">${layer3.name}</button>
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success device_amount" id="${layer3_device_amount.building_guid}_${layer3_device_amount.layer3}_device_amount">0</button>
 | 
			
		||||
                            <button type="button" class="btn btn-outline-success device_amount" id="${layer3_device_amount.building_tag}_${layer3_device_amount.layer3}_device_amount">0</button>
 | 
			
		||||
                        </div>`;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
@ -1200,6 +1213,7 @@
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ResetDeviceTable();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
 | 
			
		||||
@ -1219,6 +1233,7 @@
 | 
			
		||||
 | 
			
		||||
            is_need_reload = true;
 | 
			
		||||
            ResetDeviceTable();
 | 
			
		||||
            UpdateDeviceAmount();
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
 | 
			
		||||
@ -1226,20 +1241,20 @@
 | 
			
		||||
        function ResetDeviceTable() {
 | 
			
		||||
 | 
			
		||||
            if ((SelectedFilter.disasters == null || SelectedFilter.disasters.length <= 0)
 | 
			
		||||
                || (SelectedFilter.building_guid == null || SelectedFilter.building_guid == "")
 | 
			
		||||
                || (SelectedFilter.building_tag == null || SelectedFilter.building_tag == "")
 | 
			
		||||
                || (SelectedFilter.floor_guids == null || SelectedFilter.floor_guids.length <= 0)
 | 
			
		||||
                || (SelectedFilter.layer3 == null || SelectedFilter.layer3.length <= 0)
 | 
			
		||||
            ) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (changeBuilding != "" && changeBuilding != SelectedFilter.building_guid) {
 | 
			
		||||
            if (changeBuilding != "" && changeBuilding != SelectedFilter.building_tag) {
 | 
			
		||||
                alarmDeviceTable.clear().draw();
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                alarmDeviceTable.ajax.reload(null, false);
 | 
			
		||||
            }
 | 
			
		||||
            changeBuilding = SelectedFilter.building_guid;
 | 
			
		||||
            changeBuilding = SelectedFilter.building_tag;
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
 | 
			
		||||
@ -1250,39 +1265,39 @@
 | 
			
		||||
 | 
			
		||||
            if (show_mode == 'alarm') {
 | 
			
		||||
                backfill_building_alarm_device_amount.forEach(function (building, index) {
 | 
			
		||||
                    $(`#${building.building_guid}_device_amount`).html(building.device_amount);
 | 
			
		||||
                    $(`#${building.building_tag}_device_amount`).html(building.device_amount);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                backfill_layer2_alarm_device_amount.forEach(function (layer2, index) {
 | 
			
		||||
                    $(`#${layer2.building_guid}_${layer2.value}_device_amount`).html(layer2.device_amount);
 | 
			
		||||
                    $(`#${layer2.building_tag}_${layer2.value}_device_amount`).html(layer2.device_amount);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                backfill_layer3_alarm_device_amount.forEach(function (layer3, index) {
 | 
			
		||||
                    $(`#${layer3.building_guid}_${layer3.layer3}_device_amount`).html(layer3.device_amount);
 | 
			
		||||
                    $(`#${layer3.building_tag}_${layer3.layer3}_device_amount`).html(layer3.device_amount);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            } else {
 | 
			
		||||
                backfill_building_device_amount.forEach(function (building, index) {
 | 
			
		||||
                    $(`#${building.building_guid}_device_amount`).html(building.device_amount);
 | 
			
		||||
                    $(`#${building.building_tag}_device_amount`).html(building.device_amount);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                backfill_layer2_device_amount.forEach(function (layer2, index) {
 | 
			
		||||
                    $(`#${layer2.building_guid}_${layer2.value}_device_amount`).html(layer2.device_amount);
 | 
			
		||||
                    $(`#${layer2.building_tag}_${layer2.value}_device_amount`).html(layer2.device_amount);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                backfill_layer3_device_amount.forEach(function (layer3, index) {
 | 
			
		||||
                    $(`#${layer3.building_guid}_${layer3.layer3}_device_amount`).html(layer3.device_amount);
 | 
			
		||||
                    $(`#${layer3.building_tag}_${layer3.layer3}_device_amount`).html(layer3.device_amount);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        //#endregion
 | 
			
		||||
 | 
			
		||||
        //#region 變更右方地圖(改為跳新分頁)
 | 
			
		||||
        function ChangeFloormap(building_guid, floor_guid, device_number, layer3) {
 | 
			
		||||
        function ChangeFloormap(building_tag, floor_guid, device_number, layer3) {
 | 
			
		||||
            @*
 | 
			
		||||
            $("#iframe-floormap").empty();
 | 
			
		||||
            $("#iframe-floormap").append(
 | 
			
		||||
                `<iframe src="http://60.251.164.125:8080/file/BajascriptTest/_FloorMap.html?building_guid=${building_guid}&floor_guid=${floor_guid}&layer3=${layer3}&device_number=${device_number}&show_cctv=1" width="100%" height="100%;" scrolling="no"></iframe>`
 | 
			
		||||
                `<iframe src="http://60.251.164.125:8080/file/BajascriptTest/_FloorMap.html?building_tag=${building_tag}&floor_guid=${floor_guid}&layer3=${layer3}&device_number=${device_number}&show_cctv=1" width="100%" height="100%;" scrolling="no"></iframe>`
 | 
			
		||||
            )
 | 
			
		||||
            *@
 | 
			
		||||
        }
 | 
			
		||||
@ -1312,7 +1327,7 @@
 | 
			
		||||
            // de_number = $(e).parent().parent().attr('de-number');
 | 
			
		||||
            var url = "/api/EmergencyDevice/SaveAndOpenSimulationExercise";
 | 
			
		||||
            var send_data = {
 | 
			
		||||
                build: SelectedFilter.building_guid,
 | 
			
		||||
                build: SelectedFilter.building_tag,
 | 
			
		||||
                disaster: disaster,
 | 
			
		||||
                type: type,
 | 
			
		||||
                device: guid
 | 
			
		||||
@ -1418,6 +1433,7 @@
 | 
			
		||||
 | 
			
		||||
        //#region 模擬演練 / SOP modal 開啟發送簡訊Modal
 | 
			
		||||
        function OpenSendSMSModal() {
 | 
			
		||||
            ToVerifyType = 2;
 | 
			
		||||
            $('#send-sms-modal').modal();
 | 
			
		||||
            SmsMemberTable.ajax.reload();
 | 
			
		||||
        }
 | 
			
		||||
@ -1731,7 +1747,7 @@
 | 
			
		||||
                {
 | 
			
		||||
                    EmerLastsetting = $('#bigsetting').find('.active').attr('mas');
 | 
			
		||||
                    ToVerifyType = 0;
 | 
			
		||||
                    $('.modal-title').html("指揮官驗證");
 | 
			
		||||
                    //$('.modal-title').html("指揮官驗證");
 | 
			
		||||
                    $('#small_setting').hide();
 | 
			
		||||
                    $('#emergency_verify_input').val('');
 | 
			
		||||
                    $('#emergency-verify-modal').modal();
 | 
			
		||||
@ -1783,9 +1799,6 @@
 | 
			
		||||
                        $('#list_' + EmerLastsetting).find('.active').children().trigger('click');
 | 
			
		||||
                        $('#emergency-verify-modal').modal('hide');
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (ToVerifyType == 1) {
 | 
			
		||||
@ -1815,6 +1828,109 @@
 | 
			
		||||
                    $('#emergency-verify-modal').modal('hide');
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if(ToVerifyType == 2) {
 | 
			
		||||
                if (Vbool) {
 | 
			
		||||
                    if(!$("#sms_messagebox").val()){
 | 
			
		||||
                        toast_warning('請輸入簡訊內容');
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    controlSmsSaveBtnLoading(true);
 | 
			
		||||
                    var url = "api/EmergencyDevice/CheckVerifybool";
 | 
			
		||||
                    var send_data = {
 | 
			
		||||
                        pass: $('#sendSms_verify_input').val()
 | 
			
		||||
                    };
 | 
			
		||||
                    
 | 
			
		||||
                    $.post(url, send_data, function (rel) {
 | 
			
		||||
                        if (rel.code != "0000") {
 | 
			
		||||
                            if (rel.code == "9999") {
 | 
			
		||||
                                toast_error(rel.msg);
 | 
			
		||||
                            }
 | 
			
		||||
                            return;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            if (rel.data) {
 | 
			
		||||
                                Verifybool = true;
 | 
			
		||||
                                sendSmsMessage();
 | 
			
		||||
                            } else {
 | 
			
		||||
                                toast_warning('密碼驗證失敗,請重新驗證');
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        controlSmsSaveBtnLoading(false);
 | 
			
		||||
                    })
 | 
			
		||||
                } else {//取消驗證
 | 
			
		||||
                    if (EmerLastsetting == 0) {
 | 
			
		||||
 | 
			
		||||
                    } else {
 | 
			
		||||
                        $('#small_setting').show();
 | 
			
		||||
                        $('#bigsetting').find('.active').removeClass('active');
 | 
			
		||||
                        $(`#t${EmerLastsetting}_tab`).addClass('active');
 | 
			
		||||
 | 
			
		||||
                        $('#small_setting').find('.show').removeClass('active show')
 | 
			
		||||
                        $(`#t${EmerLastsetting}_modal`).addClass('active show');
 | 
			
		||||
 | 
			
		||||
                        $('#list_' + EmerLastsetting).find('.active').children().trigger('click');
 | 
			
		||||
                        $('#emergency-verify-modal').modal('hide');
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function controlSmsSaveBtnLoading(isShow = true) {
 | 
			
		||||
            if(isShow){
 | 
			
		||||
                $("#smsSaveBtnLoading").parent("button").prop("disabled",true);
 | 
			
		||||
                $("#smsSaveBtnLoading").fadeIn(200);
 | 
			
		||||
            } else {
 | 
			
		||||
                $("#smsSaveBtnLoading").fadeOut(200);
 | 
			
		||||
                $("#smsSaveBtnLoading").parent("button").prop("disabled",false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function sendSmsMessage() {
 | 
			
		||||
            if(Verifybool){
 | 
			
		||||
                const members = SmsMemberTable.data().toArray();
 | 
			
		||||
                const url = "api/HiNetMsg";
 | 
			
		||||
                controlSmsSaveBtnLoading(true);
 | 
			
		||||
                members.forEach(m => {
 | 
			
		||||
                    const send_data = {
 | 
			
		||||
                        Number:m.phone,
 | 
			
		||||
                        Msg:$("#sms_messagebox").val(),
 | 
			
		||||
                    };
 | 
			
		||||
                   $.ajax({
 | 
			
		||||
                       method:"POST",
 | 
			
		||||
                        url:url,
 | 
			
		||||
                        data:JSON.stringify(send_data),
 | 
			
		||||
                        contentType:"application/json;charset=utf-8",
 | 
			
		||||
                        success:(rel) => {
 | 
			
		||||
                            if (rel.code != "0000") {
 | 
			
		||||
                                if (rel.code == "9999") {
 | 
			
		||||
                                    toast_error(rel.msg);
 | 
			
		||||
                                }
 | 
			
		||||
                                return;
 | 
			
		||||
                            } else {
 | 
			
		||||
                                if (rel.data) {
 | 
			
		||||
                                    toast_ok("簡訊發送成功");
 | 
			
		||||
                                    $("#send-sms-modal").modal("hide");
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    toast_warning('簡訊發送失敗,請重新操作');
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        },
 | 
			
		||||
                        complete:() => {
 | 
			
		||||
                            controlSmsSaveBtnLoading(false);
 | 
			
		||||
                        }
 | 
			
		||||
                    })
 | 
			
		||||
                    //$.post(url, JSON.stringify(send_data),{contentType:"applicaiton/json;charset=utf-8"}, function (rel) {
 | 
			
		||||
                        
 | 
			
		||||
                    //})
 | 
			
		||||
                })
 | 
			
		||||
            } else {
 | 
			
		||||
                toast_warning('密碼驗證失敗,請重新驗證');
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function Closemodal() {
 | 
			
		||||
 | 
			
		||||
@ -192,7 +192,7 @@
 | 
			
		||||
                    $(row).attr('device', data.device_name);
 | 
			
		||||
                },
 | 
			
		||||
                "ajax": {
 | 
			
		||||
                    "url": "/EmergencyRecord/EmergencyRecordTable",
 | 
			
		||||
                    "url": "/api/EmergencyRecord/EmergencyRecordTable",
 | 
			
		||||
                    "type": "POST",
 | 
			
		||||
                    "data": function (d) {
 | 
			
		||||
                        d.selectaDisaster = SelectaDisaster,
 | 
			
		||||
@ -205,7 +205,7 @@
 | 
			
		||||
                            toast_error(rel.msg);
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                        data = rel.data.data;
 | 
			
		||||
                        data = rel.data;
 | 
			
		||||
                        if (data == null || data.length == 0) {
 | 
			
		||||
 | 
			
		||||
                            this.data = [];
 | 
			
		||||
@ -252,7 +252,7 @@
 | 
			
		||||
                    $(row).attr('guid', data.emergency_item_guid);
 | 
			
		||||
                },
 | 
			
		||||
                "ajax": {
 | 
			
		||||
                    "url": "/EmergencyRecord/EmergencyItemTable",
 | 
			
		||||
                    "url": "/api/EmergencyRecord/EmergencyItemTable",
 | 
			
		||||
                    "type": "POST",
 | 
			
		||||
                    "data": function (d) {
 | 
			
		||||
                        d.event_guid = SelectEvent
 | 
			
		||||
@ -262,7 +262,7 @@
 | 
			
		||||
                            toast_error(rel.msg);
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                        data = rel.data.data;
 | 
			
		||||
                        data = rel.data;
 | 
			
		||||
                        if (data == null || data.length == 0) {
 | 
			
		||||
 | 
			
		||||
                            this.data = [];
 | 
			
		||||
@ -320,7 +320,7 @@
 | 
			
		||||
 | 
			
		||||
        //取得所有棟別
 | 
			
		||||
        function GetBuild() {
 | 
			
		||||
            var url = "/EmergencyRecord/BuildInfoList";
 | 
			
		||||
            var url = "/api/EmergencyRecord/BuildInfoList";
 | 
			
		||||
            var send_data = {};
 | 
			
		||||
            $.post(url, send_data, function (rel) {
 | 
			
		||||
                if (rel.code != "0000") {
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
    <title>登入 | IBMS緊急應變系統</title>
 | 
			
		||||
    <title>登入 | @ViewData["ProjectName"]緊急應變系統</title>
 | 
			
		||||
 | 
			
		||||
    <!-- base css -->
 | 
			
		||||
    <link id="vendorsbundle" rel="stylesheet" media="screen, print" href="~/css/vendors.bundle.css">
 | 
			
		||||
@ -30,7 +30,7 @@
 | 
			
		||||
        <div class="page-logo m-0 w-100 align-items-center justify-content-center rounded border-bottom-left-radius-0 border-bottom-right-radius-0 px-4">
 | 
			
		||||
            <div class="page-logo-link press-scale-down d-flex align-items-center">
 | 
			
		||||
                <img src="/img/dome.png" width="50%"  aria-roledescription="logo">
 | 
			
		||||
                <span class="page-logo-text mr-1">IBMS緊急應變系統</span>
 | 
			
		||||
                <span class="page-logo-text mr-1">@ViewData["ProjectName"]緊急應變系統</span>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="card p-4 border-top-left-radius-0 border-top-right-radius-0">
 | 
			
		||||
@ -78,7 +78,7 @@
 | 
			
		||||
                async: false,
 | 
			
		||||
                dataType: 'json',
 | 
			
		||||
                success: function (rel) {
 | 
			
		||||
                    window.location = "/Home/Index/";
 | 
			
		||||
                    window.location = "/EmergencyDeviceMenu";
 | 
			
		||||
                },
 | 
			
		||||
                error: function (xhr, textStatus, thrownError) {
 | 
			
		||||
                    alert(textStatus);
 | 
			
		||||
 | 
			
		||||
@ -253,7 +253,17 @@
 | 
			
		||||
            kind: 1
 | 
			
		||||
        };
 | 
			
		||||
        var url = "/RescueDevice/ExportExcel";
 | 
			
		||||
        window.location = "/RescueDevice/ExportExcel?post=" + JSON.stringify(send_data);
 | 
			
		||||
            $.ajax({
 | 
			
		||||
                method: "POST",
 | 
			
		||||
                xhrFields: { responseType: "blob" },
 | 
			
		||||
                headers: { "Authorization": "Bearer " + localStorage.getItem('JWT-Authorization') },
 | 
			
		||||
                url: "/RescueDevice/ExportExcel",
 | 
			
		||||
                data: { "post": JSON.stringify(send_data) },
 | 
			
		||||
                success: (res, text, xhr) => {
 | 
			
		||||
                    download(xhr, res);
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
        //window.location = "/RescueDevice/ExportExcel?post=" + JSON.stringify(send_data);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
@ -253,8 +253,20 @@
 | 
			
		||||
            kind: 0
 | 
			
		||||
        };
 | 
			
		||||
        var url = "/RescueDevice/ExportExcel";
 | 
			
		||||
        window.location = "/RescueDevice/ExportExcel?post=" + JSON.stringify(send_data);
 | 
			
		||||
        $.ajax({
 | 
			
		||||
            method:"POST",
 | 
			
		||||
            xhrFields:{responseType:"blob"},
 | 
			
		||||
            headers:{"Authorization":"Bearer " + localStorage.getItem('JWT-Authorization')},
 | 
			
		||||
            url: "/RescueDevice/ExportExcel",
 | 
			
		||||
            data:{"post":JSON.stringify(send_data)},
 | 
			
		||||
            success:(res,text,xhr) => {
 | 
			
		||||
                download(xhr,res);
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    </script>
 | 
			
		||||
}
 | 
			
		||||
@ -20,6 +20,7 @@
 | 
			
		||||
      //"Database": "IgYBsgG2VLKKxFb64j7LOA==", //wsp
 | 
			
		||||
      "Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
 | 
			
		||||
      //"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
 | 
			
		||||
      //"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office
 | 
			
		||||
      "Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
 | 
			
		||||
      "Password": "FVAPxztxpY4gJJKQ/se4bQ=="
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@
 | 
			
		||||
      //"Database": "IgYBsgG2VLKKxFb64j7LOA==", //wsp
 | 
			
		||||
      "Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
 | 
			
		||||
      //"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
 | 
			
		||||
      //"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office
 | 
			
		||||
      "Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
 | 
			
		||||
      "Password": "FVAPxztxpY4gJJKQ/se4bQ=="
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@ -54,7 +54,7 @@ $(function () {
 | 
			
		||||
        "Please check your input."
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
//#region 個人資訊表單驗證
 | 
			
		||||
@ -228,6 +228,36 @@ function SaveSpinner(status) { //1:Spinner 0:還原儲存
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
        * 下載檔案
 | 
			
		||||
        */
 | 
			
		||||
function download(res, blob, filename, fetchOption, callback = null) {
 | 
			
		||||
    // 擷取回傳 header > content-disposition (後端定義檔案名稱)
 | 
			
		||||
    let disposition = res.getResponseHeader("Content-Disposition");
 | 
			
		||||
    let sDowName = "";
 | 
			
		||||
    if (disposition) {
 | 
			
		||||
        // 解析出名稱
 | 
			
		||||
        sDowName = disposition.split(/filename\*=(?:utf-8'')?(.*)/gi)[1];
 | 
			
		||||
        if (sDowName.toLowerCase().startsWith("utf-8''"))
 | 
			
		||||
            sDowName = decodeURIComponent(sDowName.replace(/utf-8''/i, ""));
 | 
			
		||||
        else sDowName = sDowName.replace(/['"]/g, "");
 | 
			
		||||
        sDowName = decodeURIComponent(sDowName);
 | 
			
		||||
    }
 | 
			
		||||
    // 隱形a標籤
 | 
			
		||||
    const a = document.createElement("a");
 | 
			
		||||
    let href = URL.createObjectURL(blob);
 | 
			
		||||
    if (href) {
 | 
			
		||||
        a.href = href;
 | 
			
		||||
        a.download = filename || sDowName || "";
 | 
			
		||||
        document.body.appendChild(a);
 | 
			
		||||
        a.click();
 | 
			
		||||
        document.body.removeChild(a);
 | 
			
		||||
        callback ? callback() : "";
 | 
			
		||||
        return true;
 | 
			
		||||
    } else {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
$(document).ready(function () {
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -244,7 +244,7 @@ namespace Repository.BackendRepository.Implement
 | 
			
		||||
                        var isDome = await GetOneAsync<string>("select system_value from variable where deleted = 0 and system_type = 'project_name';");
 | 
			
		||||
                        if (sb.Length > 0)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (isDome == "ibms_dome_dome/D2")
 | 
			
		||||
                            if (isDome == "ibms_dome_dome/D2" || isDome == "ibms_dome_hotel/H")
 | 
			
		||||
                            {
 | 
			
		||||
                                sb.Append($@" update import_niagara_item a join dic_system b 
 | 
			
		||||
				                                    on a.device_name_tag COLLATE utf8mb4_general_ci = b.s2_code
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user