alielie
2025-10-10 15bbd62b0b24b72c717ae91ab45348a2083ad04e
Plugin.DataBoard/DataBoard.xaml.cs
@@ -1,5 +1,6 @@
using HMI.Base;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using Microsoft.Web.WebView2.Core;
using System;
@@ -95,6 +96,26 @@
            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");
@@ -118,156 +139,272 @@
        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)