using System; using System.Collections.Generic; using System.Text; using System.Configuration; using tpDomeWinAPP.Models; using System.Data; using System.Data.SqlClient; using MySql.Data.MySqlClient; using Repository.Helper; using Repository.BackendRepository.Interface; using Dapper; using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using FrontendWebApi.Models; using Autodesk.Forge.Model; using MySql.Data.MySqlClient; using System.Data.SqlTypes; namespace tpDomeWinAPP.Service { public class getDeviceSvc { string Connection1 = string.Empty; protected readonly IDatabaseHelper _databaseHelper; protected string UseDB; protected IDbConnection con; private readonly IBackendRepository backendRepository; public getDeviceSvc(string Connection_parame = null) { if (!string.IsNullOrEmpty(Connection_parame)) { Connection1 = Connection_parame; } else { Connection1 = ConfigurationManager.ConnectionStrings["dbConStr"].ConnectionString; } } public IDbConnection GetDbConnection() { IDbConnection conn; //if (UseDB == "MSSQL") //{ // conn = new SqlConnection(Connection1); //} //else //{ //conn = new MySqlConnection(this._databaseHelper.GetMySqlConnectionString()); conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["dbConStr"].ConnectionString); //} return conn; } //public List getNiagaraPara() //{ // var sqlObix = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'obixConfig'"; // List result; // //using (MySqlConnection conn = new MySqlConnection(Connection1)) // //{ // // //CONCAT('{baseURL}', '{deviceKindFilePath}', dk.device_image) AS device_image_url, // // conn.Open(); // // StringBuilder sb = new StringBuilder(); // // sb.Append(sql); // // result = conn.Query(sb.ToString()).ToList(); // //} // //var variableObix = backendRepository.GetAllAsync(sqlObix).Result; // //var obixApiConfig = new Backend.Models.ObixApiConfig(); // //EDFunction ed = new EDFunction(); // //obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault(); // //obixApiConfig.UserName = variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault(); // //obixApiConfig.Password = variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault(); // ////obixApiConfig.UrlSlot = variableObix.Where(x => x.Name == "url_slot").Select(x => x.Value).FirstOrDefault(); // //webRequestService svc = new webRequestService(); // //var data = svc.obixHisQuery_v2(obixApiConfig.ApiBase + "obix/config/Program/ObixQuery/query/", obixApiConfig.ApiBase + "obix/histories", "", // // obixApiConfig.UserName, obixApiConfig.Password); // //// ds.AddRange(data); // return result; //} public List test_bgWork_sql() { string jwt_str = null; string tableType = "day"; string startTime = "2023-07"; string endTime = "2023-07-21"; List apiResult = new List(); try { //using (IDbConnection conn = GetDbConnection()) //{ // try // { // var sql = sqlString; // result = await conn.QueryFirstOrDefaultAsync(sql, param); // } // catch (Exception exception) // { // throw exception; // } // return result; //} using (IDbConnection conn = GetDbConnection()) { //CONCAT('{baseURL}', '{deviceKindFilePath}', dk.device_image) AS device_image_url, startTime = tableType == "day" || tableType == "week" ? startTime + "-01" : tableType == "month" || tableType == "year" ? startTime + "-01-01" : null; endTime = tableType == "day" || tableType == "week" ? startTime.Split("-")[0] + "-" + (Int32.Parse(startTime.Split("-")[1]) + 1).ToString().PadLeft(2, '0') + "-01" : tableType == "month" ? (Int32.Parse(startTime.Split("-")[0]) + 1) + "-01-01" : tableType == "year" ? (Int32.Parse(endTime) + 1).ToString() + "-01-01" : null; string sqlWhere = ""; string sqlGroup = ""; string sqlAvgRawData = ""; string building_tag = "G6"; string dbDateName = startTime.Split("-")[0].ToString().PadLeft(4, '0') + startTime.Split("-")[1].ToString().PadLeft(2, '0'); string buildingSql = ""; conn.Open(); //string tag_quantity = await backendRepository.GetOneAsync("select system_value from variable where system_type = 'obixConfig' and system_key = 'tag_quantity' and deleted = 0"); string tag_quantity = conn.Query("select system_value from variable where system_type = 'obixConfig' and system_key = 'tag_quantity' and deleted = 0").FirstOrDefault().ToString(); if (tag_quantity == "5") buildingSql = " and SUBSTRING_INDEX(device_number, '_', 1) = @building_tag "; else buildingSql = " and SUBSTRING_INDEX(SUBSTRING_INDEX(device_number, '_', 2), '_', -1) = @building_tag "; //if (input.floor_tag.Count > 0) //{ // if (tag_quantity == "5") // sqlWhere = $@" and substring_index(substring_index(device_number, '_', 3), '_', -1) in @floor_tag "; // else // sqlWhere = $@" and substring_index(substring_index(device_number, '_', 5), '_', -1) in @floor_tag "; //} if (tableType == "year") { sqlGroup = $@" group by year(start_timestamp), year(end_timestamp), device_number "; sqlAvgRawData = " round(avg(avg_rawdata), 2) as avg_rawdata, year(start_timestamp) as start_timestamp, year(end_timestamp) as end_timestamp "; } else sqlAvgRawData = " round(avg_rawdata, 2) as avg_rawdata, start_timestamp, end_timestamp "; var table = tableType == "year" ? "archive_electric_meter_month" : "archive_electric_meter_" + tableType + (tableType == "day" ? "_" + dbDateName : ""); var schema = conn.Query($"select system_value from variable where system_type = 'project_name'").FirstOrDefault(); var isTable = conn.Query($"select table_name from information_schema.tables where table_name = '{table}' and table_schema = '{schema.Split('/')[0]}'").FirstOrDefault(); if (string.IsNullOrEmpty(isTable)) //check for has table or not { //MessageBox.Show("Empty"); } var dateFormat = tableType == "day" || tableType == "week" ? "%Y-%m-%d" : tableType == "month" ? "%Y-%m" : tableType == "year" ? "%Y" : null; var aemmEndDate = tableType == "year" ? $"year(DATE_ADD(fd.date, INTERVAL +1 {tableType}))" : $"DATE_ADD(fd.date, INTERVAL +1 {tableType})"; var aemmStaDate = tableType == "year" ? "year(fd.date)" : "fd.date"; var sql = $@"set @i = -1; select fd.device_number, case when aemm.avg_rawdata = -1 then 'NaN' when aemm.avg_rawdata is null then 0.00 else aemm.avg_rawdata end as avg_rawdata, DATE_FORMAT(fd.date, @dateFormat) as timestamp from ( select * from ( ( SELECT DATE(ADDDATE(@startTime, INTERVAL @i:=@i+1 day)) AS date FROM {table} HAVING @i < TIMESTAMPDIFF({tableType}, @startTime, ADDDATE(@endTime, INTERVAL -1 DAY)) ) d, ( select device_number from {table} where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' {buildingSql} {sqlWhere} group by device_number ) dn ) ) fd left join ( select device_number, {sqlAvgRawData} from {table} where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' {buildingSql} {sqlWhere} {sqlGroup} ) aemm on aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} and aemm.device_number = fd.device_number order by fd.device_number, fd.date"; var rawData = conn.Query (sql, new { startTime = startTime, endtime = endTime, building_tag = building_tag, dateFormat = dateFormat }); List list = new List(); if (tag_quantity == "5") { list = rawData .GroupBy(x => new { building_tag = x.device_number.Split("_")[0], floor_tag = x.device_number.Split("_")[2], device_serial_tag = x.device_number.Split("_")[4], device_number = x.device_number }) .Select(x => new FrontendWebApi.Models.HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag, device_number = x.Key.device_number }) .ToList(); } else { list = rawData .GroupBy(x => new { building_tag = x.device_number.Split("_")[1], floor_tag = x.device_number.Split("_")[4], device_master = x.device_number.Split("_")[5], device_serial_tag = x.device_number.Split("_")[7], device_number = x.device_number }) .Select(x => new FrontendWebApi.Models.HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag, device_master = x.Key.device_master, device_number = x.Key.device_number }) .ToList(); } foreach (var l in list) { l.rawData = new List(); l.device_full_name = conn.Query($"select full_name from device where device_number = '{l.device_number}'").FirstOrDefault(); if (tag_quantity == "5") { l.rawData.AddRange( rawData.Where(x => x.device_number.Split("_")[0] == l.building_tag && x.device_number.Split("_")[2] == l.floor_tag && x.device_number.Split("_")[4] == l.device_serial_tag) ); } else { l.rawData.AddRange( rawData.Where(x => x.device_number.Split("_")[1] == l.building_tag && x.device_number.Split("_")[4] == l.floor_tag && x.device_number.Split("_")[5] == l.device_master && x.device_number.Split("_")[7] == l.device_serial_tag) ); } l.building_name = conn.Query("select full_name from building where building_tag = @building_tag and deleted = 0", new { building_tag = l.building_tag }).FirstOrDefault(); l.total = l.rawData.Where(x => x.avg_rawdata != "NaN").Sum(x => decimal.Parse(x.avg_rawdata ?? "0", System.Globalization.NumberStyles.Float)).ToString(); //l.price = input.price.HasValue // ? (Math.Round(input.price.Value, 2)).ToString() // : Math.Round((await backendRepository.GetOneAsync("select system_value from variable where system_type = 'ElectricPrice' and deleted = 0")), 2).ToString(); l.price = "5"; l.total_price = Math.Round((Decimal.Parse(l.total) * Decimal.Parse(l.price)), 2).ToString(); } //apiResult.Code = "0000"; //apiResult.Data = list; return list; } } catch (Exception exception) { throw exception.InnerException; //apiResult.Code = "9999"; //apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; //string json = System.Text.Json.JsonSerializer.Serialize(input); //Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); //Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } } public List getDevices() { using (SqlConnection conn = new SqlConnection(Connection1)) { //CONCAT('{baseURL}', '{deviceKindFilePath}', dk.device_image) AS device_image_url, conn.Open(); var sql = $@"SELECT d.*, d.full_name AS Device_full_name, b.full_name AS Building_full_name, ms.full_name AS Main_system_full_name, ss.full_name AS Sub_system_full_name, f.full_name AS Floor_full_name, dk.device_image, device_image AS device_image_url, dk.device_close_color, dk.device_normal_color, dk.device_error_color, dk.device_normal_flashing, dk.device_close_flashing, dk.device_error_flashing, (SELECT STRING_AGG( ISNULL(system_key, ' '), ',') FROM device_disaster dd JOIN variable v ON v.deleted = 0 AND v.system_type = 'disaster' AND v.system_value = dd.device_system_value WHERE dd.device_guid = d.device_guid ) AS Device_disaster_type_text FROM ( SELECT * FROM device d WHERE -- d.building_guid = @Building_guid -- AND d.main_system_guid = @Main_system_guid -- AND d.sub_system_guid = @Sub_system_guid -- AND d.floor_guid = @Floor_guid AND d.deleted = 0 ) d JOIN building b ON d.building_guid = b.building_guid JOIN main_system ms ON d.main_system_guid = ms.main_system_guid JOIN sub_system ss ON d.sub_system_guid = ss.sub_system_guid JOIN floor f ON d.floor_guid = f.floor_guid LEFT JOIN device_kind dk ON dk.device_building_tag = d.device_building_tag AND dk.device_system_tag = d.device_system_tag -- AND dk.device_floor_tag = d.device_floor_tag AND dk.device_name_tag = d.device_name_tag ORDER BY d.priority ASC, d.device_number ASC "; var devices = conn.Query(sql).AsList(); return devices; //var sql_node = $@"SELECT // dn.device_node_guid, // dn.device_guid, // dn.full_name AS Device_node_full_name, // dn.device_node_coordinate, // dn.priority // FROM device_node dn // WHERE dn.deleted = 0 AND dn.device_guid = @device_guid // ORDER BY dn.priority ASC"; //foreach (var device in devices) //{ // device.Device_nodes = await backendRepository.GetAllAsync(sql_node, new { device_guid = device.Device_guid }); //} } } #region insert DB public bool clearTb_importData() { bool result = false; using (SqlConnection conn = new SqlConnection(Connection1)) { //CONCAT('{baseURL}', '{deviceKindFilePath}', dk.device_image) AS device_image_url, conn.Open(); StringBuilder sb = new StringBuilder(); int i = 0; sb.Append($@" truncate table importExcel; truncate table importData_batch;"); try { conn.Execute(sb.ToString()); } catch (Exception ex) { throw ex; } } return result; } public bool insertDB(DataTable dt) { bool result = false; using (SqlConnection conn = new SqlConnection(Connection1)) { //CONCAT('{baseURL}', '{deviceKindFilePath}', dk.device_image) AS device_image_url, conn.Open(); StringBuilder sb = new StringBuilder(); int i = 0; foreach (DataRow row in dt.Rows) { sb.Append($@" insert importExcel(intro, old_tags, new_tags, floor, device_name, device_note, device_type, device_number, atDateTime) values('" + row["tag_name_zh"].ToString() + "', '" + row["old_tags"].ToString() + "', '" + row["new_tags"].ToString() + "', '" + row["floor"].ToString() + "', '" + row["device_name"].ToString() + "', '" + row["device_note"].ToString() + "', '" + row["device_type"].ToString() + "', '" + row["device_number"].ToString() + "' , getdate());"); i++; try { if (i >= 100) { conn.Execute(sb.ToString()); sb.Clear(); i = 0; } } catch (Exception ex) { throw ex; } } if (sb.Length > 0) { conn.Execute(sb.ToString()); } } return result; } public bool insertDB_batch() { bool result = false; using (SqlConnection conn = new SqlConnection(Connection1)) { //CONCAT('{baseURL}', '{deviceKindFilePath}', dk.device_image) AS device_image_url, conn.Open(); StringBuilder sb = new StringBuilder(); sb.Append($@" select old_tags, new_tags, tag_no5, serial, tagName from ( select old_tags, new_tags, tagName tag_no5 from importExcel a CROSS APPLY [Func_StringSplit](a.new_tags, '_') where serial = 5 and new_tags like '%~%' ) b CROSS APPLY [Func_StringSplit](b.tag_no5, '~') where serial = 2;"); var batchData = conn.Query(sb.ToString()); int i = 0; sb.Clear(); foreach (var row in batchData) { var ss = row.tag_no5.Split('~'); int start_num = int.Parse(ss[0]); int end_num = int.Parse(ss[1]); var ss_old = row.old_tags.Split('_'); var ss_new = row.new_tags.Split('_'); string vv5 = string.Empty; //if (row.new_tags == "H_M10_B4F_FCU_001~108") //{ // Console.WriteLine("here"); //} for (int j = 1; j <= end_num; j++) { switch (ss[0].Length) { case 2: vv5 = (j <= 9) ? "0" + j.ToString() : j.ToString(); break; case 3: if (j <= 9) // vv5 = "00" + j.ToString(); vv5 = "0" + j.ToString(); else if (j <= 99) // vv5 = "0" + j.ToString(); vv5 = j.ToString(); else vv5 = j.ToString(); break; } string old_tag = ss_old[0] + "_" + ss_old[1] + "_" + ss_old[2] + "_" + ss_old[3] + "_" + vv5; string new_tag = ss_new[0] + "_" + ss_new[1] + "_" + ss_new[2] + "_" + ss_new[3] + "_" + vv5; sb.Append($@" insert importData_batch(old_tags, new_tags) values('" + old_tag +"', '" + new_tag + "'); "); } try { if (sb.Length > 0) { conn.Execute(sb.ToString()); sb.Clear(); result = true; } } catch (Exception ex) { throw ex; } } try { #region 更新 web 端新匯入的 excel sb.Append($@" update device set device_number_old = device_number where device_number_old is null"); conn.Execute(sb.ToString()); sb.Clear(); //1.2.更新欄位 device_number_old sb.Append($@" update device set device_system_tag_old = b.tagName from (select device_number, device_number_old, serial, tagName from device a CROSS APPLY [Func_StringSplit](a.device_number, '_') where serial = 2 and device_system_tag_old is null)b where device.device_number_old = b.device_number_old and device_system_tag_old is null"); conn.Execute(sb.ToString()); sb.Clear(); #endregion sb.Append("delete from importExcel where new_tags like '%~%'"); conn.Execute(sb.ToString()); sb.Clear(); sb.Append(@"insert importExcel(new_tags, old_tags) select new_tags, old_tags from importData_batch"); conn.Execute(sb.ToString()); sb.Clear(); #region 製作比對用 table:import_dbTag_niagaraTag #region 判斷 table 是否存在 string s1 = @" CREATE TABLE [dbo].[import_dbTag_niagaraTag]( [device_guid] [varchar](36) NOT NULL, [full_name] [varchar](50) NOT NULL, [device_number] [varchar](50) NOT NULL, [niagaraTag] [varchar](50) NOT NULL, [device_coordinate] [varchar](50) NULL, [device_number_old] [varchar](50) NULL, [device_building_tag] [varchar](50) NOT NULL, [device_system_tag] [varchar](50) NOT NULL, [device_system_tag_old] [varchar](50) NULL, [device_floor_tag] [varchar](50) NOT NULL, [device_name_tag] [varchar](50) NOT NULL, [device_serial_tag] [varchar](50) NOT NULL, [atDateTime] [smalldatetime] NULL, CONSTRAINT [PK_import_dbTag_niagaraTag] PRIMARY KEY CLUSTERED ( [device_guid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY];"; //string ss = @"IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'import_dbTag_niagaraTag')) // BEGIN // drop table import_dbTag_niagaraTag; // END"; sb.Append("truncate table import_dbTag_niagaraTag"); conn.Execute(sb.ToString()); sb.Clear(); #endregion sb.Append($@" insert import_dbTag_niagaraTag(device_guid, full_name, device_number, niagaraTag, device_coordinate, device_number_old, device_building_tag, device_system_tag, device_system_tag_old, device_floor_tag, device_name_tag, device_serial_tag, atDateTime) select device_guid, full_name, device_number, '', device_coordinate, device_number_old, device_building_tag, device_system_tag, device_system_tag_old, device_floor_tag, device_name_tag, device_serial_tag, getDate() from device where deleted = 0;"); conn.Execute(sb.ToString()); sb.Clear(); #region update niagara_tags sb.Clear(); sb.Append($@"update import_dbTag_niagaraTag set niagaraTag = b.niagara_tags from [dbo].[import_niagara_tag] b where import_dbTag_niagaraTag.device_number = b.niagara_tags "); conn.Execute(sb.ToString()); #endregion #endregion 製作比對用 table:import_dbTag_niagaraTag sb.Append(@"update import_dbTag_niagaraTag set device_number = b.new_tags, device_system_tag = b.device_system_tag from ( select old_tags, new_tags, serial, tagName as device_system_tag from importExcel a CROSS APPLY [Func_StringSplit](a.new_tags, '_') where serial = 2) b where [import_dbTag_niagaraTag].device_number_old = b.old_tags"); conn.Execute(sb.ToString()); sb.Clear(); sb.Append(@"update [dbo].[device] set device.device_number = b.new_tags, device_system_tag = b.device_system_tag from ( select old_tags, new_tags, serial, tagName as device_system_tag from importExcel a CROSS APPLY [Func_StringSplit](a.new_tags, '_') where serial = 2) b where [device].device_number_old = b.old_tags"); conn.Execute(sb.ToString()); sb.Clear(); sb.Append(@"update device_import_ckeck_temp set device_system_tag = b.device_system_tag, device_number = b.device_number from device b where device_import_ckeck_temp.device_building_tag = b.device_building_tag and device_import_ckeck_temp.device_system_tag_old = b.device_system_tag_old and device_import_ckeck_temp.device_number_old = b.device_number_old and device_import_ckeck_temp.device_number <> b.device_number"); conn.Execute(sb.ToString()); sb.Clear(); sb.Append(@"update device_kind set device_system_tag = b.device_system_tag from device b where device_kind.device_building_tag = b.device_building_tag and device_kind.device_system_tag_old = b.device_system_tag_old and device_kind.device_name_tag = b.device_name_tag"); conn.Execute(sb.ToString()); sb.Clear(); result = true ; } catch (Exception ex) { throw ex; } } return result; } #endregion } }