[後台] N4資料查詢與同步至資料表中;新增N4同步頁面
This commit is contained in:
parent
2c829f7fd4
commit
e24d040703
95
Backend/Controllers/NiagaraDataSynchronizeController.cs
Normal file
95
Backend/Controllers/NiagaraDataSynchronizeController.cs
Normal 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
97
Backend/N4.xml
Normal 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>
|
131
Backend/Services/Implement/webRequestService.cs
Normal file
131
Backend/Services/Implement/webRequestService.cs
Normal 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);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
168
Backend/Views/NiagaraDataSynchronize/Index.cshtml
Normal file
168
Backend/Views/NiagaraDataSynchronize/Index.cshtml
Normal 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>
|
||||
}
|
@ -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>
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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; }
|
||||
}
|
||||
|
||||
}
|
||||
|
81
Repository/Models/quickType.cs
Normal file
81
Repository/Models/quickType.cs
Normal 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 }
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user