Sic.Framework-Nanjing-Baishi/MECF.Framework.UI.Client/CenterViews/DataLogs/ProcessHistory/ProcessHistorySqlHelp.cs

240 lines
10 KiB
C#
Raw Normal View History

2023-12-06 13:52:01 +08:00
using Aitex.Core.RT.Log;
using DocumentFormat.OpenXml.InkML;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.Equipment;
using Sicentury.Core;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Text;
namespace MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
{
public class ProcessHistorySqlHelp
{
public static List<RecipeProcessHistoryData> QueryRecipeProcessHistoryData(string starTime, string endTime, string pm)
{
string cmd = $"select * from process_data where process_in='{pm}' and process_status='Succeed' and process_begin_time between '{starTime}' and '{endTime}' order by process_begin_time desc";
return GetPMCoatingList(cmd);
}
//**********************************************时间区间内Recipe运行记录查询*************************************************************
private static List<RecipeProcessHistoryData> GetPMCoatingList(string cmd)
{
List<RecipeProcessHistoryData> recipeProcessHistoryDataList = new List<RecipeProcessHistoryData>();
try
{
var dt = QueryDataClient.Instance.Service.QueryData(cmd);//只能界面用
if (dt == null || dt.Rows.Count == 0)
return null;
for (int i = 0; i < dt.Rows.Count; i++)
{
RecipeProcessHistoryData recipeProcessHistoryData = new RecipeProcessHistoryData()
{
PmModel = dt.Rows[i]["process_in"].ToString(),
XPath = dt.Rows[i]["recipe_name"].ToString(),
Status = dt.Rows[i]["process_status"].ToString(),
ProcessGuid = dt.Rows[i]["guid"].ToString(),
BeginTime = dt.Rows[i]["process_begin_time"].ToString(),
EndTime = dt.Rows[i]["process_end_time"].ToString()
};
recipeProcessHistoryDataList.Add(recipeProcessHistoryData);
}
}
catch (Exception)
{
return null;
}
return recipeProcessHistoryDataList;
}
//**********************************************选中Recipe时查询当时记录的总的步骤流程*************************************************
public static ObservableCollection<ProcessHistoryData> QueryProcessHistoryData(string processGuid, string recipeName,string stepModel)
{
string cmd = $"select * from recipe_step_data where process_data_guid='{processGuid}'";
return GetProcessHistoryDataList(cmd, recipeName, stepModel);
}
private static ObservableCollection<ProcessHistoryData> GetProcessHistoryDataList(string cmd, string recipeName, string stepModel)
{
ObservableCollection<ProcessHistoryData> processHistoryDataList = new ObservableCollection<ProcessHistoryData>();
try
{
var dt = QueryDataClient.Instance.Service.QueryData(cmd);
if (dt == null || dt.Rows.Count == 0)
return null;
for (int i = 0; i < dt.Rows.Count; i++)
{
ProcessHistoryData recipeProcessHistoryData = new ProcessHistoryData()
{
StepBeginTime = dt.Rows[i]["step_begin_time"].ToString(),
StepEndTime = dt.Rows[i]["step_end_time"].ToString(),
RecipeName = recipeName,
StepName = dt.Rows[i]["step_name"].ToString(),
StepTime = dt.Rows[i]["step_time"].ToString(),
StepNumber = dt.Rows[i]["step_number"].ToString()
};
if (stepModel=="All")//All返回所有*筛选出步骤名称中带有*
processHistoryDataList.Add(recipeProcessHistoryData);
else if (stepModel=="*")
if (recipeProcessHistoryData.StepName.Contains("*"))
processHistoryDataList.Add(recipeProcessHistoryData);
}
}
catch (Exception)
{
return null;
}
return processHistoryDataList;
}
//************************************************单步时硬件数据结果查询*******************************************************************
/// <summary>
/// 拆分的天循查询数据
/// </summary>
/// <param name="daySlices">拆分的天</param>
/// <param name="moduleName">PM名称</param>
/// <param name="gasFlowSumList">显示列表对象</param>
/// <returns></returns>
public static ObservableCollection<ProcessHistoryDeviceData> GetProcessHistoryDeviceData(IEnumerable<DateRangeHelper> daySlices, string moduleName, List<ProcessDeviceItem> processHistoryItemList)
{
List<DataTable> dataTableList =new List<DataTable>();
foreach (var daySlice in daySlices)//拆分天
{
dataTableList.Add(GetProcessHistoryDeviceDataListDaySlices(daySlice, moduleName, processHistoryItemList));//拆分后,每次查询结果放入集合中
}
ObservableCollection<ProcessHistoryDeviceData> processHistoryDeviceDataList = new ObservableCollection<ProcessHistoryDeviceData>();
foreach (var item in processHistoryItemList)
{
var phd = new ProcessHistoryDeviceData();
phd.DeviceName = item.Display;
phd.DATASubscribeName = item.Property;
phd.Unit = item.Unit;
foreach (DataTable ds in dataTableList)
{
for (int i = 0; i < ds.Rows.Count; i++)
{
if (!item.IsPropertyExists)
continue;
string value = ds.Rows[i][$"{moduleName}.{item.Property}"].ToString();
if (value is not null && value.Length == 0)
continue;
2023-12-06 13:52:01 +08:00
phd.DeviceValue.Add(float.Parse(value));//历史数据点
phd.TimeStamp.Add(ds.Rows[i]["time"].ToString());//时间戳
}
}
phd.CalculateData();
processHistoryDeviceDataList.Add(phd);
}
return processHistoryDeviceDataList;
}
/// <summary>
/// 根据拆分的天循查询数据
/// </summary>
/// <param name="daySlices">拆分的天</param>
/// <param name="moduleName">PM名称</param>
/// <param name="gasFlowSumList">显示集合列表</param>
/// <returns></returns>
private static DataTable GetProcessHistoryDeviceDataListDaySlices(DateRangeHelper daySlices, string moduleName, List<ProcessDeviceItem> processHistoryItemList)
{
DataTable dataTable=new ();
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 processHistoryItemList)
{
// 检查表中是否存在对应属性否则SQL执行出错。
if (CheckPropertyExists(tblName, $"{moduleName}.{item.Property}"))
{
item.IsPropertyExists = true;
sql.Append("," + $"\"{moduleName}.{item.Property}\"");
}
else//不查询状态标记
item.IsPropertyExists = false;
}
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 _dataTable = QueryDataClient.Instance.Service.QueryData(sql.ToString());
if (_dataTable is not null && _dataTable.Rows.Count > 0)
dataTable = _dataTable;
}
catch (Exception ex)//查询较早日期时,可能不存在属性会报错
{
}
}
}
return dataTable;
}
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;
}
private static bool CheckPropertyExists(string tableName, string property)
{
var sql =
$"select count(1) from information_schema.columns WHERE table_name = '{tableName}' and column_name = '{property}'";
var table = QueryDataClient.Instance.Service.QueryData(sql);
if (table == null)
return false;
if (table.Rows.Count <= 0)
return false;
var value =int.Parse(table.Rows[0]["count"].ToString());
if (value == 0)
return false;
return true;
}
}
}