2022-11-02 17:26:18 +08:00
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 )
{
2022-12-31 16:59:19 +08:00
var result2 = result . GroupBy ( x = > new
{
device_building_tag2 = x . device_building_tag ,
device_system_tag2 = x . device_system_tag ,
device_name_tag2 = x . device_name_tag
} ) . Select ( x = > new Device_item8
{
device_building_tag = x . Key . device_building_tag2 ,
device_system_tag = x . Key . device_system_tag2 ,
device_name_tag = x . Key . device_name_tag2
} ) ;
2022-11-02 17:26:18 +08:00
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() );" ) ;
2022-12-31 16:59:19 +08:00
}
2022-12-31 17:03:17 +08:00
foreach ( var data in result2 )
2022-12-31 16:59:19 +08:00
{
2022-11-02 17:26:18 +08:00
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());" ) ;
}
2022-12-31 17:03:17 +08:00
2022-11-02 17:26:18 +08:00
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 ;
}
2022-12-30 16:29:42 +08:00
sb . Append ( $ @ "insert device_item(deleted, points, is_show, is_show_riserDiagram, is_controll, is_bool, is_link, is_show_history,
2022-11-02 17:26:18 +08:00
device_system_tag , device_name_tag , created_at , updated_at )
VALUES ( 0 , ' " +
data . device_point_name + "', 1, 0, " +
isControll + "," +
2022-12-30 16:29:42 +08:00
isBool + ", 1, 1, '" +
2022-11-02 17:26:18 +08:00
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
2022-12-30 16:29:42 +08:00
SET d . is_link = 0 , d . is_show_history = 0
2022-11-02 17:26:18 +08:00
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 )
{
2022-12-31 16:49:47 +08:00
StringBuilder sqlString = new StringBuilder ( ) ;
sqlString . Append ( @"select * from building_menu where building_tag = '" + data . device_building_tag + "' and main_system_tag = '" + data . device_system_tag + "' and sub_system_tag = '" + data . device_name_tag + "'" ) ;
var bm = ( await conn . QueryAsync < building_menu > ( sqlString . ToString ( ) ) ) . ToList < building_menu > ( ) ;
2022-11-02 17:26:18 +08:00
#region insert building_menu
2022-12-31 16:49:47 +08:00
if ( bm . Count = = 0 )
{
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() );" ) ;
}
2022-11-02 17:26:18 +08:00
#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 ( ) ;
}
}
}
}
}
}