| | |
| | | using HMI.Base; |
| | | using HMI.Core.Util; |
| | | using HMI.UI.Util; |
| | | using HMI.Util; |
| | | using Microsoft.Web.WebView2.Core; |
| | | using System; |
| | |
| | | return BeanUtil.ReadBeanFromDataTable<SerialData>(dt); |
| | | } |
| | | |
| | | private List<SerialData> SelectResultDataByTime(DateTime start, DateTime end) |
| | | { |
| | | string[] files = DbFileHelper.GetDbFiles(BaseFolder, start, end); |
| | | if (files == null || files.Length <= 0) |
| | | { |
| | | return new List<SerialData>(); |
| | | } |
| | | string sql = $"SELECT * FROM testResult WHERE time BETWEEN '{start:yyyy-MM-dd HH:mm:ss}' AND '{end:yyyy-MM-dd HH:mm:ss}';"; |
| | | |
| | | DataTable dt = new DataTable(); |
| | | foreach (string file in files) |
| | | { |
| | | using (SqliteHelper helper = new SqliteHelper(file)) |
| | | { |
| | | dt.Merge(helper.GetDataTable(sql)); |
| | | } |
| | | } |
| | | return BeanUtil.ReadBeanFromDataTable<SerialData>(dt); |
| | | } |
| | | |
| | | private void webview2_Loaded(object sender, RoutedEventArgs e) |
| | | { |
| | | string path = Path.Combine(PathHelper.AppFolder, "Libs", "Static", "test.html"); |
| | |
| | | |
| | | private void RefreshChart0(DateTime start, DateTime end) |
| | | { |
| | | dtp00.SelectedDateTime = start; |
| | | dtp01.SelectedDateTime = end; |
| | | List<SerialData> datas = SelectSerialDataByTime(start, end); |
| | | |
| | | datas.OrderByDescending(e => e.time); |
| | | int all = 0, output = 0; |
| | | HashSet<string> snCache = new HashSet<string>(); |
| | | foreach (var data in datas) |
| | | try |
| | | { |
| | | if (snCache.Contains(data.sn)) continue; |
| | | snCache.Add(data.sn); |
| | | all++; |
| | | if (data.status == "Passed") output++; |
| | | } |
| | | var fields = $"['{this.lang("bd.input")}','{this.lang("bd.output")}']"; |
| | | dtp00.SelectedDateTime = start; |
| | | dtp01.SelectedDateTime = end; |
| | | List<SerialData> datas = SelectSerialDataByTime(start, end); |
| | | |
| | | webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart0({fields}, [{all},{output}])"); |
| | | datas.OrderByDescending(e => e.time); |
| | | int all = 0, output = 0; |
| | | HashSet<string> snCache = new HashSet<string>(); |
| | | foreach (var data in datas) |
| | | { |
| | | if (snCache.Contains(data.sn)) continue; |
| | | snCache.Add(data.sn); |
| | | all++; |
| | | if (data.status == "Passed") output++; |
| | | } |
| | | var fields = $"['{this.lang("bd.input")}','{this.lang("bd.output")}']"; |
| | | |
| | | webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart0({fields}, [{all},{output}])"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("RefreshChart0 Error.", ex); |
| | | ToastHelper.Error("表1刷新失败!"); |
| | | } |
| | | } |
| | | |
| | | private void RefreshChart1(DateTime start, DateTime end) |
| | | { |
| | | dtp10.SelectedDateTime = start; |
| | | dtp11.SelectedDateTime = end; |
| | | List<SerialData> datas = SelectSerialDataByTime(start, end); |
| | | try |
| | | { |
| | | dtp10.SelectedDateTime = start; |
| | | dtp11.SelectedDateTime = end; |
| | | List<SerialData> datas = SelectResultDataByTime(start, end); |
| | | |
| | | datas = datas.OrderByDescending(e => e.time).ToList(); |
| | | Dictionary<string, int> pieData = new Dictionary<string, int> { |
| | | datas = datas.OrderByDescending(e => e.time).ToList(); |
| | | Dictionary<string, int?> pieData = new Dictionary<string, int?> { |
| | | { "Passed",0}, |
| | | { "Failed",0}, |
| | | { "Action",0}, |
| | | { "Wait",0}, |
| | | //{ "Action",0}, |
| | | //{ "Wait",0}, |
| | | }; |
| | | HashSet<string> snCache = new HashSet<string>(); |
| | | foreach (var data in datas) |
| | | { |
| | | if (snCache.Contains(data.sn)) continue; |
| | | snCache.Add(data.sn); |
| | | if (pieData.ContainsKey(data.status)) |
| | | //if (datas == null || datas.Count <= 0) |
| | | //{ |
| | | // pieData = new Dictionary<string, int?> { |
| | | // { "Passed",null}, |
| | | // { "Failed",null}, |
| | | //}; |
| | | //} |
| | | |
| | | HashSet<string> snCache = new HashSet<string>(); |
| | | foreach (var data in datas) |
| | | { |
| | | pieData[data.status]++; |
| | | if (snCache.Contains(data.sn)) continue; |
| | | snCache.Add(data.sn); |
| | | if (pieData.ContainsKey(data.result)) |
| | | { |
| | | pieData[data.result]++; |
| | | } |
| | | } |
| | | string res = "["; |
| | | foreach (var key in pieData.Keys) |
| | | { |
| | | res += $"{{name:'{key}',value:{pieData[key]}}},"; |
| | | } |
| | | res += "]"; |
| | | webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart1({res})"); |
| | | } |
| | | string res = "["; |
| | | foreach (var key in pieData.Keys) |
| | | catch (Exception ex) |
| | | { |
| | | res += $"{{name:'{key}',value:{pieData[key]}}},"; |
| | | log.Error("RefreshChart1 Error.", ex); |
| | | ToastHelper.Error("表2刷新失败!"); |
| | | } |
| | | res += "]"; |
| | | webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart1({res})"); |
| | | } |
| | | |
| | | //private void RefreshChart2(DateTime start, DateTime end) |
| | | //{ |
| | | // dtp20.SelectedDateTime = start; |
| | | // dtp21.SelectedDateTime = end; |
| | | // List<SerialData> datas = SelectSerialDataByTime(start, end); |
| | | |
| | | // var groups = |
| | | // datas.Where(e => e.status == "Passed" || e.status == "Failed").GroupBy(d => d.time.ToString("yyyy-MM-dd")); |
| | | |
| | | // Dictionary<string, PassRateData> res = new Dictionary<string, PassRateData>(); |
| | | |
| | | // foreach (var group in groups) |
| | | // { |
| | | // Dictionary<string, string> snStatusCache = new Dictionary<string, string>(); |
| | | // double all = 0, oneTimePass = 0, passed = 0; |
| | | // var groupDatas = group.ToList(); |
| | | // groupDatas = groupDatas.OrderBy(e => e.time).ToList(); |
| | | |
| | | // foreach (var data in groupDatas) |
| | | // { |
| | | // if (snStatusCache.ContainsKey(data.sn)) |
| | | // { |
| | | // if (snStatusCache[data.sn] != "Passed" && data.status == "Passed") |
| | | // { |
| | | // passed++; |
| | | // } |
| | | // else if (snStatusCache[data.sn] == "Passed" && data.status == "Passed") |
| | | // { |
| | | // if (oneTimePass > 0) oneTimePass--; |
| | | // } |
| | | // } |
| | | // else |
| | | // { |
| | | // all++; |
| | | // if (data.status == "Passed") |
| | | // { |
| | | // passed++; |
| | | // oneTimePass++; |
| | | // } |
| | | // snStatusCache.Add(data.sn, data.status); |
| | | // } |
| | | // } |
| | | // res.Add(group.Key, new PassRateData |
| | | // { |
| | | // time = group.Key, |
| | | // onePassRate = oneTimePass / all * 100, |
| | | // passRate = passed / all * 100, |
| | | // }); |
| | | // } |
| | | |
| | | |
| | | |
| | | // string fields = "[", vals0 = "[", vals1 = "["; |
| | | // foreach (var key in res.Keys) |
| | | // { |
| | | // fields += $"'{key}',"; |
| | | // vals0 += $"{res[key].onePassRate},"; |
| | | // vals1 += $"{res[key].passRate},"; |
| | | // } |
| | | // fields += "]"; |
| | | // vals0 += "]"; |
| | | // vals1 += "]"; |
| | | // var names = $"['{this.lang("bd.onePassRate")}','{this.lang("bd.passRate")}']"; |
| | | // webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart2({fields},{names},{vals0},{vals1})"); |
| | | //} |
| | | |
| | | private void RefreshChart2(DateTime start, DateTime end) |
| | | { |
| | | dtp20.SelectedDateTime = start; |
| | | dtp21.SelectedDateTime = end; |
| | | List<SerialData> datas = SelectSerialDataByTime(start, end); |
| | | |
| | | var groups = |
| | | datas.GroupBy(d => d.time.ToString("yyyy-MM-dd")); |
| | | |
| | | Dictionary<string, PassRateData> res = new Dictionary<string, PassRateData>(); |
| | | |
| | | foreach (var group in groups) |
| | | try |
| | | { |
| | | Dictionary<string, string> snStatusCache = new Dictionary<string, string>(); |
| | | double all = 0, oneTimePass = 0, passed = 0; |
| | | var groupDatas = group.ToList(); |
| | | groupDatas = groupDatas.OrderBy(e => e.time).ToList(); |
| | | dtp20.SelectedDateTime = start; |
| | | dtp21.SelectedDateTime = end; |
| | | List<SerialData> datas = SelectResultDataByTime(start, end); |
| | | |
| | | foreach (var data in groupDatas) |
| | | var groups = |
| | | datas.GroupBy(d => d.time.ToString("yyyy-MM-dd")); |
| | | |
| | | Dictionary<string, PassRateData> res = new Dictionary<string, PassRateData>(); |
| | | |
| | | foreach (var group in groups) |
| | | { |
| | | if (snStatusCache.ContainsKey(data.sn)) |
| | | Dictionary<string, string> snStatusCache = new Dictionary<string, string>(); |
| | | double all = 0, oneTimePass = 0, passed = 0; |
| | | var groupDatas = group.ToList(); |
| | | groupDatas = groupDatas.OrderByDescending(e => e.time).ToList(); |
| | | |
| | | foreach (var data in groupDatas) |
| | | { |
| | | if (snStatusCache[data.sn] != "Passed" && data.status == "Passed") |
| | | if (!snStatusCache.ContainsKey(data.sn)) |
| | | { |
| | | passed++; |
| | | snStatusCache.Add(data.sn, data.result); |
| | | all++; |
| | | if (data.result == "Passed") |
| | | { |
| | | passed++; |
| | | oneTimePass++; |
| | | } |
| | | } |
| | | else if (snStatusCache[data.sn] == "Passed" && data.status == "Passed") |
| | | else |
| | | { |
| | | oneTimePass--; |
| | | if (snStatusCache[data.sn] == "Passed") |
| | | { |
| | | if (oneTimePass > 0) oneTimePass--; |
| | | snStatusCache[data.sn] = "NoOnePass"; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | res.Add(group.Key, new PassRateData |
| | | { |
| | | all++; |
| | | if (data.status == "Passed") |
| | | { |
| | | passed++; |
| | | oneTimePass++; |
| | | } |
| | | snStatusCache.Add(data.sn, data.status); |
| | | } |
| | | time = group.Key, |
| | | onePassRate = oneTimePass / all * 100, |
| | | passRate = passed / all * 100, |
| | | }); |
| | | } |
| | | res.Add(group.Key, new PassRateData |
| | | |
| | | |
| | | |
| | | string fields = "[", vals0 = "[", vals1 = "["; |
| | | foreach (var key in res.Keys) |
| | | { |
| | | time = group.Key, |
| | | onePassRate = oneTimePass / all * 100, |
| | | passRate = passed / all * 100, |
| | | }); |
| | | fields += $"'{key}',"; |
| | | vals0 += $"{res[key].onePassRate},"; |
| | | vals1 += $"{res[key].passRate},"; |
| | | } |
| | | fields += "]"; |
| | | vals0 += "]"; |
| | | vals1 += "]"; |
| | | var names = $"['{this.lang("bd.onePassRate")}','{this.lang("bd.passRate")}']"; |
| | | webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart2({fields},{names},{vals0},{vals1})"); |
| | | } |
| | | |
| | | |
| | | |
| | | string fields = "[", vals0 = "[", vals1 = "["; |
| | | foreach (var key in res.Keys) |
| | | catch (Exception ex) |
| | | { |
| | | fields += $"'{key}',"; |
| | | vals0 += $"{res[key].onePassRate},"; |
| | | vals1 += $"{res[key].passRate},"; |
| | | log.Error("RefreshChart2 Error.", ex); |
| | | ToastHelper.Error("表3刷新失败!"); |
| | | } |
| | | fields += "]"; |
| | | vals0 += "]"; |
| | | vals1 += "]"; |
| | | var names = $"['{this.lang("bd.onePassRate")}','{this.lang("bd.passRate")}']"; |
| | | webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart2({fields},{names},{vals0},{vals1})"); |
| | | } |
| | | |
| | | private void RefreshChart3(DateTime start, DateTime end) |
| | | { |
| | | dtp30.SelectedDateTime = start; |
| | | dtp31.SelectedDateTime = end; |
| | | List<SerialData> datas = SelectSerialDataByTime(start, end); |
| | | |
| | | datas = datas.OrderByDescending(e => e.time).ToList(); |
| | | Dictionary<string, int> pieData = new Dictionary<string, int>(); |
| | | |
| | | HashSet<string> snCache = new HashSet<string>(); |
| | | foreach (var data in datas) |
| | | try |
| | | { |
| | | //if (snCache.Contains(data.sn)) continue; |
| | | if (data.status != "Failed") continue; |
| | | dtp30.SelectedDateTime = start; |
| | | dtp31.SelectedDateTime = end; |
| | | List<SerialData> datas = SelectSerialDataByTime(start, end); |
| | | |
| | | snCache.Add(data.sn); |
| | | if (pieData.ContainsKey(data.step)) |
| | | datas = datas.OrderByDescending(e => e.time).ToList(); |
| | | |
| | | |
| | | |
| | | Dictionary<string, SimpleData> pieData = new Dictionary<string, SimpleData>(); |
| | | List<SimpleData> datasource = new List<SimpleData>(); |
| | | //HashSet<string> snCache = new HashSet<string>(); |
| | | |
| | | foreach (var data in datas) |
| | | { |
| | | pieData[data.step]++; |
| | | //if (snCache.Contains(data.sn)) continue; |
| | | if (data.status != "Failed") continue; |
| | | if (pieData.ContainsKey(data.step)) |
| | | { |
| | | pieData[data.step].Value++; |
| | | } |
| | | else |
| | | { |
| | | pieData[data.step] = new SimpleData |
| | | { |
| | | Name = data.step, |
| | | Value = 1 |
| | | }; |
| | | datasource.Add(pieData[data.step]); |
| | | } |
| | | } |
| | | else |
| | | datasource = datasource.OrderByDescending(e => e.Value).ToList(); |
| | | if (datasource.Count > 10) |
| | | { |
| | | pieData[data.step] = 1; |
| | | datasource = datasource.Take(10).ToList(); |
| | | } |
| | | |
| | | string names = string.Empty, vals = string.Empty; |
| | | foreach (var data in datasource) |
| | | { |
| | | names += $"'{data.Name}',"; |
| | | vals += $"{data.Value},"; |
| | | } |
| | | |
| | | webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart3([{names}],[{vals}])"); |
| | | } |
| | | string names = string.Empty, vals = string.Empty; |
| | | foreach (var key in pieData.Keys) |
| | | catch (Exception ex) |
| | | { |
| | | names += $"'{key}',"; |
| | | vals += $"{pieData[key]},"; |
| | | log.Error("RefreshChart3 Error.", ex); |
| | | ToastHelper.Error("表4刷新失败!"); |
| | | } |
| | | |
| | | webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart3([{names}],[{vals}])"); |
| | | } |
| | | |
| | | private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) |