From e24d040703c19587c93d175e302163b48a1abdf0 Mon Sep 17 00:00:00 2001 From: wanli Date: Wed, 2 Nov 2022 17:26:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[=E5=BE=8C=E5=8F=B0]=20N4=E8=B3=87=E6=96=99?= =?UTF-8?q?=E6=9F=A5=E8=A9=A2=E8=88=87=E5=90=8C=E6=AD=A5=E8=87=B3=E8=B3=87?= =?UTF-8?q?=E6=96=99=E8=A1=A8=E4=B8=AD=EF=BC=9B=E6=96=B0=E5=A2=9EN4?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=A0=81=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NiagaraDataSynchronizeController.cs | 95 ++++ Backend/N4.xml | 97 ++++ .../Services/Implement/webRequestService.cs | 131 +++++ Backend/Startup.cs | 1 + .../Views/NiagaraDataSynchronize/Index.cshtml | 168 ++++++ Backend/Views/Shared/_Layout.cshtml | 10 +- .../NiagaraDataSynchronizeRepository.cs | 507 ++++++++++++++++++ .../INiagaraDataSynchronizeRepository.cs | 44 ++ Repository/Models/BackgroundServiceTask.cs | 56 ++ Repository/Models/quickType.cs | 81 +++ 10 files changed, 1189 insertions(+), 1 deletion(-) create mode 100644 Backend/Controllers/NiagaraDataSynchronizeController.cs create mode 100644 Backend/N4.xml create mode 100644 Backend/Services/Implement/webRequestService.cs create mode 100644 Backend/Views/NiagaraDataSynchronize/Index.cshtml create mode 100644 Repository/BackendRepository/Implement/NiagaraDataSynchronizeRepository.cs create mode 100644 Repository/BackendRepository/Interface/INiagaraDataSynchronizeRepository.cs create mode 100644 Repository/Models/quickType.cs diff --git a/Backend/Controllers/NiagaraDataSynchronizeController.cs b/Backend/Controllers/NiagaraDataSynchronizeController.cs new file mode 100644 index 0000000..5687558 --- /dev/null +++ b/Backend/Controllers/NiagaraDataSynchronizeController.cs @@ -0,0 +1,95 @@ +using Microsoft.AspNetCore.Mvc; +using Repository.BackendRepository.Interface; +using System.Collections.Generic; +using System.Threading.Tasks; +using System; +//using Backend.Models; +using Microsoft.Extensions.Logging; +using Backend.Services; +using Backend.Services.Implement; +using Repository.Models; + +namespace Backend.Controllers +{ + public class NiagaraDataSynchronizeController : MybaseController + { + private readonly IBackendRepository backendRepository; + //private readonly IDeviceImportRepository deviceImportRepository; + private readonly INiagaraDataSynchronizeRepository niagaraDataSynchronizeRepository; + public NiagaraDataSynchronizeController(IBackendRepository backendRepository, INiagaraDataSynchronizeRepository niagaraDataSynchronizeRepository) + { + this.backendRepository = backendRepository; + //this.deviceImportRepository = deviceImportRepository; + this.niagaraDataSynchronizeRepository = niagaraDataSynchronizeRepository; + } + + public IActionResult Index() + { + return View(); + } + + /// + /// N4匯入列表 + /// + /// + [HttpPost] + public Task>> RawDataList() + { + ApiResult> apiResult = new ApiResult>(); + + try + { + List ds; + string url_slot = "slot:/Arena/H|"; + string top100 = " top 100 "; + webRequestService svc = new webRequestService(); + string bql = url_slot + "bql:select " + top100 + " * from control:ControlPoint "; + ds = svc.obixQuery("http://60.251.164.125:8080/obix/config/Arena/Program/ObixQuery/query/", bql); + + apiResult.Code = "0000"; + apiResult.Data = ds; + } + catch (Exception exception) + { + apiResult.Code = "9999"; + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + } + + //return apiResult; + return Task.FromResult(apiResult); + } + + /// + /// 比對N4與資料表,有差異在同步至資料表中 + /// + /// + [HttpPost] + public async Task> CompareData(List ds, string building) + { + bool result = false; + ApiResult apiResult = new ApiResult(); + try + { + + await niagaraDataSynchronizeRepository.InsertNiagaraTagList(ds, building); + await niagaraDataSynchronizeRepository.InsertItemFromNiagara(ds, building); + await niagaraDataSynchronizeRepository.DeviceComparison(); + await niagaraDataSynchronizeRepository.DeviceItemComparison(); + await niagaraDataSynchronizeRepository.InsertBuildingMenu(); + await niagaraDataSynchronizeRepository.InsertSubSystemFloor(); + result = true; + + apiResult.Code = "0000"; + apiResult.Data = result; + } + catch (Exception exception) + { + apiResult.Code = "9999"; + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + } + + return apiResult; + } + + } +} diff --git a/Backend/N4.xml b/Backend/N4.xml new file mode 100644 index 0000000..2764606 --- /dev/null +++ b/Backend/N4.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Backend/Services/Implement/webRequestService.cs b/Backend/Services/Implement/webRequestService.cs new file mode 100644 index 0000000..aa56566 --- /dev/null +++ b/Backend/Services/Implement/webRequestService.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml; +using Newtonsoft.Json; +using Repository.Models; +using Newtonsoft.Json.Linq; +using System.IO; +using System.Net; +using System.Text; +using System.Xml.Linq; +using Repository.BackendRepository.Implement; +using Repository.BackendRepository; + +namespace Backend.Services.Implement +{ + public class webRequestService + { + public List obixQuery(string urlString, string bql) + { + List result = new List(); + String username = "obixUser"; + String password = "Admin123456"; + String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password)); + String API_Url = urlString; + + XmlDocument xmlDoc = new XmlDocument(); + //xmlDoc.LoadXml(responseString); + xmlDoc.Load("N4.xml");//N4v1021 + + //xmlDoc.Save("N4.xml"); + + string jsonText = JsonConvert.SerializeXmlNode(xmlDoc); + var data = Welcome.FromJson(jsonText); + + foreach (var item in data.Obj.Str) + { + Device_value row = new Device_value(); + row.value = item.Val; + string[] s1 = item.Val.Split(','); + + string[] s2 = s1[0].Split('/'); + foreach (var ss in s2) + { + if (ss.Contains('_')) + { + string[] s3 = ss.Split('_'); + if (s3.Count() > 3) + { + row.tag_name = ss; + row.point_name = s2[s2.Length - 2]; + break; + } + } + } + result.Add(row); + + } + return result; + } + + //public void getObix() + //{ + // //#region 取得obix 設定 + // //var obixApiConfig = new ObixApiConfig(); + + // //var sqlObix = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'obixConfig'"; + + // //var variableObix = await backgroundServiceRepository.GetAllAsync(sqlObix); + // //obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault(); + // //obixApiConfig.UserName = ed.AESDecrypt(variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault()); + // //obixApiConfig.Password = ed.AESDecrypt(variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault()); + + // //String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password)); + // //#endregion 取得obix 設定 + + + // HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/FIC_Center/{deviceNumberPoint.FullDeviceNumberPoint}/~historyRollup/"); + // //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/FIC_Center/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveMonthRequest.Method = "POST"; + // archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveMonthRequest.PreAuthenticate = true; + + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveMonthRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } + + // HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse(); + // var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd(); + + // xmlDocument.LoadXml(archiveMonthResponseContent); + // string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument); + // JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson); + + // if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】"); + // //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveMonthJsonResult); + + // Dictionary archiveMonthRawData = new Dictionary(); + // archiveMonthRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); + // archiveMonthRawData.Add("@point", deviceNumberPoint.Point); + // archiveMonthRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveMonthRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveMonthRawData.Add("@is_complete", 0); + // archiveMonthRawData.Add("@repeat_times", 0); + // archiveMonthRawData.Add("@fail_reason", archiveMonthJson); + + // archiveMonthRawData.Add("@count_rawdata", 0); + // archiveMonthRawData.Add("@min_rawdata", 0); + // archiveMonthRawData.Add("@max_rawdata", 0); + // archiveMonthRawData.Add("@avg_rawdata", 0); + // archiveMonthRawData.Add("@sum_rawdata", 0); + // archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + + // archiveMonthRawDatas.Add(archiveMonthRawData); + // } + + // if (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // archiveMonthRawDatas.AddRange(ArrangeRawDatas); + // } + // } + //} + } +} diff --git a/Backend/Startup.cs b/Backend/Startup.cs index f1f29ac..53a99f0 100644 --- a/Backend/Startup.cs +++ b/Backend/Startup.cs @@ -95,6 +95,7 @@ namespace Backend services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); #endregion Repository `J #region JWT `J diff --git a/Backend/Views/NiagaraDataSynchronize/Index.cshtml b/Backend/Views/NiagaraDataSynchronize/Index.cshtml new file mode 100644 index 0000000..ac25e57 --- /dev/null +++ b/Backend/Views/NiagaraDataSynchronize/Index.cshtml @@ -0,0 +1,168 @@ +@{ + ViewData["MainNum"] = "2"; + ViewData["SubNum"] = "3"; + ViewData["Title"] = "Niagara資料同步"; +} + + + +
+
+
+
+
+ +
+
+
+ + +
+ @*
+ + +
*@ +
+
+ +
+ + +
+ +
+
+ +
+

+
+ +
+
+
+
+ Niagara資料 +
+
+
+
+ + + + + + + + + + + +
valuetag_namepoint_name
+
+
+
+
+ +
+
+
+
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/Backend/Views/Shared/_Layout.cshtml b/Backend/Views/Shared/_Layout.cshtml index 47f35ad..3092ef9 100644 --- a/Backend/Views/Shared/_Layout.cshtml +++ b/Backend/Views/Shared/_Layout.cshtml @@ -112,7 +112,7 @@ } - @if (ViewBag.role.Contains("DeviceImportIndex") || ViewBag.role.Contains("DeviceManageIndex")) + @if (ViewBag.role.Contains("DeviceImportIndex") || ViewBag.role.Contains("DeviceManageIndex") || ViewBag.role.Contains("NiagaraDataSynchronizeIndex")) {
  • @@ -136,6 +136,14 @@
  • } + @if (ViewBag.role.Contains("NiagaraDataSynchronizeIndex")) + { +
  • + + Niagara資料同步 + +
  • + } } diff --git a/Repository/BackendRepository/Implement/NiagaraDataSynchronizeRepository.cs b/Repository/BackendRepository/Implement/NiagaraDataSynchronizeRepository.cs new file mode 100644 index 0000000..dc135f5 --- /dev/null +++ b/Repository/BackendRepository/Implement/NiagaraDataSynchronizeRepository.cs @@ -0,0 +1,507 @@ +using Dapper; +using Repository.BackendRepository.Interface; +using Repository.Helper; +using System; +using System.Text; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Transactions; +using Repository.Models; + + +namespace Repository.BackendRepository.Implement +{ + public class NiagaraDataSynchronizeRepository : BackendRepository, INiagaraDataSynchronizeRepository + { + public NiagaraDataSynchronizeRepository(IDatabaseHelper databaseHelper) : base(databaseHelper) + { + } + + /// + /// 更新import_niagara_tag資料表 + /// + /// + /// + /// + public async Task InsertNiagaraTagList(List ds, string building) + { + using (IDbConnection conn = GetDbConnection()) + { + conn.Open(); + using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) + { + try + { + string sql = @"CREATE TABLE IF NOT EXISTS `import_niagara_tag` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `db_tags` varchar(50) DEFAULT NULL, + `niagara_tags` varchar(50) DEFAULT NULL, + `device_area_tag` varchar(50) DEFAULT NULL, + `device_building_tag` varchar(50) DEFAULT NULL, + `device_system_tag` varchar(50) DEFAULT NULL, + `device_name_tag` varchar(50) DEFAULT NULL, + `device_floor_tag` varchar(50) DEFAULT NULL, + `device_master_tag` varchar(50) DEFAULT NULL, + `device_last_name_tag` varchar(50) DEFAULT NULL, + `device_serial_tag` varchar(50) DEFAULT NULL, + `atDateTime` datetime(1) DEFAULT NULL, + `is_used` smallint(1) DEFAULT 0, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"; + await conn.ExecuteAsync(sql); + sql = "delete from import_niagara_tag where device_building_tag = '" + building + "'"; + await conn.ExecuteAsync(sql); + + //N4資料groupBy後放入import_niagara_tag資料表 + var ds2 = ds.GroupBy(x => new + { + tag_name2 = x.tag_name + }).Select(x => new Device_value + { + tag_name = x.Key.tag_name2 + }); + + StringBuilder sb = new StringBuilder(); + + foreach (var row in ds2) + { + if (string.IsNullOrEmpty(row.tag_name)) continue; + string[] arrTag = row.tag_name.Split('_'); + + sb.Append($@" insert import_niagara_tag(niagara_tags, device_area_tag, device_building_tag, device_system_tag, + device_name_tag, device_floor_tag, device_master_tag, device_last_name_tag, device_serial_tag, atDateTime) values('" + + row.tag_name + "', '" + + arrTag[0] + "', '" + + arrTag[1] + "', '" + + arrTag[2] + "', '" + + arrTag[3] + "', '" + + arrTag[4] + "', '" + + arrTag[5] + "', '" + + arrTag[6] + "', '" + + arrTag[7] + "', " + + "now());"); + } + if (sb.Length > 0) + { + await conn.ExecuteAsync(sb.ToString()); + sb.Clear(); + } + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + } + } + } + + /// + /// 更新import_niagara_tag資料表 + /// + /// + /// + /// + public async Task InsertItemFromNiagara(List ds, string building) + { + using (IDbConnection conn = GetDbConnection()) + { + conn.Open(); + using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) + { + try + { + #region 刪除 import_niagara_item資料表中選取的棟別 + string sql = @"CREATE TABLE IF NOT EXISTS `import_niagara_item` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `device_area_tag` varchar(50) DEFAULT NULL, + `device_building_tag` varchar(50) DEFAULT NULL, + `device_system_tag` varchar(50) DEFAULT NULL, + `device_name_tag` varchar(50) DEFAULT NULL, + `device_point_name` varchar(50) DEFAULT NULL, + `check_status` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"; + await conn.ExecuteAsync(sql); + sql = "delete from import_niagara_item where device_building_tag = '" + building + "'"; + await conn.ExecuteAsync(sql); + #endregion + + List dt_item = new List(); + + foreach (var row in ds) + { + if (string.IsNullOrEmpty(row.tag_name)) continue; + string[] arrTag = row.tag_name.Split('_'); + + #region for item + Device_item8 row_item = new Device_item8(); + row_item.tag_name = row.tag_name; + row_item.device_area_tag = arrTag[0]; + row_item.device_building_tag = arrTag[1]; + row_item.device_system_tag = arrTag[2]; + row_item.device_name_tag = arrTag[3]; + row_item.device_floor_tag = arrTag[4]; + row_item.device_master_tag = arrTag[5]; + row_item.device_last_name_tag = arrTag[6]; + row_item.device_serial_tag = arrTag[7]; + row_item.point_name = row.point_name; + dt_item.Add(row_item); + #endregion + } + + #region N4資料groupBy後放入import_niagara_item資料表 + var ds2_item = dt_item.GroupBy(x => new + { + device_area_tag2 = x.device_area_tag, + device_building_tag2 = x.device_building_tag, + device_system_tag2 = x.device_system_tag, + device_name_tag2 = x.device_name_tag, + point_name2 = x.point_name + }).Select(x => new Device_item8 + { + device_area_tag = x.Key.device_area_tag2, + device_building_tag = x.Key.device_building_tag2, + device_system_tag = x.Key.device_system_tag2, + device_name_tag = x.Key.device_name_tag2, + point_name = x.Key.point_name2 + }); + + StringBuilder sb = new StringBuilder(); + + foreach (var row2 in ds2_item) + { + sb.Append($@" insert import_niagara_item(device_area_tag, device_building_tag, device_system_tag, device_name_tag, device_point_name) + values('" + + row2.device_area_tag + "', '" + + row2.device_building_tag + "', '" + + row2.device_system_tag + "', '" + + row2.device_name_tag + "', '" + + row2.point_name + "'" + + ");"); + } + if (sb.Length > 0) + { + await conn.ExecuteAsync(sb.ToString()); + sb.Clear(); + } + #endregion + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + } + } + } + /// + /// 比對 device + /// + /// + public async Task DeviceComparison() + { + using (IDbConnection conn = GetDbConnection()) + { + conn.Open(); + using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) + { + try + { + List result; + StringBuilder sb = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); + sb.Append($@" SELECT m.* + FROM import_niagara_tag m + LEFT JOIN device d + ON m.niagara_tags = d.device_number + WHERE d.device_number IS NULL"); + result = (await conn.QueryAsync(sb.ToString())).ToList(); + + sb.Clear(); + //新增至device, is_link = 1 + if (result.Count > 0) + { + foreach (var data in result) + { + sb.Append($@" insert device(device_guid, deleted, status, priority, is_link, device_area_tag, + device_building_tag, device_system_tag, device_name_tag, device_floor_tag, device_master, + device_last_name, device_serial_tag, device_number, device_system_category_layer3, created_at, updated_at) + values(uuid(), 0, 1, 0, 1, '" + + data.device_area_tag + "', '" + + data.device_building_tag + "', '" + + data.device_system_tag + "', '" + + data.device_name_tag + "', '" + + + data.device_floor_tag + "', '" + + data.device_master_tag + "', '" + + data.device_last_name_tag + "', '" + + data.device_serial_tag + "', '" + + data.niagara_tags + "', '" + + data.device_system_tag + "', now(), now() );"); + + sb2.Append($@"INSERT device_kind (device_kind_guid, device_building_tag, device_system_tag, device_name_tag, + device_normal_flashing, device_close_flashing, device_error_flashing, device_error_independent, + created_by, created_at) + VALUES (uuid(), '" + data.device_building_tag + "', '" + data.device_system_tag + "', '" + data.device_name_tag + + "', 0, 0, 1, 0, 'B43E3CA7-96DD-4FC7-B6E6-974ACC3B0878', now());"); + } + if (sb.Length > 0) + { + await conn.ExecuteAsync(sb.ToString()); + await conn.ExecuteAsync(sb2.ToString()); + sb.Clear(); + sb2.Clear(); + } + } + + //device有,niagara沒有,is_link 更新成 0 + sb.Append($@" SET SQL_SAFE_UPDATES = 0; + UPDATE device d LEFT JOIN import_niagara_tag m ON d.device_number = m.niagara_tags + SET d.is_link = 0 + WHERE m.niagara_tags IS NULL"); + await conn.ExecuteAsync(sb.ToString()); + + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + } + } + } + + /// + /// 比對 device_item + /// + /// + public async Task DeviceItemComparison() + { + using (IDbConnection conn = GetDbConnection()) + { + conn.Open(); + using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) + { + try + { + List result; + StringBuilder sb = new StringBuilder(); + sb.Append($@" SELECT m.* + FROM import_niagara_item m + LEFT JOIN device_item d + ON m.device_system_tag = d.device_system_tag and m.device_name_tag = d.device_name_tag and m.device_point_name = d.points + WHERE d.points IS NULL"); + result = (await conn.QueryAsync(sb.ToString())).ToList(); + + sb.Clear(); + //新增至device, is_link = 1 + if (result.Count > 0) + { + foreach (var data in result) + { + var isControll = 0; + var isBool = 0; + if (data.device_point_name == "ER" || data.device_point_name == "AL" || data.device_point_name == "ST") + { + isControll = 1; + } + if (data.device_point_name == "ER" || data.device_point_name == "ST") + { + isBool = 1; + } + sb.Append($@"insert device_item(deleted, points, is_show, is_show_riserDiagram, is_controll, is_bool, is_link, + device_system_tag, device_name_tag, created_at, updated_at) + VALUES (0, '" + + data.device_point_name + "', 1, 0, " + + isControll + "," + + isBool + ", 1, '" + + data.device_system_tag + "', '" + + data.device_name_tag + "', " + + "now(), now());"); + } + if (sb.Length > 0) + { + await conn.ExecuteAsync(sb.ToString()); + sb.Clear(); + } + } + //device有,niagara沒有,is_link 更新成 0 + sb.Append($@" SET SQL_SAFE_UPDATES = 0; + UPDATE device_item d LEFT JOIN import_niagara_item m + ON d.device_system_tag = m.device_system_tag and d.device_name_tag = m.device_name_tag and d.points = m.device_point_name + SET d.is_link = 0 + WHERE m.device_point_name IS NULL"); + await conn.ExecuteAsync(sb.ToString()); + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + } + } + } + + /// + /// 新增資料至 buildingMenu + /// + /// + public async Task InsertBuildingMenu() + { + using (IDbConnection conn = GetDbConnection()) + { + conn.Open(); + using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) + { + try + { + List result; + StringBuilder sb = new StringBuilder(); + #region comparison building_menu and import_niagara_tag + sb.Append($@" select a.* from ( + select device_building_tag, device_system_tag, device_name_tag + from import_niagara_tag + group by device_building_tag, device_system_tag, device_name_tag + ) AS a + LEFT JOIN building_menu b + ON a.device_building_tag = b.device_building_tag and a.device_system_tag = b.device_system_tag and a.device_name_tag = b.sub_system_tag + WHERE b.device_building_tag IS NULL"); + result = (await conn.QueryAsync(sb.ToString())).ToList(); + #endregion + sb.Clear(); + + if (result.Count > 0) + { + foreach (var data in result) + { + #region insert building_menu + sb.Append(@"insert building_menu(building_tag, main_system_tag, sub_system_tag, device_building_tag, device_system_tag, + is_link, created_by, created_at, updated_by, updated_at) + VALUES ('" + data.device_building_tag + "', '" + + data.device_system_tag + "', '" + + data.device_name_tag + "', '" + + data.device_building_tag + "', '" + + data.device_system_tag + "', " + + "1, 'B43E3CA7-96DD-4FC7-B6E6-974ACC3B0878', now(), 'B43E3CA7-96DD-4FC7-B6E6-974ACC3B0878', now() );"); + #endregion + } + if (sb.Length > 0) + { + await conn.ExecuteAsync(sb.ToString()); + sb.Clear(); + } + } + //building_menu有,import_niagara_tag沒有,is_link 更新成 0 + sb.Append($@" SET SQL_SAFE_UPDATES = 0; + UPDATE building_menu b LEFT JOIN ( + select device_building_tag, device_system_tag, device_name_tag + from import_niagara_tag + group by device_building_tag, device_system_tag, device_name_tag + ) AS a ON b.device_building_tag = a.device_building_tag + and a.device_system_tag = b.device_system_tag and a.device_name_tag = b.sub_system_tag + SET b.is_link = 0 + WHERE b.device_building_tag IS NULL"); + await conn.ExecuteAsync(sb.ToString()); + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + } + } + } + + /// + /// 新增資料至 subSystemFloor + /// + /// + public async Task InsertSubSystemFloor() + { + using (IDbConnection conn = GetDbConnection()) + { + conn.Open(); + using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) + { + try + { + List result; + StringBuilder sb = new StringBuilder(); + #region comparison sub_system_floor and import_niagara_tag + sb.Append($@" select a.* from ( + select device_building_tag, device_system_tag, device_name_tag, device_floor_tag + from import_niagara_tag + group by device_building_tag, device_system_tag, device_name_tag, device_floor_tag + ) AS a + LEFT JOIN sub_system_floor b + ON a.device_building_tag = b.building_tag and a.device_system_tag = b.main_system_tag and a.device_name_tag = b.sub_system_tag and a.device_floor_tag = b.floor_tag + WHERE b.building_tag IS NULL"); + result = (await conn.QueryAsync(sb.ToString())).ToList(); + #endregion + + sb.Clear(); + if (result.Count > 0) + { + foreach (var data in result) + { + #region insert building_menu + sb.Append(@"insert sub_system_floor(building_tag, main_system_tag, sub_system_tag, floor_tag, + is_link, created_by, created_at, updated_by, updated_at) + VALUES ('" + + data.device_building_tag + "', '" + + data.device_system_tag + "', '" + + data.device_name_tag + "', '" + + data.device_floor_tag + "', " + + "1, 'B43E3CA7-96DD-4FC7-B6E6-974ACC3B0878', now(), 'B43E3CA7-96DD-4FC7-B6E6-974ACC3B0878', now());"); + #endregion + } + if (sb.Length > 0) + { + await conn.ExecuteAsync(sb.ToString()); + sb.Clear(); + } + } + //building_menu有,import_niagara_tag沒有,is_link 更新成 0 + sb.Append($@" SET SQL_SAFE_UPDATES = 0; + UPDATE sub_system_floor b LEFT JOIN ( + select device_building_tag, device_system_tag, device_name_tag, device_floor_tag + from import_niagara_tag + group by device_building_tag, device_system_tag, device_name_tag, device_floor_tag + ) AS a ON b.building_tag = a.device_building_tag + and b.main_system_tag = a.device_system_tag and b.sub_system_tag = a.device_name_tag and b.floor_tag = a.device_floor_tag + SET b.is_link = 0 + WHERE b.building_tag IS NULL"); + await conn.ExecuteAsync(sb.ToString()); + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + } + } + } + + } +} diff --git a/Repository/BackendRepository/Interface/INiagaraDataSynchronizeRepository.cs b/Repository/BackendRepository/Interface/INiagaraDataSynchronizeRepository.cs new file mode 100644 index 0000000..fdcead3 --- /dev/null +++ b/Repository/BackendRepository/Interface/INiagaraDataSynchronizeRepository.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Repository.Models; + +namespace Repository.BackendRepository.Interface +{ + public interface INiagaraDataSynchronizeRepository : IBackendRepository + { + /// + /// 同步N4至資料表 import_niagara_tag + /// + /// + /// + /// + Task InsertNiagaraTagList(List ds, string building); + /// + /// 同步N4至資料表 import_niagara_item + /// + /// + /// + /// + Task InsertItemFromNiagara(List ds, string building); + /// + /// 比對 device + /// + /// + Task DeviceComparison(); + /// + /// 比對 device_item + /// + /// + Task DeviceItemComparison(); + /// + /// 新增資料至 buildingMenu + /// + /// + Task InsertBuildingMenu(); + /// + /// 新增資料至 subSystemFloor + /// + /// + Task InsertSubSystemFloor(); + } +} diff --git a/Repository/Models/BackgroundServiceTask.cs b/Repository/Models/BackgroundServiceTask.cs index 920fbbf..fafd4d4 100644 --- a/Repository/Models/BackgroundServiceTask.cs +++ b/Repository/Models/BackgroundServiceTask.cs @@ -37,4 +37,60 @@ namespace Repository.Models public string FileName { get; set; } public string File { get; set; } } + + /// + /// 取得niagara資料 + /// + public class Device_value + { + public string name { get; set; } + public string value { get; set; } + public string tag_name { get; set; } + public string point_name { get; set; } + } + + public class Device_item8 + { + public string name { get; set; } + public string value { get; set; } + public string tag_name { get; set; } + public string device_area_tag { get; set; } + public string device_building_tag { get; set; } + public string device_system_tag { get; set; } + public string device_name_tag { get; set; } + public string device_floor_tag { get; set; } + public string device_master_tag { get; set; } + public string device_last_name_tag { get; set; } + public string device_serial_tag { get; set; } + public string point_name { get; set; } + + //public string result_value { get; set; } + } + + public class NiagaraTags + { + public int id { get; set; } + public string db_tags { get; set; } + public string niagara_tags { get; set; } + public string device_area_tag { get; set; } + public string device_building_tag { get; set; } + public string device_system_tag { get; set; } + public string device_name_tag { get; set; } + public string device_floor_tag { get; set; } + public string device_master_tag { get; set; } + public string device_last_name_tag { get; set; } + public string device_serial_tag { get; set; } + public string atDateTime { get; set; } + public int is_used { get; set; } + } + + public class NiagaraTagsForItem + { + public string device_area_tag { get; set; } + public string device_building_tag { get; set; } + public string device_system_tag { get; set; } + public string device_name_tag { get; set; } + public string device_point_name { get; set; } + } + } diff --git a/Repository/Models/quickType.cs b/Repository/Models/quickType.cs new file mode 100644 index 0000000..226c03d --- /dev/null +++ b/Repository/Models/quickType.cs @@ -0,0 +1,81 @@ +using System; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Repository.Models +{ + public partial class Welcome + { + [JsonProperty("?xml")] + public Xml Xml { get; set; } + + [JsonProperty("?xml-stylesheet")] + public string XmlStylesheet { get; set; } + + [JsonProperty("obj")] + public Obj Obj { get; set; } + } + + public partial class Obj + { + [JsonProperty("@display")] + public string Display { get; set; } + + [JsonProperty("@xmlns")] + public Uri Xmlns { get; set; } + + [JsonProperty("@xsi:schemaLocation")] + public Uri XsiSchemaLocation { get; set; } + + [JsonProperty("@xmlns:xsi")] + public Uri XmlnsXsi { get; set; } + + [JsonProperty("str")] + public Str[] Str { get; set; } + } + + public partial class Str + { + [JsonProperty("@name")] + public string Name { get; set; } + + [JsonProperty("@val")] + public string Val { get; set; } + + [JsonProperty("@href")] + public string Href { get; set; } + } + + public partial class Xml + { + [JsonProperty("@version")] + public string Version { get; set; } + + [JsonProperty("@encoding")] + public string Encoding { get; set; } + } + + public partial class Welcome + { + public static Welcome FromJson(string json) => JsonConvert.DeserializeObject(json, Models.Converter.Settings); + } + + public static class Serialize + { + public static string ToJson(this Welcome self) => JsonConvert.SerializeObject(self, Models.Converter.Settings); + } + + internal static class Converter + { + public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings + { + MetadataPropertyHandling = MetadataPropertyHandling.Ignore, + DateParseHandling = DateParseHandling.None, + Converters = + { + new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal } + }, + }; + } +} From 263db72b3552546fa98fbdc3617ec16113ab6471 Mon Sep 17 00:00:00 2001 From: dev02 Date: Fri, 4 Nov 2022 09:41:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[webApi]=20=E4=BF=AE=E6=94=B9jwt=20authoriz?= =?UTF-8?q?e,=20=E4=BF=AE=E6=94=B9=E5=9C=96=E8=B3=87,=20=E6=92=B0=E5=AF=AB?= =?UTF-8?q?=E9=81=8B=E7=B6=AD=E5=BB=A0=E5=95=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ApiControllers/GraphManageController.cs | 33 +- .../ApiControllers/MyBaseApiController.cs | 4 +- .../ApiControllers/OperationController.cs | 406 ++++++++++++++++++ FrontendWebApi/Jwt/JwtHelpers.cs | 29 +- FrontendWebApi/Models/GraphManage.cs | 9 +- FrontendWebApi/Models/Operation.cs | 26 ++ FrontendWebApi/Startup.cs | 4 +- 7 files changed, 482 insertions(+), 29 deletions(-) create mode 100644 FrontendWebApi/ApiControllers/OperationController.cs diff --git a/FrontendWebApi/ApiControllers/GraphManageController.cs b/FrontendWebApi/ApiControllers/GraphManageController.cs index 6ad6d00..391c1cb 100644 --- a/FrontendWebApi/ApiControllers/GraphManageController.cs +++ b/FrontendWebApi/ApiControllers/GraphManageController.cs @@ -61,7 +61,7 @@ namespace FrontendWebApi.ApiControllers } [HttpPost] - public async Task>> SubSysList(int main_system_id) + public async Task>> SubSysList(int main_system_tag) { ApiResult> apiResult = new ApiResult>(); List sub_system_list = new List(); @@ -71,10 +71,10 @@ namespace FrontendWebApi.ApiControllers var sqlString = @$"SELECT v2.* FROM variable v2 JOIN variable v1 ON v2.system_parent_id = v1.id AND v1.system_type = @graph_manage_layer1 AND v1.deleted = 0 - WHERE v2.system_type = @graph_manage_layer2 AND v2.deleted = 0 AND v1.id = @main_system_id + WHERE v2.system_type = @graph_manage_layer2 AND v2.deleted = 0 AND v1.system_value = @main_system_tag ORDER BY v2.system_priority, v2.created_at desc"; - var param = new { @graph_manage_layer1 = graph_manage_layer1, @graph_manage_layer2 = graph_manage_layer2 }; + var param = new { @graph_manage_layer1 = graph_manage_layer1, @graph_manage_layer2 = graph_manage_layer2, @main_system_tag = main_system_tag }; sub_system_list = await backendRepository.GetAllAsync(sqlString, param); apiResult.Code = "0000"; @@ -99,18 +99,19 @@ namespace FrontendWebApi.ApiControllers { var sqlString = @$"SELECT * FROM graph_manage gm - JOIN variable v2 ON gm.sub_system_id = v2.id AND v2.system_type = @graph_manage_layer2 AND v2.deleted = 0 - WHERE v2.id in @sub_system_id AND gm.deleted = 0 + JOIN variable v1 ON v1.system_value = @main_system_tag and v1.system_type = @graph_manage_layer1 and v1.deleted = 0 + JOIN variable v2 ON v1.id = v2.system_parent_id AND v2.system_type = @graph_manage_layer2 AND v2.deleted = 0 + WHERE v2.system_value in @sub_system_tag AND gm.deleted = 0 ORDER BY gm.priority, gm.created_at desc"; - var param = new { @graph_manage_layer1 = graph_manage_layer1, graph_manage_layer2 = graph_manage_layer2, @sub_system_id = gi.sub_system_id }; + var param = new { @graph_manage_layer1 = graph_manage_layer1, graph_manage_layer2 = graph_manage_layer2, @sub_system_tag = gi.sub_system_tag, @main_system_tag = gi.main_system_tag }; graManList = await backendRepository.GetAllAsync(sqlString, param); if (gi.keyWord != null) { - var wParam = new { @graph_manage_layer1 = graph_manage_layer1, graph_manage_layer2 = graph_manage_layer2, @sub_system_id = gi.sub_system_id, @keyWord = gi.keyWord }; + var wParam = new { @graph_manage_layer1 = graph_manage_layer1, graph_manage_layer2 = graph_manage_layer2, @sub_system_tag = gi.sub_system_tag, @main_system_tag = gi.main_system_tag, @keyWord = gi.keyWord }; graManList = await backendRepository.GetAllAsync(@$"SELECT * FROM graph_manage gm JOIN variable v2 ON gm.sub_system_id = v2.id AND v2.system_type = @graph_manage_layer2 AND v2.deleted = 0 @@ -139,9 +140,9 @@ namespace FrontendWebApi.ApiControllers try { - var sqlString = @$"UPDATE graph_manage SET deleted = 0 WHERE code = @code AND sub_system_id = @sub_system_id"; + var sqlString = @$"UPDATE graph_manage SET deleted = 0 WHERE code = @code AND sub_system_tag = @sub_system_tag AND main_system_tag = @main_system_tag"; - var param = new { @code = gi.code, @sub_system_id = gi.sub_system_id }; + var param = new { @code = gi.code, @sub_system_tag = gi.sub_system_tag, @main_system_tag = gi.main_system_tag }; await backendRepository.ExecuteSql(sqlString, param); apiResult.Code = "0000"; @@ -164,8 +165,8 @@ namespace FrontendWebApi.ApiControllers try { - var sWhere = @$"deleted = 0 AND code = @code AND sub_system_id = @sub_system_id"; - var gm = await backendRepository.GetOneAsync("graph_manage", sWhere, new { @code = gii.code, @sub_system_id = gii.sub_system_id}); + var sWhere = @$"deleted = 0 AND code = @code AND sub_system_tag = @sub_system_tag AND main_system_tag = @main_system_tag"; + var gm = await backendRepository.GetOneAsync("graph_manage", sWhere, new { @code = gii.code, @sub_system_tag = gii.sub_system_tag, @main_system_tag = gii.main_system_tag}); if (gm == null) { @@ -226,9 +227,11 @@ namespace FrontendWebApi.ApiControllers } graph_manage.Add("@name", gii.name); + graph_manage.Add("@main_system_tag", gii.main_system_tag); + graph_manage.Add("@sub_system_tag", gii.sub_system_tag); //graph_manage.Add("@priority", gii.priority); - await backendRepository.UpdateOneByCustomTable(graph_manage, "graph_manage", "code='" + gii.code + "'" + "sub_system_id ='" + gii.sub_system_id + "'"); + await backendRepository.UpdateOneByCustomTable(graph_manage, "graph_manage", "code='" + gm.code + "'" + " and sub_system_tag ='" + gm.sub_system_tag + "' and main_system_tag = '" + gm.main_system_tag + "'"); apiResult.Code = "0000"; apiResult.Data = "修改成功"; } @@ -251,8 +254,8 @@ namespace FrontendWebApi.ApiControllers try { - var sWhere = @$"deleted = 0 AND code = @code AND sub_system_id = @sub_system_id"; - var gm = await backendRepository.GetOneAsync("graph_manage", sWhere, new { @code = gii.code, @sub_system_id = gii.sub_system_id }); + var sWhere = @$"deleted = 0 AND code = @code AND sub_system_tag = @sub_system_tag AND main_system_tag = @main_system_tag"; + var gm = await backendRepository.GetOneAsync("graph_manage", sWhere, new { @code = gii.code, @sub_system_tag = gii.sub_system_tag, @main_system_tag = gii.main_system_tag }); if (gm != null) { @@ -305,6 +308,8 @@ namespace FrontendWebApi.ApiControllers } var newPriority = await backendRepository.GetCurrentPriority("graph_manage"); + graph_manage.Add("@main_system_tag", gii.main_system_tag); + graph_manage.Add("@sub_system_tag", gii.sub_system_tag); graph_manage.Add("@name", gii.name); graph_manage.Add("@deleted", 0); graph_manage.Add("@priority", newPriority + 1); diff --git a/FrontendWebApi/ApiControllers/MyBaseApiController.cs b/FrontendWebApi/ApiControllers/MyBaseApiController.cs index 355e79d..1a6b7fc 100644 --- a/FrontendWebApi/ApiControllers/MyBaseApiController.cs +++ b/FrontendWebApi/ApiControllers/MyBaseApiController.cs @@ -15,6 +15,8 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using System.IdentityModel.Tokens.Jwt; +using System.Net; namespace FrontendWebApi.ApiControllers { @@ -44,7 +46,6 @@ namespace FrontendWebApi.ApiControllers ctx.Response.Headers.Add("Access-Control-Allow-Headers", "*"); ctx.Response.Headers.Add("Access-Control-Allow-Credentials", "true"); EDFunction edFunction = new EDFunction(); - 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(), @@ -59,6 +60,7 @@ namespace FrontendWebApi.ApiControllers { jwt_str = "Jwt Token不合法"; jwtlife = false; + filterContext.Result = new JsonResult(new { HttpStatusCode.Unauthorized }); } else { diff --git a/FrontendWebApi/ApiControllers/OperationController.cs b/FrontendWebApi/ApiControllers/OperationController.cs new file mode 100644 index 0000000..4c4f218 --- /dev/null +++ b/FrontendWebApi/ApiControllers/OperationController.cs @@ -0,0 +1,406 @@ +using FrontendWebApi.Models; +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.Threading.Tasks; + +namespace FrontendWebApi.ApiControllers +{ + [Route("api/[controller]")] + [ApiController] + public class OperationController : MyBaseApiController + { + private readonly IBackendRepository backendRepository; + private string operationFileSaveAsPath = ""; + + public OperationController(IBackendRepository backendRepository) + { + this.backendRepository = backendRepository; + operationFileSaveAsPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "upload", "operation"); + } + + [HttpPost] + public async Task>> MaiSysList() + { + ApiResult> apiResult = new ApiResult>(); + List main_system_list = new List(); + + try + { + var sqlString = @$"SELECT * + FROM variable + WHERE system_type = @main_system_type AND deleted = 0 + ORDER BY system_priority, created_at desc"; + + var param = new { @main_system_type = main_system_type }; + main_system_list = await backendRepository.GetAllAsync(sqlString, param); + + apiResult.Code = "0000"; + apiResult.Data = main_system_list; + } + catch (Exception exception) + { + apiResult.Code = "9999"; + apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + } + + return apiResult; + } + + [HttpPost] + public async Task>> SubSysList(string main_system_tag) + { + ApiResult> apiResult = new ApiResult>(); + List sub_system_list = new List(); + + try + { + var sqlString = @$"SELECT v2.* + FROM variable v2 + JOIN variable v1 ON v2.system_parent_id = v1.id AND v1.system_type = @main_system_type AND v1.deleted = 0 + WHERE v2.system_type = @sub_system_type AND v2.deleted = 0 AND v1.system_type = @main_system_tag + ORDER BY v2.system_priority, v2.created_at desc"; + + var param = new { @main_system_type = main_system_type, @sub_system_type = sub_system_type, @main_system_tag = main_system_tag }; + sub_system_list = await backendRepository.GetAllAsync(sqlString, param); + + apiResult.Code = "0000"; + apiResult.Data = sub_system_list; + } + catch (Exception exception) + { + apiResult.Code = "9999"; + apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + } + + return apiResult; + + } + + /// + /// 廠商資料列表(搜寻) + /// + /// + /// + public async Task>> OpeFirList(OperationFindList ofl) + { + ApiResult> apiResult = new ApiResult>(); + List opList = new List(); + string sWhere = ""; + try + { + if (ofl.start_created_at != null || ofl.end_created_at != null) + { + sWhere += $@" and (of.created_at >= isnull(@start_created_at, of.created_at) AND of.created_at <= isnull(@end_created_at, of.created_at))"; + } + else if (ofl.today) + { + sWhere += $@" and convert(of.created_at, DATE) = convert(NOW(), DATE)"; + } + else if (ofl.yesterday) + { + sWhere += $@" and convert(of.created_at, DATE) = convert(ADDDATE(NOW(), -1), DATE)"; + } + + if (ofl.sub_system_tag != null || ofl.main_system_tag != null) + { + sWhere += $@" and (of.device_system_category_layer2 = isnull(@main_system_tag, device_system_category_layer2) AND of.device_system_category_layer3 = isnull(@sub_system_tag, device_system_category_layer3))"; + } + + var sqlString = @$"select of.*, v2.system_key + from operation_firm of + left join variable v1 on of.device_system_category_layer2 = v1.system_value and v1.system_type = @main_system_type and v1.delted = 0 + left join variable v2 on v1.id = v2.system_parent_id and of.device_system_category_layer3 = v2.system_value and v2.system_type = @sub_system_type and v2.deleted = 0 + where of.deleted = 0" + sWhere; + + + var param = new { @sub_system_type = sub_system_type, @start_created_at = ofl.start_created_at, @end_created_at = ofl.end_created_at, @today = ofl.today, @yesterday = ofl.yesterday, @sub_system_tag = ofl.sub_system_tag, @main_system_tag = ofl.main_system_tag }; + opList = await backendRepository.GetAllAsync(sqlString, param); + + apiResult.Code = "0000"; + apiResult.Data = opList; + } + catch (Exception exception) + { + apiResult.Code = "9999"; + apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + } + + return apiResult; + } + + /// + /// 新增一笔廠商資料 + /// + /// + /// + public async Task> SaveOpeFirm(Operation_Firm of) + { + ApiResult apiResult = new ApiResult(); + + try + { + if (of.tax_id_number != null) + { + var sWhere = "deleted = 0 AND tax_id_number = @tax_id_number"; + var ofo = await backendRepository.GetOneAsync("operation_firm", sWhere, new { @tax_id_number = of.tax_id_number }); + if (ofo != null) + { + apiResult.Code = "0002"; + apiResult.Data = "已有相同的统一编号"; + return apiResult; + } + } + + Dictionary operation_firm = new Dictionary() + { + { "@deleted", 0 }, + { "@device_system_category_layer2", of.device_system_category_layer2 }, + { "@device_system_category_layer3", of.device_system_category_layer3 }, + { "@name", of.name }, + { "@contact_person", of.contact_person }, + { "@phone", of.phone }, + { "@email", of.email }, + { "@tax_id_number", of.tax_id_number }, + { "@remark", of.remark }, + { "@created_by", myUser.userinfo_guid }, + { "@created_at", DateTime.Now } + }; + + await backendRepository.AddOneByCustomTable(operation_firm, "operation_firm"); + apiResult.Code = "0000"; + apiResult.Data = "新增成功"; + } + catch (Exception exception) + { + apiResult.Code = "9999"; + apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; + string json = System.Text.Json.JsonSerializer.Serialize(of); + Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + } + + return apiResult; + } + + /// + /// 编辑一笔廠商資料 + /// + /// + /// + public async Task> EdtOneOpeFirm(Operation_Firm of) + { + ApiResult apiResult = new ApiResult(); + + try + { + var sWhere = @$"deleted = 0 and id = @id"; + var gm = await backendRepository.GetOneAsync("operation_firm", sWhere, new { @id = of.id }); + + if (gm == null) + { + apiResult.Code = "0001"; + apiResult.Data = "無法找到厂商"; + return apiResult; + } + + if (of.tax_id_number != null) + { + sWhere = "deleted = 0 AND tax_id_number = @tax_id_number and id != @id"; + var ofo = await backendRepository.GetOneAsync("operation_firm", sWhere, new { @tax_id_number = of.tax_id_number, @id = of.id }); + if (ofo != null) + { + apiResult.Code = "0002"; + apiResult.Data = "已有相同的统一编号"; + return apiResult; + } + } + + Dictionary operation_firm = new Dictionary() + { + { "@deleted", of.deleted }, + { "@device_system_category_layer2", of.device_system_category_layer2 }, + { "@device_system_category_layer3", of.device_system_category_layer3 }, + { "@name", of.name }, + { "@contact_person", of.contact_person }, + { "@phone", of.phone }, + { "@email", of.email }, + { "@tax_id_number", of.tax_id_number }, + { "@remark", of.remark }, + { "updated_by", myUser.userinfo_guid }, + { "updated_at", DateTime.Now } + }; + + await backendRepository.UpdateOneByCustomTable(operation_firm, "operation_firm", "id = '" + of.id + "'"); + apiResult.Code = "0000"; + apiResult.Data = "修改成功"; + } + catch (Exception exception) + { + apiResult.Code = "9999"; + apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; + string json = System.Text.Json.JsonSerializer.Serialize(of); + Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); + Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); + } + + return apiResult; + } + + /// + /// 汇出excel + /// + /// + public FileResult ExportExcel() + { + var workbook = new XSSFWorkbook(); + #region excel設定 + IFont font12 = workbook.CreateFont(); + font12.FontName = "新細明體"; + font12.FontHeightInPoints = 12; + ICellStyle style12 = workbook.CreateCellStyle(); + style12.SetFont(font12); + style12.Alignment = HorizontalAlignment.Center; + style12.VerticalAlignment = VerticalAlignment.Center; + IFont font12Times = workbook.CreateFont(); + font12Times.FontName = "Times New Roman"; + font12Times.FontHeightInPoints = 12; + IFont font18 = workbook.CreateFont(); + font18.FontName = "新細明體"; + font18.FontHeightInPoints = 18; + font18.IsBold = true; + ICellStyle styleTitle18 = workbook.CreateCellStyle(); + styleTitle18.SetFont(font18); + styleTitle18.Alignment = HorizontalAlignment.Center; + styleTitle18.VerticalAlignment = VerticalAlignment.Center; + ICellStyle styleLeft12 = workbook.CreateCellStyle(); + styleLeft12.SetFont(font12); + styleLeft12.Alignment = HorizontalAlignment.Left; + styleLeft12.VerticalAlignment = VerticalAlignment.Center; + ICellStyle styleLine12 = workbook.CreateCellStyle(); + styleLine12.SetFont(font12); + styleLine12.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; + styleLine12.VerticalAlignment = VerticalAlignment.Center; + styleLine12.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; + styleLine12.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; + styleLine12.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; + styleLine12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; + ICellStyle stylein12 = workbook.CreateCellStyle(); + stylein12.SetFont(font12Times); + stylein12.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left; + stylein12.VerticalAlignment = VerticalAlignment.Center; + stylein12.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; + stylein12.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; + stylein12.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; + stylein12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; + stylein12.WrapText = true; + #endregion + + var sqlString = $@"select of.*, v2.system_key + from operation_firm of + left join variable v1 on of.device_system_category_layer2 = v1.system_value and v1.system_type = @main_system_type and v1.delted = 0 + left join variable v2 on v1.id = v2.system_parent_id and of.device_system_category_layer3 = v2.system_value and v2.system_type = @sub_system_type and v2.deleted = 0 + where of.deleted = 0"; + var sheet = workbook.CreateSheet("廠商資料"); + var operation_firm = backendRepository.GetAllAsync(sqlString, null); + int RowPosition = 0; + IRow row = sheet.CreateRow(RowPosition); + sheet.SetColumnWidth(0, 4 * 160 * 12); + sheet.SetColumnWidth(1, 4 * 160 * 12); + sheet.SetColumnWidth(3, 4 * 160 * 12); + sheet.SetColumnWidth(4, 4 * 160 * 12); + sheet.SetColumnWidth(5, 4 * 160 * 12); + sheet.SetColumnWidth(6, 4 * 160 * 12); + sheet.SetColumnWidth(7, 4 * 160 * 12); + ICell cell = row.CreateCell(0); + cell.SetCellValue("廠商類別"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(1); + cell.SetCellValue("廠商名稱"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(2); + cell.SetCellValue("聯絡人"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(3); + cell.SetCellValue("電話"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(4); + cell.SetCellValue("郵箱"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(5); + cell.SetCellValue("統一編號"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(6); + cell.SetCellValue("備注"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(2); + cell.SetCellValue("建立時間"); + cell.CellStyle = styleLine12; + + foreach (var of in operation_firm.Result) + { + RowPosition += 1; + row = sheet.CreateRow(RowPosition); + for (var a = 0; a < 8; a++) + { + cell = row.CreateCell(a); + if (a == 0) + { + cell.SetCellValue(of.system_key); + } + if (a == 1) + { + cell.SetCellValue(of.name); + } + if (a == 2) + { + cell.SetCellValue(of.contact_person); + } + if (a == 3) + { + cell.SetCellValue(of.phone); + } + if (a == 4) + { + cell.SetCellValue(of.email); + } + if (a == 5) + { + cell.SetCellValue(of.tax_id_number); + } + if (a == 2) + { + cell.SetCellValue(of.remark); + } + if (a == 7) + { + cell.SetCellValue(of.Created_at); + } + + cell.CellStyle = style12; + } + } + + var ms = new NpoiMemoryStream + { + AllowClose = false + }; + workbook.Write(ms); + ms.Flush(); + ms.Seek(0, SeekOrigin.Begin); + + return File(ms, "application/vnd.ms-excel", "廠商資料.xlsx"); + } + } +} diff --git a/FrontendWebApi/Jwt/JwtHelpers.cs b/FrontendWebApi/Jwt/JwtHelpers.cs index a02c769..d288af0 100644 --- a/FrontendWebApi/Jwt/JwtHelpers.cs +++ b/FrontendWebApi/Jwt/JwtHelpers.cs @@ -35,8 +35,8 @@ namespace FrontendWebApi.Jwt //claims.Add(new Claim(JwtRegisteredClaimNames.NameId, login.CustomerNo.ToString())); //claims.Add(new Claim(JwtRegisteredClaimNames.Sub, login.Username)); // User.Identity.Name //claims.Add(new Claim(JwtRegisteredClaimNames.Aud, "The Audience")); - //claims.Add(new Claim(JwtRegisteredClaimNames.Exp, DateTimeOffset.UtcNow.AddSeconds(expireSeconds).ToUnixTimeSeconds().ToString())); - //claims.Add(new Claim(JwtRegisteredClaimNames.Nbf, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString())); // 必須為數字 + claims.Add(new Claim(JwtRegisteredClaimNames.Exp, DateTimeOffset.UtcNow.AddSeconds(lifeseconds).ToUnixTimeSeconds().ToString())); + claims.Add(new Claim(JwtRegisteredClaimNames.Nbf, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString())); // 必須為數字 //claims.Add(new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString())); // 必須為數字 //claims.Add(new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())); // JWT ID @@ -69,13 +69,24 @@ namespace FrontendWebApi.Jwt var tokenHandler = new JwtSecurityTokenHandler(); var jst = new JwtSecurityToken( - issuer: issuer,//Token釋出者 - //audience: _options.Value.Audience,//Token接受者 - claims: claims,//攜帶的負載 - notBefore: now,//當前時間token生成時間 - expires: expires,//過期時間 - signingCredentials: signingCredentials - ); + issuer: issuer,//Token釋出者 + //audience: _options.Value.Audience,//Token接受者 + claims: claims,//攜帶的負載 + notBefore: now,//當前時間token生成時間 + expires: expires,//過期時間 + signingCredentials: signingCredentials + ); + //var jst = new SecurityTokenDescriptor + //{ + // Issuer = issuer,//Token釋出者 + // //Claims = claims,//攜帶的負載 + // //audience: _options.Value.Audience,//Token接受者 + // NotBefore = now,//當前時間token生成時間 + // Expires = expires,//過期時間 + // SigningCredentials = signingCredentials, + // Subject = userClaimsIdentity + //}; + var serializeToken = tokenHandler.WriteToken(jst); var data = new TnToken(); diff --git a/FrontendWebApi/Models/GraphManage.cs b/FrontendWebApi/Models/GraphManage.cs index 9d5ad98..950bca0 100644 --- a/FrontendWebApi/Models/GraphManage.cs +++ b/FrontendWebApi/Models/GraphManage.cs @@ -9,7 +9,8 @@ namespace FrontendWebApi.Models public class GraphList { public string code { get; set; } - public int sub_system_id { get; set; } + public string main_system_tag { get; set; } + public int sub_system_tag { get; set; } public string name { get; set; } public string oriOrgName { get; set; } public string oriSavName { get; set; } @@ -20,7 +21,8 @@ namespace FrontendWebApi.Models public class GraphInsInfo { public string code { get; set; } - public int sub_system_id { get; set; } + public string main_system_tag { get; set; } + public string sub_system_tag { get; set; } public string name { get; set; } public string oriOrgName { get; set; } public string oriSavName { get; set; } @@ -34,7 +36,8 @@ namespace FrontendWebApi.Models public class GraphInfo { public string code { get; set; } - public List sub_system_id { get; set; } + public string main_system_tag { get; set; } + public List sub_system_tag { get; set; } public string keyWord { get; set; } } } diff --git a/FrontendWebApi/Models/Operation.cs b/FrontendWebApi/Models/Operation.cs index 6832294..df9c456 100644 --- a/FrontendWebApi/Models/Operation.cs +++ b/FrontendWebApi/Models/Operation.cs @@ -21,6 +21,32 @@ namespace FrontendWebApi.Models Fix = 2, //維修 } + public class Operation_Firm : Actor + { + public int id { get; set; } + public byte deleted { get; set; } + public string device_system_category_layer2 { get; set; }//系統類別(第2層) + public string device_system_category_layer3 { get; set; }//系統類別(第3層) + public string name { get; set; }//名称 + public string contact_person { get; set; }//联络人 + public string phone { get; set; }//电话 + public string email { get; set; }//Email + public string tax_id_number { get; set; }//统一编号 + public string remark { get; set; }//备注 + public string system_key { get; set; }//類別名稱 + } + + public class OperationFindList + { + public string serial_number { get; set; } //表单号 + public DateTime? start_created_at { get; set; }//开始建立时间 + public DateTime? end_created_at { get; set; }//结束建立时间 + public bool today { get; set; }//今天建立时间 + public bool yesterday { get; set; }//昨天建立时间 + public string main_system_tag { get; set; }//大类tag + public string sub_system_tag { get; set; }//小类tag + } + public class Operation : Actor { public int Id { get; set; }//流水號 diff --git a/FrontendWebApi/Startup.cs b/FrontendWebApi/Startup.cs index 9cb3f3d..0b4cf1f 100644 --- a/FrontendWebApi/Startup.cs +++ b/FrontendWebApi/Startup.cs @@ -58,6 +58,7 @@ namespace FrontendWebApi // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { + services.AddSingleton(); services.AddControllersWithViews(); //services.AddControllers(); @@ -102,7 +103,7 @@ namespace FrontendWebApi // ҥѮɡA^Y|]t WWW-Authenticate YAo̷|ܥѪԲӿ~] options.IncludeErrorDetails = true; // w]Ȭ trueAɷ|SO - options.TokenValidationParameters = new TokenValidationParameters() + options.TokenValidationParameters = new TokenValidationParameters { // zLoŧiANiHq "sub" Ȩó]w User.Identity.Name NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", @@ -140,7 +141,6 @@ namespace FrontendWebApi // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { - loggerFactory.AddFile("Logs/log-{Date}.txt"); if (env.IsDevelopment())