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,6 +139,8 @@
        private void RefreshChart0(DateTime start, DateTime end)
        {
            try
            {
            dtp00.SelectedDateTime = start;
            dtp01.SelectedDateTime = end;
            List<SerialData> datas = SelectSerialDataByTime(start, end);
@@ -136,28 +159,44 @@
            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)
        {
            try
            {
            dtp10.SelectedDateTime = start;
            dtp11.SelectedDateTime = end;
            List<SerialData> datas = SelectSerialDataByTime(start, end);
                List<SerialData> datas = SelectResultDataByTime(start, end);
            datas = datas.OrderByDescending(e => e.time).ToList();
            Dictionary<string, int> pieData = new Dictionary<string, int> {
                Dictionary<string, int?> pieData = new Dictionary<string, int?> {
                { "Passed",0},
                { "Failed",0},
                { "Action",0},
                { "Wait",0},
                //{ "Action",0},
                //{ "Wait",0},
            };
                //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)
            {
                if (snCache.Contains(data.sn)) continue;
                snCache.Add(data.sn);
                if (pieData.ContainsKey(data.status))
                    if (pieData.ContainsKey(data.result))
                {
                    pieData[data.status]++;
                        pieData[data.result]++;
                }
            }
            string res = "[";
@@ -168,12 +207,86 @@
            res += "]";
            webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart1({res})");
        }
            catch (Exception ex)
            {
                log.Error("RefreshChart1 Error.", ex);
                ToastHelper.Error("表2刷新失败!");
            }
        }
        //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)
        {
            try
            {
            dtp20.SelectedDateTime = start;
            dtp21.SelectedDateTime = end;
            List<SerialData> datas = SelectSerialDataByTime(start, end);
                List<SerialData> datas = SelectResultDataByTime(start, end);
            var groups =
                datas.GroupBy(d => d.time.ToString("yyyy-MM-dd"));
@@ -185,30 +298,27 @@
                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();
                    groupDatas = groupDatas.OrderByDescending(e => e.time).ToList();
                foreach (var data in groupDatas)
                {
                    if (snStatusCache.ContainsKey(data.sn))
                        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
                    {
                            snStatusCache.Add(data.sn, data.result);
                        all++;
                        if (data.status == "Passed")
                            if (data.result == "Passed")
                        {
                            passed++;
                            oneTimePass++;
                        }
                        snStatusCache.Add(data.sn, data.status);
                        }
                        else
                        {
                            if (snStatusCache[data.sn] == "Passed")
                            {
                                if (oneTimePass > 0) oneTimePass--;
                                snStatusCache[data.sn] = "NoOnePass";
                            }
                    }
                }
                res.Add(group.Key, new PassRateData
@@ -234,41 +344,68 @@
            var names = $"['{this.lang("bd.onePassRate")}','{this.lang("bd.passRate")}']";
            webview2.CoreWebView2?.ExecuteScriptAsync($"drawChart2({fields},{names},{vals0},{vals1})");
        }
            catch (Exception ex)
            {
                log.Error("RefreshChart2 Error.", ex);
                ToastHelper.Error("表3刷新失败!");
            }
        }
        private void RefreshChart3(DateTime start, DateTime end)
        {
            try
        {
            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>();
                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)
            {
                //if (snCache.Contains(data.sn)) continue;
                if (data.status != "Failed") continue;
                snCache.Add(data.sn);
                if (pieData.ContainsKey(data.step))
                {
                    pieData[data.step]++;
                        pieData[data.step].Value++;
                }
                else
                {
                    pieData[data.step] = 1;
                }
            }
            string names = string.Empty, vals = string.Empty;
            foreach (var key in pieData.Keys)
                        pieData[data.step] = new SimpleData
            {
                names += $"'{key}',";
                vals += $"{pieData[key]},";
                            Name = data.step,
                            Value = 1
                        };
                        datasource.Add(pieData[data.step]);
                    }
                }
                datasource = datasource.OrderByDescending(e => e.Value).ToList();
                if (datasource.Count > 10)
                {
                    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}])");
        }
            catch (Exception ex)
            {
                log.Error("RefreshChart3 Error.", ex);
                ToastHelper.Error("表4刷新失败!");
            }
        }
        private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {