using Aitex.Core.RT.DBCore; using MECF.Framework.Common.Aitex.Core.Common.DeviceData; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.Equipment; using Sicentury.Core; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow { /// /// 气体流量统计,根据输入名称和时间来查询 /// public class GasFlowSqlHelp { /// /// 查询当天的气体体积数据 /// /// 拆分的天 /// PM名称 /// 显示列表对象 /// public static List GetDayGasFlowSum(DateRangeHelper daySlices, string moduleName, List gasFlowSumList) { List dataTableList = GetAllGasListDaySlices(daySlices, moduleName, gasFlowSumList); string rowStr; List GasFlowrRunVentList = new List(); foreach (var item in gasFlowSumList) { GasFlowrRunVentList.Add(new GasFlowSum() { Name = $"{item.Name}_Run" }); GasFlowrRunVentList.Add(new GasFlowSum() { Name = $"{item.Name}_Vent" }); } foreach (DataTable ds in dataTableList) { double timeDifference = 0; for (int i = 0; i < ds.Rows.Count; i++) { foreach (var item in GasFlowrRunVentList) { //$"{moduleName}.GasRealTimeFlow.{item.Name}_Run.FeedBack" string property = $"{moduleName}.GasRealTimeFlow.{item.Name}.FeedBack"; rowStr = ds.Rows[i][property].ToString(); if (rowStr is not null && rowStr.Length == 0) continue; double bd = double.Parse(ds.Rows[i][property].ToString()); if (bd > 0) { if (i != ds.Rows.Count - 1)//最后一个数据使用的时间差,是它前一个计算得到的 { var startTime = new DateTime(long.Parse(ds.Rows[i]["time"].ToString())); var endTime = new DateTime(long.Parse(ds.Rows[i + 1]["time"].ToString())); timeDifference = (endTime - startTime).TotalSeconds; } item.Volume += bd * timeDifference; } } } } return GasFlowrRunVentList; } /// /// 根据拆分的天循查询数据 /// /// 拆分的天 /// PM名称 /// 显示集合列表 /// private static List GetAllGasListDaySlices(DateRangeHelper daySlices, string moduleName, List gasFlowSumList) { List dataTableList = new List(); var ts = daySlices.Diff; for (var day = 0; day <= ts.Days; day++) { var tblName = $"{daySlices.Start.AddDays(day):yyyyMMdd}.{moduleName}"; var sql = new StringBuilder(); // 检查表名是否存在,否则SQL执行出错。 if (CheckTableExists(tblName)) { sql.Append("select time AS InternalTimeStamp"); // 添加待查询的列 // 添加待查询的列 foreach (var item in gasFlowSumList) { sql.Append("," + $"\"{moduleName}.GasRealTimeFlow.{item.Name}_Run.FeedBack\""); sql.Append("," + $"\"{moduleName}.GasRealTimeFlow.{item.Name}_Vent.FeedBack\""); } sql.Append($", \"time\""); sql.Append($" from \"{tblName}\""); if (day < ts.Days) sql.Append(" UNION "); sql.Append( $" where time between {daySlices.Start.Ticks} and {daySlices.End.Ticks} order by InternalTimeStamp asc"); try { var dataSet = QueryDataClient.Instance.Service.QueryData(sql.ToString()); if (dataSet is not null && dataSet.Rows.Count > 0) dataTableList.Add(dataSet); } catch (Exception ex)//查询较早日期时,可能不存在属性会报错 { } } } return dataTableList; } private static bool CheckTableExists(string tableName) { var sql = $"SELECT EXISTS ( SELECT FROM pg_tables WHERE schemaname = 'public' AND tablename = '{tableName}' )"; var table = QueryDataClient.Instance.Service.QueryData(sql); if (table == null) return false; if (table.Rows.Count <= 0) return false; var value = table.Rows[0]["exists"].ToString(); if (value.ToLower() == "true") return true; return false; } public static List GetDataSetDaySlices(DateRangeHelper daySlices, string tableName, string propertyCmd, string property) { List dataTableList = new List(); var ts = daySlices.Diff; for (var day = 0; day <= ts.Days; day++) { var tblName = $"{daySlices.Start.AddDays(day):yyyyMMdd}.{tableName}"; var sql = new StringBuilder(); // 检查表名是否存在,否则SQL执行出错。 if (CheckTableExists(tblName)) { sql.Append("select time AS InternalTimeStamp"); // 添加待查询的列 sql.Append(propertyCmd); sql.Append($", \"time\""); sql.Append($" from \"{tblName}\""); if (day < ts.Days) sql.Append(" UNION "); sql.Append( $" where time between {daySlices.Start.Ticks} and {daySlices.End.Ticks} and '{property}' is not NULL order by InternalTimeStamp asc"); try { var dataSet = QueryDataClient.Instance.Service.QueryData(sql.ToString()); if (dataSet is not null && dataSet.Rows.Count > 0) dataTableList.Add(dataSet); } catch (Exception ex)//查询较早日期时,可能不存在属性会报错 { } } } return dataTableList; } public static double GetData(List dataTableList, string property) { double values = 0; string rowStr; foreach (DataTable ds in dataTableList) { double timeDifference = 0; for (int i = 0; i < ds.Rows.Count; i++) { rowStr = ds.Rows[i][property].ToString(); if (rowStr is not null && rowStr.Length == 0) continue; double bd = double.Parse(ds.Rows[i][property].ToString()); if (bd > 0) { if (i != ds.Rows.Count - 1)//最后一个数据使用的时间差,是它前一个计算得到的 { var startTime = new DateTime(long.Parse(ds.Rows[i]["time"].ToString())); var endTime = new DateTime(long.Parse(ds.Rows[i + 1]["time"].ToString())); timeDifference = (endTime - startTime).TotalSeconds; } values += bd * timeDifference; } } } return values; } } }