private async Task <DataTable> GetQueryDataTable() { tagDictionMap = new Dictionary <string, string>(); Dictionary <string, List <T> > list = await serviceAction(); DataTable dt = new DataTable(); int index = 0; int rowIndex = 0; int maxRow = 0; string maxKey = ""; dt.Columns.Add(new DataColumn { ColumnName = "ID", Caption = "序号", DataType = typeof(Int64) }); foreach (var item in list.Keys) { if (!tagDictionMap.ContainsKey(item)) { tagDictionMap.Add(item, $"RX{index}"); dt.Columns.Add(new DataColumn { ColumnName = $"TagName_RX{index}", Caption = $"TagName_{item}", DataType = typeof(double) }); dt.Columns.Add(new DataColumn { ColumnName = $"Time_RX{index}", Caption = $"Time_{item}", DataType = typeof(string) }); dt.Columns.Add(new DataColumn { ColumnName = $"Confidence_RX{index}", Caption = $"Confidence_{item}", DataType = typeof(string) }); index++; } } Func <QueryModel, string, string> getTagFormula = (model, s) => { var listTagModel = HanatechExpression.Run(s).ExpTagModel; foreach (var item in listTagModel) { s = s.Replace(item.ExpServerName + ":", ""); var key = tagDictionMap.Keys.FirstOrDefault(d => d.Contains($"{item.ExpTagName.Replace("\"", "")}|{model.Start}|{model.End}")); s = s.Replace(item.ExpTagName, key); if (!string.IsNullOrEmpty(key)) { s = s.Replace(key, "TagName_" + tagDictionMap[key]); } } return(s); }; Func <QueryModel, string> getTagExpression = (s) => { string res = $"IIF({getTagFormula(s, s.Expression.Left)} {s.Expression.Compare.Replace("==", "=")} {getTagFormula(s, s.Expression.Right)} "; res += $",{getTagFormula(s, s.Expression.LeftAck)} ,{getTagFormula(s, s.Expression.RightAck)})"; return(res); }; index = 0; foreach (var item in listParam) { if (item.IsFormula) { try { dt.Columns.Add(new DataColumn { ColumnName = $"Formula_RX{index}", Caption = $"{item.TagName}", DataType = typeof(double), Expression = getTagFormula(item, item.TagName) }); } catch (Exception) { dt.Columns.Add(new DataColumn { ColumnName = $"Formula_RX{index}", Caption = $"{item.TagName}", DataType = typeof(double), Expression = "IIF(1=0,0,0)" }); item.IsError = true; } dt.Columns.Add(new DataColumn { ColumnName = $"FormulaTime_RX{index}", Caption = $"FormulaTime_{index}", DataType = typeof(string) }); dt.Columns.Add(new DataColumn { ColumnName = $"FormulaConfidence_RX{index}", Caption = $"FormulaConfidence_{index++}", DataType = typeof(string) }); } if (item.IsExpression) { // IIF(TagA + 1 > TagB, TagA, 666) try { dt.Columns.Add(new DataColumn { ColumnName = $"Expression_RX{index}", Caption = $"{item.TagName}", DataType = typeof(double), Expression = getTagExpression(item) }); } catch (Exception) { dt.Columns.Add(new DataColumn { ColumnName = $"Expression_RX{index}", Caption = $"{item.TagName}", DataType = typeof(double), Expression = "IIF(1=0,0,0)" }); item.IsError = true; } dt.Columns.Add(new DataColumn { ColumnName = $"ExpressionTime_RX{index}", Caption = $"ExpressionTime_{index}", DataType = typeof(string) }); dt.Columns.Add(new DataColumn { ColumnName = $"ExpressionConfidence_RX{index}", Caption = $"ExpressionConfidence_{index++}", DataType = typeof(string) }); } } foreach (var item in list) { if (maxRow < list[item.Key].Count) { maxKey = item.Key; maxRow = list[item.Key].Count; } } if (!list.ContainsKey(maxKey)) { return(dt); } foreach (var item in list[maxKey]) { DataRow dr = dt.NewRow(); dr["ID"] = rowIndex++; dt.Rows.Add(dr); } foreach (var item in list) { var datas = list[item.Key]; int dataIndex = 0; foreach (var d in datas) { string drKey = tagDictionMap[item.Key]; dt.Rows[dataIndex][$"TagName_{drKey}"] = d.位号值; dt.Rows[dataIndex][$"Time_{drKey}"] = d.位号值时间; dt.Rows[dataIndex++][$"Confidence_{drKey}"] = d.可信度; } } List <int> listColumn = new List <int>(); for (int i = 0; i < dt.Columns.Count; i++) { if (dt.Columns[i].ColumnName.Contains("FormulaTime_RX") || dt.Columns[i].ColumnName.Contains("ExpressionTime_RX")) { listColumn.Add(i); } } string maxDrkey = tagDictionMap[maxKey]; foreach (var item in listParam.Where(d => d.IsExpression || d.IsFormula)) { foreach (DataRow dr in dt.Rows) { listColumn.ForEach(d => { dr[d] = dr[$"Time_{maxDrkey}"]; }); } } return(dt); }
public List <T> GetQueryParams(List <QueryModel> listParam) { List <T> query = new List <T>(); foreach (var item in listParam) { var temp = new T { 位号名称 = item.TagName }; if (item.Start?.Length > 5) { temp.开始日期 = DateTime.Parse(item.Start).AddSeconds(item.OffsetValue).ToString("yyyy-MM-dd HH:mm:ss"); temp.结束日期 = DateTime.Parse(item.End).AddSeconds(item.OffsetValue).ToString("yyyy-MM-dd HH:mm:ss"); } else { temp.开始日期 = DateTime.Now.AddMinutes(-120).AddSeconds(item.OffsetValue).ToString("yyyy-MM-dd HH:mm:ss"); temp.结束日期 = DateTime.Now.AddSeconds(item.OffsetValue).ToString("yyyy-MM-dd HH:mm:ss"); } if (item.FieldValue > 0) { temp.字段 = item.Field; temp.周期 = item.FieldValue * Convert.ToInt32(item.FieldType); } item.Start = temp.开始日期; item.End = temp.结束日期; item.IsExpression = item.Expression != null; item.IsFormula = HanatechExpression.isExpTag(item.TagName) && item.Expression == null; if (item.IsExpression || item.IsFormula) { var listTagModel = new List <ExpTagModel>(); if (item.IsExpression) { listTagModel.AddRange(HanatechExpression.Run(item.Expression.Left).ExpTagModel); listTagModel.AddRange(HanatechExpression.Run(item.Expression.Right).ExpTagModel); listTagModel.AddRange(HanatechExpression.Run(item.Expression.LeftAck).ExpTagModel); listTagModel.AddRange(HanatechExpression.Run(item.Expression.RightAck).ExpTagModel); } else { listTagModel = HanatechExpression.Run(item.TagName).ExpTagModel; } listTagModel.ForEach(d => { query.Add(new T() { 位号名称 = $"{d.ExpFullName.Replace("\"", "")}", 开始日期 = temp.开始日期, 结束日期 = temp.结束日期, 字段 = temp.字段, 周期 = temp.周期 }); }); } else { query.Add(temp); } } var queryList = query.Distinct(new QueryParamComparer <T>()).ToList(); return(query); }