[後台] N4資料查詢與同步至資料表中;新增N4同步頁面

This commit is contained in:
wanli 2022-11-02 17:26:18 +08:00
parent 2c829f7fd4
commit e24d040703
10 changed files with 1189 additions and 1 deletions

View File

@ -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<NiagaraDataSynchronizeController>
{
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();
}
/// <summary>
/// N4匯入列表
/// </summary>
/// <returns></returns>
[HttpPost]
public Task<ApiResult<List<Device_value>>> RawDataList()
{
ApiResult<List<Device_value>> apiResult = new ApiResult<List<Device_value>>();
try
{
List<Device_value> 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);
}
/// <summary>
/// 比對N4與資料表有差異在同步至資料表中
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<bool>> CompareData(List<Device_value> ds, string building)
{
bool result = false;
ApiResult<bool> apiResult = new ApiResult<bool>();
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;
}
}
}

97
Backend/N4.xml Normal file
View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='/obix/xsl'?>
<obj display="Component" xmlns="http://obix.org/ns/schema/1.0" xsi:schemaLocation="http://obix.org/ns/schema/1.0 /obix/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<str name="res" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/V1/" href="res/" />
<str name="res1" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/V2/" href="res1/" />
<str name="res2" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/V3/" href="res2/" />
<str name="res3" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/A1/" href="res3/" />
<str name="res4" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/A2/" href="res4/" />
<str name="res5" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/A3/" href="res5/" />
<str name="res6" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/P/" href="res6/" />
<str name="res7" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/Q/" href="res7/" />
<str name="res8" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/KWH/" href="res8/" />
<str name="res9" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/KVARH/" href="res9/" />
<str name="res10" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/F/" href="res10/" />
<str name="res11" val="/TPE/B1/EE/E4/R2F/NA/TPE_B1_EE_E4_R2F_NA_WHT_N1/PF/" href="res11/" />
<str name="res12" val="/TPE/B1/LT/L1/U1F/NA/TPE_B1_LT_L1_U1F_NA_EHL_N1/SSC/" href="res12/" />
<str name="res13" val="/TPE/B1/LT/L1/U1F/NA/TPE_B1_LT_L1_U1F_NA_EHL_N1/ST/" href="res13/" />
<str name="res14" val="/TPE/B1/LT/L1/U1F/NA/TPE_B1_LT_L1_U1F_NA_EHL_N2/SSC/" href="res14/" />
<str name="res15" val="/TPE/B1/LT/L1/U1F/NA/TPE_B1_LT_L1_U1F_NA_EHL_N2/ST/" href="res15/" />
<str name="res16" val="/TPE/B1/LT/L1/U1F/NA/TPE_B1_LT_L1_U1F_NA_EHL_N3/SSC/" href="res16/" />
<str name="res17" val="/TPE/B1/LT/L1/U1F/NA/TPE_B1_LT_L1_U1F_NA_EHL_N3/ST/" href="res17/" />
<str name="res18" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/SP_SSC/" href="res18/" />
<str name="res19" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/SP_MD/" href="res19/" />
<str name="res20" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/SP_Temp/" href="res20/" />
<str name="res21" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/SP_AF/" href="res21/" />
<str name="res22" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/SP_AD/" href="res22/" />
<str name="res23" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/Temp/" href="res23/" />
<str name="res24" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/AL/" href="res24/" />
<str name="res25" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/SSC/" href="res25/" />
<str name="res26" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/STA_MD/" href="res26/" />
<str name="res27" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N1/ST/" href="res27/" />
<str name="res28" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/SP_SSC/" href="res28/" />
<str name="res29" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/SP_MD/" href="res29/" />
<str name="res30" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/SP_Temp/" href="res30/" />
<str name="res31" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/SP_AF/" href="res31/" />
<str name="res32" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/SP_AD/" href="res32/" />
<str name="res33" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/Temp/" href="res33/" />
<str name="res34" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/AL/" href="res34/" />
<str name="res35" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/SSC/" href="res35/" />
<str name="res36" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/STA_MD/" href="res36/" />
<str name="res37" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N2/ST/" href="res37/" />
<str name="res38" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/SP_SSC/" href="res38/" />
<str name="res39" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/SP_MD/" href="res39/" />
<str name="res40" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/SP_Temp/" href="res40/" />
<str name="res41" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/SP_AF/" href="res41/" />
<str name="res42" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/SP_AD/" href="res42/" />
<str name="res43" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/Temp/" href="res43/" />
<str name="res44" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/AL/" href="res44/" />
<str name="res45" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/SSC/" href="res45/" />
<str name="res46" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/STA_MD/" href="res46/" />
<str name="res47" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N3/ST/" href="res47/" />
<str name="res48" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/SP_SSC/" href="res48/" />
<str name="res49" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/SP_MD/" href="res49/" />
<str name="res50" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/SP_Temp/" href="res50/" />
<str name="res51" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/SP_AF/" href="res51/" />
<str name="res52" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/SP_AD/" href="res52/" />
<str name="res53" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/Temp/" href="res53/" />
<str name="res54" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/AL/" href="res54/" />
<str name="res55" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/SSC/" href="res55/" />
<str name="res56" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/STA_MD/" href="res56/" />
<str name="res57" val="/TPE/B1/ME/M10/U1F/NA/TPE_B1_ME_M10_U1F_NA_FCU_N4/ST/" href="res57/" />
<str name="res58" val="/TPE/B1/ME/M12/R2F/NA/TPE_B1_ME_M12_R2F_NA_TH_N1/TEMP/" href="res58/" />
<str name="res59" val="/TPE/B1/ME/M12/R2F/NA/TPE_B1_ME_M12_R2F_NA_TH_N1/RH/" href="res59/" />
<str name="res60" val="/TPE/B1/ME/M12/R2F/NA/TPE_B1_ME_M12_R2F_NA_TH_N1/Or/" href="res60/" />
<str name="res61" val="/TPE/B1/ME/M12/R2F/NA/TPE_B1_ME_M12_R2F_NA_TH_N1/TRIP/" href="res61/" />
<str name="res62" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/ST/" href="res62/" />
<str name="res63" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/TRIP/" href="res63/" />
<str name="res64" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/FRC/" href="res64/" />
<str name="res65" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_RCS/" href="res65/" />
<str name="res66" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_RO/" href="res66/" />
<str name="res67" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_1F/" href="res67/" />
<str name="res68" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_2F/" href="res68/" />
<str name="res69" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_3F/" href="res69/" />
<str name="res70" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_4F/" href="res70/" />
<str name="res71" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_5F/" href="res71/" />
<str name="res72" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_6F/" href="res72/" />
<str name="res73" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_7F/" href="res73/" />
<str name="res74" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_8F/" href="res74/" />
<str name="res75" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_9F/" href="res75/" />
<str name="res76" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_10F/" href="res76/" />
<str name="res77" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_11F/" href="res77/" />
<str name="res78" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_12F/" href="res78/" />
<str name="res79" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/SP_FLS_13F/" href="res79/" />
<str name="res80" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/DuringFireemergencyreturnoperation/" href="res80/" />
<str name="res81" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/CompletionofreturnbyFireemergencyreturnoperation/" href="res81/" />
<str name="res82" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/DuringEarthquakeoperation/" href="res82/" />
<str name="res83" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/CompletionofEarthquakeoperation/" href="res83/" />
<str name="res84" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/NormalPowerSupply/" href="res84/" />
<str name="res85" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/Emergencypowersourcedetection/" href="res85/" />
<str name="res86" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/DuringEmergencypowercontroloperation/" href="res86/" />
<str name="res87" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/CompletionofreturnbyEmergencypowercontroloperation/" href="res87/" />
<str name="res88" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/UP/" href="res88/" />
<str name="res89" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/DOWN/" href="res89/" />
<str name="res90" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/DoorState/" href="res90/" />
<str name="res91" val="/TPE/B1/ELEV/EL/R2F/NA/TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1/MultiVibrator/" href="res91/" />
<str name="res92" val="/TPE/BooleanWritable/" href="res92/" />
</obj>

View File

@ -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<Device_value> obixQuery(string urlString, string bql)
{
List<Device_value> result = new List<Device_value>();
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<KeyValue>(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<string, object> archiveMonthRawData = new Dictionary<string, object>();
// 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);
// }
// }
//}
}
}

View File

@ -95,6 +95,7 @@ namespace Backend
services.AddTransient<IUserInfoRepository, UserInfoRepository>();
services.AddTransient<IDeviceManageRepository, DeviceManageRepository>();
services.AddTransient<IDeviceImportRepository, DeviceImportRepository>();
services.AddTransient<INiagaraDataSynchronizeRepository, NiagaraDataSynchronizeRepository>();
#endregion Repository ª`¤J
#region JWT ª`¤J

View File

@ -0,0 +1,168 @@
@{
ViewData["MainNum"] = "2";
ViewData["SubNum"] = "3";
ViewData["Title"] = "Niagara資料同步";
}
<ol class="breadcrumb page-breadcrumb">
<li class="breadcrumb-item"><a href="javascript:void(0);">首頁</a></li>
<li class="breadcrumb-item">設備管理</li>
<li class="breadcrumb-item active">Niagara資料同步</li>
<li class="position-absolute pos-top pos-right d-none d-sm-block"><span class="js-get-date"></span></li>
</ol>
<div class="row">
<div class="col-xl-12">
<div id="panel-5" class="panel">
<div class="panel-container show">
<div class="panel-content">
<div class="form-row align-items-center">
<div class="col-12 mb-3">
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="Building_B" name="Building" value="B" class="custom-control-input">
<label class="custom-control-label" for="Building_B">三菱B1</label>
</div>
@*<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="Building_O" name="Building" value="O" class="custom-control-input">
<label class="custom-control-label" for="Building_O">辦公棟</label>
</div>*@
</div>
</div>
<div class="form-row align-items-center">
<button id="loadDataBtn" type="button" class="btn btn-primary" onclick="LoadData()">載入資料</button>
<button id="synchornizeDataBtn" type="button" class="btn btn-dark" onclick="SynchronizeData()">同步資料</button>
</div>
<br />
<br />
<div class="form-row align-items-center">
<p id="loadDataText"></p>
</div>
<div class="mb-5">
<div class="card p-3 w-100">
<div class="card-header d-flex align-items-center flex-wrap">
<div class="card-title">
Niagara資料
</div>
</div>
<div class="card-body row">
<div class="col-12">
<!-- datatable start -->
<table id="niagara_data_table" class="table table-bordered table-hover m-0 text-center">
<thead class="thead-themed">
<tr>
<th>value</th>
<th>tag_name</th>
<th>point_name</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@section Scripts {
<script>
var buildingId, building;
var rawDataImportTable;
var ds;
var today = new Date();
var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
$(function () {
ds = null;
building = "B1";
document.getElementById("Building_B").checked = true;
rawDataImportTable = $("#niagara_data_table").DataTable({
"columns": [
{
"data": "value"
},
{
"data": "tag_name"
},
{
"data": "point_name"
},
],
"ajax": {
"url": "/NiagaraDataSynchronize/RawDataList",
"type": "POST",
"dataSrc": function (rel) {
if (rel.code == "9999") {
toast_error(rel.msg);
document.getElementById('loadDataText').innerText = "載入資料出錯了!";
return;
}
var data = rel.data;
ds = data;
if (data == null || data.length == 0) {
this.data = [];
document.getElementById('loadDataText').innerText = "";
}
else if(data.length > 0) {
var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
var dateTime = date + ' ' + time;
document.getElementById('loadDataText').innerText = "共 " + rel.data.length + " 筆資料 \n" + dateTime;
}
return data;
}
}
});
});
//#region 載入Niagara資料
function LoadData() {
document.getElementById('loadDataText').innerText = "Loading...";
buildingId = document.querySelector('input[name="Building"]:checked').value;
if (buildingId == "B") {
building = "B1";
rawDataImportTable.ajax.reload();
}
}
//#endregion
function SynchronizeData() {
document.getElementById('loadDataText').innerText = "同步中...";
if (ds.length > 0) {
//比對資料有差異的話再同步到device等資料表
var url_synchronize_data = "/NiagaraDataSynchronize/CompareData/";
var send_data = {
ds: ds,
building: building
}
$.post(url_synchronize_data, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
document.getElementById('loadDataText').innerText = "比對資料出錯了!";
return;
}
var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
var dateTime = date + ' ' + time;
document.getElementById('loadDataText').innerText = "比對完成 \n" + dateTime;
}, 'json');
}
else {
document.getElementById('loadDataText').innerText = "查無資料 無法比對!";
}
}
</script>
}

View File

@ -112,7 +112,7 @@
</ul>
</li>
}
@if (ViewBag.role.Contains("DeviceImportIndex") || ViewBag.role.Contains("DeviceManageIndex"))
@if (ViewBag.role.Contains("DeviceImportIndex") || ViewBag.role.Contains("DeviceManageIndex") || ViewBag.role.Contains("NiagaraDataSynchronizeIndex"))
{
<li class="@(ViewData["MainNum"] == "2" ? "active open" : "")">
<a href="#" title="設備管理" data-filter-tags="category">
@ -136,6 +136,14 @@
</a>
</li>
}
@if (ViewBag.role.Contains("NiagaraDataSynchronizeIndex"))
{
<li class="@(ViewData["MainNum"] == "2" && ViewData["SubNum"] == "3" ? "active" : "")">
<a asp-controller="NiagaraDataSynchronize" asp-action="Index" title="Niagara資料同步" data-filter-tags="utilities disabled item">
<span class="nav-link-text" data-i18n="nav.utilities_disabled_item">Niagara資料同步</span>
</a>
</li>
}
</ul>
</li>
}

View File

@ -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)
{
}
/// <summary>
/// 更新import_niagara_tag資料表
/// </summary>
/// <param name="ds"></param>
/// <param name="building"></param>
/// <returns></returns>
public async Task InsertNiagaraTagList(List<Device_value> 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();
}
}
}
}
/// <summary>
/// 更新import_niagara_tag資料表
/// </summary>
/// <param name="ds"></param>
/// <param name="building"></param>
/// <returns></returns>
public async Task InsertItemFromNiagara(List<Device_value> 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<Device_item8> dt_item = new List<Device_item8>();
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();
}
}
}
}
/// <summary>
/// 比對 device
/// </summary>
/// <returns></returns>
public async Task DeviceComparison()
{
using (IDbConnection conn = GetDbConnection())
{
conn.Open();
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
try
{
List<NiagaraTags> 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<NiagaraTags>(sb.ToString())).ToList<NiagaraTags>();
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();
}
}
}
}
/// <summary>
/// 比對 device_item
/// </summary>
/// <returns></returns>
public async Task DeviceItemComparison()
{
using (IDbConnection conn = GetDbConnection())
{
conn.Open();
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
try
{
List<NiagaraTagsForItem> 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<NiagaraTagsForItem>(sb.ToString())).ToList<NiagaraTagsForItem>();
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();
}
}
}
}
/// <summary>
/// 新增資料至 buildingMenu
/// </summary>
/// <returns></returns>
public async Task InsertBuildingMenu()
{
using (IDbConnection conn = GetDbConnection())
{
conn.Open();
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
try
{
List<NiagaraTags> 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<NiagaraTags>(sb.ToString())).ToList<NiagaraTags>();
#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();
}
}
}
}
/// <summary>
/// 新增資料至 subSystemFloor
/// </summary>
/// <returns></returns>
public async Task InsertSubSystemFloor()
{
using (IDbConnection conn = GetDbConnection())
{
conn.Open();
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
try
{
List<NiagaraTags> 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<NiagaraTags>(sb.ToString())).ToList<NiagaraTags>();
#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();
}
}
}
}
}
}

View File

@ -0,0 +1,44 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Repository.Models;
namespace Repository.BackendRepository.Interface
{
public interface INiagaraDataSynchronizeRepository : IBackendRepository
{
/// <summary>
/// 同步N4至資料表 import_niagara_tag
/// </summary>
/// <param name="ds"></param>
/// <param name="building"></param>
/// <returns></returns>
Task InsertNiagaraTagList(List<Device_value> ds, string building);
/// <summary>
/// 同步N4至資料表 import_niagara_item
/// </summary>
/// <param name="ds"></param>
/// <param name="building"></param>
/// <returns></returns>
Task InsertItemFromNiagara(List<Device_value> ds, string building);
/// <summary>
/// 比對 device
/// </summary>
/// <returns></returns>
Task DeviceComparison();
/// <summary>
/// 比對 device_item
/// </summary>
/// <returns></returns>
Task DeviceItemComparison();
/// <summary>
/// 新增資料至 buildingMenu
/// </summary>
/// <returns></returns>
Task InsertBuildingMenu();
/// <summary>
/// 新增資料至 subSystemFloor
/// </summary>
/// <returns></returns>
Task InsertSubSystemFloor();
}
}

View File

@ -37,4 +37,60 @@ namespace Repository.Models
public string FileName { get; set; }
public string File { get; set; }
}
/// <summary>
/// 取得niagara資料
/// </summary>
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; }
}
}

View File

@ -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<Welcome>(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 }
},
};
}
}