修正DataLog查IO数据不正确的问题。

This commit is contained in:
DESKTOP-GPE37UV\THINKAPD 2022-11-22 16:56:35 +08:00
parent 4c7aa1ef93
commit 679ce9d0c5
1 changed files with 94 additions and 63 deletions

View File

@ -482,7 +482,7 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.DataHistory
} }
/// <summary> /// <summary>
/// 根据左侧选项查询数据 /// 根据DataLog界面左侧项目树中择的查询数据
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
private static DataSet SearchDataBaseAsync( private static DataSet SearchDataBaseAsync(
@ -498,78 +498,109 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.DataHistory
// 遍历模组 // 遍历模组
foreach (var module in modules) foreach (var module in modules)
{ {
var sql = new StringBuilder(); // 如果当前根节点下没有被选中的终端节点,则忽略
//! 因为数据库中按天拆表无法一次性查询数据需使用UNION合并多表查询因此此处按天拼接SQL表达式 if (module.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected) == null)
// 最终SQL表达式结构为 continue;
// (select xx from date1.xx) union (select xx from date2.xx) union (select xx from date3.xx)
// where time between xxx and xxx if (module.ToString() != "IO")
// order by time asc
var ts = dateRange.Diff;
for (var day = 0; day <= ts.Days; day++)
{ {
// 检查表名是否存在否则SQL执行出错。 // 如果不是IO节点则根节点名即为数据库名=
var tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.{module}"; var dt = SearchSingleDbTable(module, dateRange, cancellation, progressReporter);
if (module.ToString() == "IO") 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)
{ {
var node = module.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected); if (subNode.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected) == null)
tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.{node}"; continue;
}else if (module.ToString() != "PM1")
{
tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.System";
}
if (CheckTableExists(tblName)) var dt = SearchSingleDbTable(subNode, dateRange, cancellation, progressReporter);
{ if (dt != null)
ds.Tables.Add(dt);
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)
{
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; return ds;
} }
/// <summary>
/// IO节点在数据库中的表名比较特殊需要特殊处理。
/// </summary>
/// <param name="module"></param>
/// <param name="dateRange"></param>
/// <param name="cancellation"></param>
/// <param name="progressReporter"></param>
/// <returns></returns>
private static DataTable SearchSingleDbTable(TreeNode module, DateRangeHelper dateRange,
CancellationTokenSource cancellation = null,
IProgress<ProgressUpdatingEventArgs> 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;
}
/// <summary> /// <summary>
/// 渲染图表。 /// 渲染图表。
/// </summary> /// </summary>