using Backend.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Repository.BackendRepository.Interface; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using System.Transactions; namespace Backend.Controllers { public class BuildInfoController : MybaseController { private readonly IBackendRepository backendRepository; private string mapFileSaveAsPath = ""; private string buildMapFileSaveAsPath = ""; public BuildInfoController(IBackendRepository backendRepository) { this.backendRepository = backendRepository; mapFileSaveAsPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "upload", "floor_map"); buildMapFileSaveAsPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "upload", "build_map"); } public IActionResult Index() { return View(); } /// /// 區域基本資料列表 /// /// [HttpPost] public async Task>> BuildInfoList() { ApiResult> apiResult = new ApiResult>(); List buildInfo = new List(); try { var sqlString = @$"SELECT A.priority, A.building_tag, A.full_name, A.ip_address, A.ip_port, (SELECT COUNT(*) FROM floor f WHERE f.deleted = 0 AND f.building_tag = A.building_tag) AS 'floorNum', A.created_at, A.orgName_3D, A.extName_3D, forge_light_group FROM building A WHERE A.deleted = 0 ORDER BY A.priority ASC, A.created_at DESC"; buildInfo = await backendRepository.GetAllAsync(sqlString); apiResult.Code = "0000"; apiResult.Data = buildInfo; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 新增 / 修改 區域基本資料 /// /// /// [HttpPost] public async Task> SaveBuildInfo([FromForm] BuildInfo post) { ApiResult apiResult = new ApiResult(); try { //判斷監控主機IP是否重複 var judgeIPAddressRepeat = true; var sWhere = $@"deleted = 0 AND ip_address = @ip_address AND ip_port = @ip_port AND building_tag != @building_tag"; var buildInfos = await backendRepository.GetAllAsync("building", sWhere, new { ip_address = post.Ip_address, ip_port = post.Ip_port, building_tag = post.building_tag }); if (buildInfos.Count == 0) { judgeIPAddressRepeat = false; } if (!judgeIPAddressRepeat) { //Check for duplicate building tag sWhere = $@"deleted = 0 AND building_tag = @Building_tag"; buildInfos = await backendRepository.GetAllAsync("building", sWhere, new { building_tag = post.building_tag }); if (buildInfos.Count > 0) { apiResult.Code = "0002"; apiResult.Msg = "區域代號不可重複"; return apiResult; } //新增 //抓取當前的Priority var current_priority = await backendRepository.GetCurrentPriority("building"); var map_3d_guid = Guid.NewGuid(); var area_tag = await backendRepository.GetOneAsync("select system_value from variable where system_type = 'area' and deleted = 0"); if (post.urn_3D != null) { Dictionary building = new Dictionary(); building = new Dictionary() { { "@area_tag", area_tag}, { "@building_tag", post.building_tag}, { "@full_name", post.Full_name}, { "@ip_address", post.Ip_address}, { "@ip_port", post.Ip_port}, { "@priority", current_priority + 1}, { "@orgName_3D", post.orgName_3D}, { "@saveName_3D", map_3d_guid}, { "@extName_3D", post.extName_3D}, { "@urn_3D", post.urn_3D}, { "@created_by", myUserInfo.Userinfo_guid} }; sWhere = $@"deleted = 1 AND building_tag = @Building_tag"; buildInfos = await backendRepository.GetAllAsync("building", sWhere, new { building_tag = post.building_tag }); if (buildInfos.Count == 0) await backendRepository.AddOneByCustomTable(building, "building"); else { building.Add("@deleted", 0); await backendRepository.UpdateOneByCustomTable(building, "building", "building_tag='" + post.building_tag + "'"); } } else { Dictionary building = new Dictionary(); building = new Dictionary() { { "@area_tag", area_tag}, { "@building_tag", post.building_tag}, { "@full_name", post.Full_name}, { "@ip_address", post.Ip_address}, { "@ip_port", post.Ip_port}, { "@priority", current_priority + 1}, { "@orgName_3D", post.orgName_3D}, { "@saveName_3D", map_3d_guid}, { "@extName_3D", post.extName_3D}, { "@created_by", myUserInfo.Userinfo_guid} }; sWhere = $@"deleted = 1 AND building_tag = @Building_tag"; buildInfos = await backendRepository.GetAllAsync("building", sWhere, new { building_tag = post.building_tag }); if (buildInfos.Count == 0) await backendRepository.AddOneByCustomTable(building, "building"); else { building.Add("@deleted", 0); await backendRepository.UpdateOneByCustomTable(building, "building", "building_tag='" + post.building_tag + "'"); } } if (post.orgName_3D != null && post.extName_3D != null) { var fileName = map_3d_guid + "." + post.extName_3D; var fullPath = Path.Combine(buildMapFileSaveAsPath, fileName); if (!System.IO.Directory.Exists(buildMapFileSaveAsPath)) System.IO.Directory.CreateDirectory(buildMapFileSaveAsPath); using (var stream = new FileStream(fullPath, FileMode.Create)) { post.Map3dFile.CopyTo(stream); } var frontendPath = await backendRepository.GetOneAsync("select system_value from variable where system_type = 'directory_build_map' and system_key = 'frontend'"); fullPath = frontendPath; if (!System.IO.Directory.Exists(fullPath)) System.IO.Directory.CreateDirectory(fullPath); fullPath = Path.Combine(fullPath, fileName); using (var stream = new FileStream(fullPath, FileMode.Create)) { post.Map3dFile.CopyTo(stream); } } apiResult.Code = "0000"; apiResult.Msg = "新增成功"; } else { apiResult.Code = "0001"; apiResult.Msg = "監控主機IP不可重複"; } } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; string json = System.Text.Json.JsonSerializer.Serialize(post); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 新增 / 修改 區域基本資料 /// /// /// [HttpPost] public async Task> EditBuildInfo([FromForm] BuildInfo post) { ApiResult apiResult = new ApiResult(); try { //判斷監控主機IP是否重複 var judgeIPAddressRepeat = true; var sWhere = $@"deleted = 0 AND ip_address = @ip_address AND ip_port = @ip_port AND building_tag != @building_tag"; var buildInfos = await backendRepository.GetAllAsync("building", sWhere, new { ip_address = post.Ip_address, ip_port = post.Ip_port, building_tag = post.building_tag }); sWhere = $@"deleted = 0 AND building_tag = @building_tag"; var buildInfo = await backendRepository.GetOneAsync("building", sWhere, new { building_tag = post.building_tag }); if (buildInfos.Count == 0) { judgeIPAddressRepeat = false; } if (!judgeIPAddressRepeat) { if (post.urn_3D != null) { Dictionary building = new Dictionary(); building = new Dictionary() { { "@full_name", post.Full_name}, { "@ip_address", post.Ip_address}, { "@ip_port", post.Ip_port}, { "@orgName_3D", post.orgName_3D}, { "@extName_3D", post.extName_3D}, { "@urn_3D", post.urn_3D}, { "@updated_by", myUserInfo.Userinfo_guid}, { "@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} }; await backendRepository.UpdateOneByCustomTable(building, "building", "building_tag='" + post.building_tag + "'"); } else { Dictionary building = new Dictionary(); building = new Dictionary() { { "@full_name", post.Full_name}, { "@ip_address", post.Ip_address}, { "@ip_port", post.Ip_port}, { "@orgName_3D", post.orgName_3D}, { "@extName_3D", post.extName_3D}, { "@updated_by", myUserInfo.Userinfo_guid}, { "@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} }; await backendRepository.UpdateOneByCustomTable(building, "building", "building_tag='" + post.building_tag + "'"); } if (post.orgName_3D != null && post.extName_3D != null) { var map_3d_guid = Guid.NewGuid(); //刪除原本檔案 if (buildInfo.saveName_3D != null) { FolderFunction folderFunction = new FolderFunction(); folderFunction.DeleteFile(Path.Combine(buildMapFileSaveAsPath, buildInfo.saveName_3D + "." + buildInfo.extName_3D)); } Dictionary build_map_3d_dic = new Dictionary(); build_map_3d_dic = new Dictionary() { { "@saveName_3D", map_3d_guid} }; await backendRepository.UpdateOneByCustomTable(build_map_3d_dic, "building", "building_tag='" + post.building_tag + "'"); var fileName = map_3d_guid + "." + post.extName_3D; var fullPath = Path.Combine(buildMapFileSaveAsPath, fileName); if (!System.IO.Directory.Exists(buildMapFileSaveAsPath)) System.IO.Directory.CreateDirectory(buildMapFileSaveAsPath); using (var stream = new FileStream(fullPath, FileMode.Create)) { post.Map3dFile.CopyTo(stream); } var frontendPath = await backendRepository.GetOneAsync("select system_value from variable where system_type = 'directory_build_map' and system_key = 'frontend'"); fullPath = frontendPath; if (!System.IO.Directory.Exists(fullPath)) System.IO.Directory.CreateDirectory(fullPath); fullPath = Path.Combine(fullPath, fileName); using (var stream = new FileStream(fullPath, FileMode.Create)) { post.Map3dFile.CopyTo(stream); } } apiResult.Code = "0000"; apiResult.Msg = "修改成功"; } else { apiResult.Code = "0001"; apiResult.Msg = "監控主機IP不可重複"; } } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; string json = System.Text.Json.JsonSerializer.Serialize(post); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } [HttpPost] public async Task> DeleteOneBuild(string tag) { var apiResult = new ApiResult(); try { string sWhere = @$"deleted = @Deleted AND building_tag = @Tag"; object param = new { Deleted = 0, Tag = tag }; var buildInfo = await backendRepository.GetOneAsync("building", sWhere, param); if (buildInfo == null) { apiResult.Code = "9998"; apiResult.Msg = "查無該區域資料"; return apiResult; } //檢查是否有未刪除的區域選單 var sbuildMenuWhere = $@"building_tag = @Tag"; var buildMenus = await backendRepository.GetAllAsync("building_menu", sbuildMenuWhere, new { Tag = tag }); if (buildMenus.Count > 0) { apiResult.Code = "9997"; apiResult.Msg = "區域選單中尚有選單正在使用該棟別,故無法刪除"; return apiResult; } //檢查底下是否有未刪除的樓層 var sfloorWhere = $@"deleted = 0 AND building_tag = @tag"; var floors = await backendRepository.GetAllAsync("floor", sfloorWhere, new { Tag = tag }); if (floors.Count > 0) { apiResult.Code = "9997"; apiResult.Msg = "樓層設定中尚有以下樓層正在使用該棟別,故無法刪除"; apiResult.Data = string.Join("
", floors.Select(x => x.Full_name).ToList()); return apiResult; } await backendRepository.DeleteOne(tag, "building", "building_tag"); apiResult.Code = "0000"; apiResult.Msg = "刪除成功"; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + "building_tag=" + tag); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 修改棟別區域排列順序 /// /// [HttpPost] public async Task>> ChangeBuildInfoPriority(PostBuildInfoPriority post) { ApiResult> apiResult = new ApiResult>(); try { List> building_priorities = new List>(); if (post.BuildInfoPriorities != null) { foreach (var building_priority in post.BuildInfoPriorities) { Dictionary building_priority_dic = new Dictionary(); building_priority_dic = new Dictionary() { { "building_tag", building_priority.Building_tag}, { "@priority", building_priority.Priority}, { "@updated_by", myUserInfo.Userinfo_guid}, { "@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} }; building_priorities.Add(building_priority_dic); } var sql = $@"UPDATE building SET priority = @priority, updated_by = @updated_by, updated_at=@updated_at WHERE building_tag = @building_tag"; await backendRepository.ExecuteSql(sql, building_priorities); } apiResult.Code = "0000"; apiResult.Msg = "修改成功"; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 樓層列表 /// /// /// [HttpPost] public async Task>> BuildFloorList(string build_tag) { ApiResult> apiResult = new ApiResult>(); List buildInfo = new List(); try { var sqlString = @$"SELECT A.floor_guid, A.full_name, CONCAT(InitMapName, '.svg') AS 'initMapName', A.priority, A.created_at FROM floor A WHERE deleted = @deleted AND A.building_tag = @building_tag ORDER BY A.priority ASC"; buildInfo = await backendRepository.GetAllAsync(sqlString, new { deleted = 0, building_tag = build_tag }); apiResult.Code = "0000"; apiResult.Data = buildInfo; } catch (Exception exception) { apiResult.Code = "9999"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 取得單一樓層設定 /// /// /// [HttpPost] public async Task> GetOneBuildFloor(string guid) { ApiResult apiResult = new ApiResult(); try { string sWhere = @$"deleted = @Deleted AND floor_guid = @Guid"; object param = new { Deleted = 0, Guid = guid }; var buildFloor = await backendRepository.GetOneAsync("floor", sWhere, param); if (!string.IsNullOrEmpty(buildFloor.InitMapName)) { buildFloor.MapUrl = "/upload/floor_map/" + buildFloor.Floor_guid + ".svg"; } apiResult.Code = "0000"; apiResult.Data = buildFloor; } catch (Exception exception) { apiResult.Code = "9999"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 新增 / 修改 樓層設定 /// /// /// [HttpPost] public async Task> SaveBuildFloor([FromForm] BuildFloor post) { ApiResult apiResult = new ApiResult(); try { var check = await backendRepository.GetOneAsync($@"select floor_guid from floor where floor_guid != '{post.Floor_guid ?? ""}' and building_tag = '{post.Building_tag}' and full_name = '{post.Full_name}' and deleted = 0;"); if (!string.IsNullOrEmpty(check)) { apiResult.Code = "9998"; apiResult.Msg = "已有相同樓層"; return apiResult; } string sWhere = @$"deleted = @Deleted AND floor_guid = @Guid"; object param = new { Deleted = 0, Guid = post.Floor_guid }; var buildFloor = await backendRepository.GetOneAsync("floor", sWhere, param); if (buildFloor == null) { //新增 //產生一組GUID var guid = Guid.NewGuid(); var floor_map_guid = Guid.NewGuid(); //抓取當前的Priority var current_priority = await backendRepository.GetCurrentPriority("floor", "deleted = 0 AND building_tag = '" + post.Building_tag + "'"); Dictionary floor = new Dictionary(); floor = new Dictionary() { { "@floor_guid", guid}, { "@building_tag", post.Building_tag}, { "@full_name", post.Full_name}, { "@InitMapName", post.InitMapName}, { "@floor_map_name", floor_map_guid}, { "@orgName_3D", post.orgName_3D}, { "@saveName_3D", post.saveName_3D}, { "@extName_3D", post.extName_3D}, { "@priority", current_priority + 1}, { "@created_by", myUserInfo.Userinfo_guid} }; await backendRepository.AddOneByCustomTable(floor, "floor"); if (post.MapFile != null) { var split = post.MapFile.FileName.Split("."); var fileName = floor_map_guid + "." + split[split.Length - 1]; var fullPath = Path.Combine(mapFileSaveAsPath, fileName); if (!System.IO.Directory.Exists(mapFileSaveAsPath)) System.IO.Directory.CreateDirectory(mapFileSaveAsPath); using (var stream = new FileStream(fullPath, FileMode.Create)) { post.MapFile.CopyTo(stream); } var frontendPath = await backendRepository.GetOneAsync("select system_value from variable where system_type = 'directory_floor_map' and system_key = 'frontend'"); fullPath = frontendPath; if (!System.IO.Directory.Exists(fullPath)) System.IO.Directory.CreateDirectory(fullPath); fullPath = Path.Combine(fullPath, fileName); using (var stream = new FileStream(fullPath, FileMode.Create)) { post.MapFile.CopyTo(stream); } } apiResult.Code = "0000"; apiResult.Msg = "新增成功"; } else //修改 { Dictionary floor = new Dictionary(); floor = new Dictionary() { { "@full_name", post.Full_name}, { "@InitMapName", post.InitMapName}, { "@updated_by", myUserInfo.Userinfo_guid}, { "@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} }; await backendRepository.UpdateOneByCustomTable(floor, "floor", "floor_guid='" + post.Floor_guid + "'"); var floor_map_guid = Guid.NewGuid(); if (post.MapFile != null) { //刪除原本檔案 FolderFunction folderFunction = new FolderFunction(); folderFunction.DeleteFile(Path.Combine(mapFileSaveAsPath, buildFloor.Floor_map_name + ".svg")); Dictionary floor_map_dic = new Dictionary(); floor_map_dic = new Dictionary() { { "@floor_map_name", floor_map_guid}, }; await backendRepository.UpdateOneByCustomTable(floor_map_dic, "floor", "floor_guid='" + post.Floor_guid + "'"); var split = post.MapFile.FileName.Split("."); var fileName = floor_map_guid + "." + split[split.Length - 1]; var fullPath = Path.Combine(mapFileSaveAsPath, fileName); if (!System.IO.Directory.Exists(mapFileSaveAsPath)) System.IO.Directory.CreateDirectory(mapFileSaveAsPath); using (var stream = new FileStream(fullPath, FileMode.Create)) { post.MapFile.CopyTo(stream); } var frontendPath = await backendRepository.GetOneAsync("select system_value from variable where system_type = 'directory_floor_map' and system_key = 'frontend'"); fullPath = frontendPath; if (!System.IO.Directory.Exists(fullPath)) System.IO.Directory.CreateDirectory(fullPath); fullPath = Path.Combine(fullPath, fileName); using (var stream = new FileStream(fullPath, FileMode.Create)) { post.MapFile.CopyTo(stream); } } apiResult.Code = "0000"; apiResult.Msg = "修改成功"; } } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; string json = System.Text.Json.JsonSerializer.Serialize(post); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 修改樓層排列順序 /// /// [HttpPost] public async Task>> ChangeFloorPriority(PostFloorPriority post) { ApiResult> apiResult = new ApiResult>(); try { List> floor_priorities = new List>(); if (post.FloorPriorities != null) { foreach (var floor_priority in post.FloorPriorities) { Dictionary floor_priority_dic = new Dictionary(); floor_priority_dic = new Dictionary() { { "@floor_guid", floor_priority.Floor_guid}, { "@priority", floor_priority.Priority}, { "@updated_by", myUserInfo.Userinfo_guid}, { "@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} }; floor_priorities.Add(floor_priority_dic); } var sql = $@"UPDATE floor SET priority = @priority, updated_by = @updated_by, updated_at=@updated_at WHERE floor_guid = @floor_guid"; await backendRepository.ExecuteSql(sql, floor_priorities); } apiResult.Code = "0000"; apiResult.Msg = "修改成功"; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 刪除單一樓層設定 /// /// /// [HttpPost] public async Task> DeleteOneFloor(string guid) { var apiResult = new ApiResult(); try { string sWhere = @$"deleted = @Deleted AND floor_guid = @Guid"; object param = new { Deleted = 0, Guid = guid }; var buildFloor = await backendRepository.GetOneAsync("floor", sWhere, param); if (buildFloor == null) { apiResult.Code = "9998"; apiResult.Msg = "查無該樓層設定"; return apiResult; } //判斷區域選單是否還有使用該樓層 var sub_system_where = $@"SELECT CONCAT(b.full_name, ' - ', mv.system_key, ' - ', sv.system_key) FROM ( SELECT ssf.building_tag, ssf.main_system_tag, ssf.sub_system_tag FROM sub_system_floor ssf WHERE ssf.deleted = 0 AND ssf.floor_tag = @floor_tag and ssf.building_tag = '{buildFloor.Building_tag}' ) ssf LEFT JOIN building b ON ssf.building_tag = b.building_tag AND b.deleted = 0 LEFT JOIN variable mv ON ssf.main_system_tag = mv.system_value AND mv.system_type = @main_system_type AND mv.deleted = 0 LEFT JOIN variable sv ON ssf.sub_system_tag = sv.system_value AND sv.system_type = @sub_system_type AND sv.deleted = 0"; var sub_system_floors = await backendRepository.GetAllAsync(sub_system_where, new { floor_tag = buildFloor.Full_name, main_system_type = main_system_type, sub_system_type = sub_system_type }); if (sub_system_floors.Count > 0) { apiResult.Code = "9997"; apiResult.Msg = "區域選單中尚有以下選單正在使用該樓層,故無法刪除"; apiResult.Data = string.Join("
", sub_system_floors); return apiResult; } await backendRepository.DeleteOne(guid, "floor", "floor_guid"); apiResult.Code = "0000"; apiResult.Msg = "刪除成功"; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; Logger.LogError("【" + controllerName + "/" + actionName + "】" + "floor_guid=" + guid); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } } }