From 679ce9d0c5bf3da185564c6ffc1d033fba88ba4f Mon Sep 17 00:00:00 2001 From: "DESKTOP-GPE37UV\\THINKAPD" Date: Tue, 22 Nov 2022 16:56:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3DataLog=E6=9F=A5IO=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataLogs/DataHistory/DataViewModel.cs | 157 +++++++++++------- 1 file changed, 94 insertions(+), 63 deletions(-) diff --git a/FrameworkLocal/UIClient/CenterViews/DataLogs/DataHistory/DataViewModel.cs b/FrameworkLocal/UIClient/CenterViews/DataLogs/DataHistory/DataViewModel.cs index 7e0850b..4477f4e 100644 --- a/FrameworkLocal/UIClient/CenterViews/DataLogs/DataHistory/DataViewModel.cs +++ b/FrameworkLocal/UIClient/CenterViews/DataLogs/DataHistory/DataViewModel.cs @@ -482,7 +482,7 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.DataHistory } /// - /// 根据左侧选项查询数据 + /// 根据DataLog界面左侧项目树中选择的项目查询数据 /// /// private static DataSet SearchDataBaseAsync( @@ -498,78 +498,109 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.DataHistory // 遍历模组 foreach (var module in modules) { - var sql = new StringBuilder(); - //! 因为数据库中按天拆表,无法一次性查询数据,需使用UNION合并多表查询,因此此处按天拼接SQL表达式 - // 最终SQL表达式结构为: - // (select xx from date1.xx) union (select xx from date2.xx) union (select xx from date3.xx) - // where time between xxx and xxx - // order by time asc - var ts = dateRange.Diff; - for (var day = 0; day <= ts.Days; day++) + // 如果当前根节点下没有被选中的终端节点,则忽略 + if (module.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected) == null) + continue; + + if (module.ToString() != "IO") { - // 检查表名是否存在,否则SQL执行出错。 - var tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.{module}"; - if (module.ToString() == "IO") - { - var node = module.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected); - tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.{node}"; - }else if (module.ToString() != "PM1") - { - tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.System"; - } - - if (CheckTableExists(tblName)) + // 如果不是IO节点,则根节点名即为数据库名= + var dt = SearchSingleDbTable(module, dateRange, cancellation, progressReporter); + if (dt != null) + ds.Tables.Add(dt); + } + else + { + // 如果节点名是IO,则数据库使用IO.[二级节点名]作为表名,例如IO.PM1\IO.PM2\IO.TM\IO.System + var subNodes = module.ChildNodes; + + foreach (var subNode in subNodes) { + if (subNode.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected) == null) + continue; - sql.Append("select \"time\" AS InternalTimeStamp"); - var selectedParams = module.Flatten(true) - .Where(x => x.IsSelected == true); - - // 添加待查询的列 - foreach (var item in selectedParams) - { - sql.Append("," + $"\"{item}\""); - } - - sql.Append($" from \"{tblName}\" "); - - if (day < ts.Days) - sql.Append(" UNION "); + var dt = SearchSingleDbTable(subNode, dateRange, cancellation, progressReporter); + if (dt != null) + ds.Tables.Add(dt); } } - - // 所有表名不可用,可能是日期范围错误 - if (sql.Length <= 0) - { - continue; - } - - sql.Append( - $" where \"time\" between {dateRange.Start.Ticks} and {dateRange.End.Ticks} order by InternalTimeStamp asc"); - - progressReporter?.Report(new ProgressUpdatingEventArgs(20, 100, - $"Querying {dateRange}...")); - - if (cancellation?.Token.IsCancellationRequested == true) - return null; - - // 查询数据并将返回的结果存储在DataSet中 - var dataTable = QueryDataClient.Instance.Service.QueryData(sql.ToString()); - - if (cancellation?.Token.IsCancellationRequested == true) - return null; - - //! 返回的 DataTable 可能不存在,原因是上述代码自动生成的表明可能不存在。 - if (dataTable == null) - continue; - dataTable.TableName = module.Name; - ds.Tables.Add(dataTable); } } - + return ds; } + /// + /// IO节点在数据库中的表名比较特殊,需要特殊处理。 + /// + /// + /// + /// + /// + /// + private static DataTable SearchSingleDbTable(TreeNode module, DateRangeHelper dateRange, + CancellationTokenSource cancellation = null, + IProgress progressReporter = null) + { + var sql = new StringBuilder(); + //! 因为数据库中按天拆表,无法一次性查询数据,需使用UNION合并多表查询,因此此处按天拼接SQL表达式 + // 最终SQL表达式结构为: + // (select xx from date1.xx) union (select xx from date2.xx) union (select xx from date3.xx) + // where time between xxx and xxx + // order by time asc + var ts = dateRange.Diff; + for (var day = 0; day <= ts.Days; day++) + { + var tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.{module}"; + + // 检查表名是否存在,否则SQL执行出错。 + if (CheckTableExists(tblName)) + { + + sql.Append("select \"time\" AS InternalTimeStamp"); + var selectedParams = module.Flatten(true) + .Where(x => x.IsSelected == true); + + // 添加待查询的列 + foreach (var item in selectedParams) + { + sql.Append("," + $"\"{item}\""); + } + + sql.Append($" from \"{tblName}\" "); + + if (day < ts.Days) + sql.Append(" UNION "); + } + } + + // 所有表名不可用,可能是日期范围错误 + if (sql.Length <= 0) + { + return null; + } + sql.Append( + $" where \"time\" between {dateRange.Start.Ticks} and {dateRange.End.Ticks} order by InternalTimeStamp asc"); + progressReporter?.Report(new ProgressUpdatingEventArgs(20, 100, + $"Querying {dateRange}...")); + + if (cancellation?.Token.IsCancellationRequested == true) + return null; + + // 查询数据并将返回的结果存储在DataSet中 + var dataTable = QueryDataClient.Instance.Service.QueryData(sql.ToString()); + + if (cancellation?.Token.IsCancellationRequested == true) + return null; + + //! 返回的 DataTable 可能不存在,原因是上述代码自动生成的表明可能不存在。 + if (dataTable == null) + return null; + + dataTable.TableName = module.Name; + return dataTable; + } + /// /// 渲染图表。 ///