From fe2aa4880d5c9fd88088ad0ed81ebaca05629f5f Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 17:59:45 +0800
Subject: [PATCH] feat: 集成CAN驱动/模拟器 + 仪器仪表注册/硬件调试模块

---
 HMI.LogViewer/LogViewer.xaml.cs |  276 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 211 insertions(+), 65 deletions(-)

diff --git a/HMI.LogViewer/LogViewer.xaml.cs b/HMI.LogViewer/LogViewer.xaml.cs
index da25941..72f3461 100644
--- a/HMI.LogViewer/LogViewer.xaml.cs
+++ b/HMI.LogViewer/LogViewer.xaml.cs
@@ -1,11 +1,14 @@
 锘縰sing HMI.Base;
 using HMI.Core.Util;
 using HMI.UI.Util;
+using HMI.Util;
+using Microsoft.Win32;
 using System;
 using System.Collections.Generic;
 using System.Data;
 using System.IO;
 using System.Linq;
+using System.Threading.Tasks;
 using System.Timers;
 using System.Windows;
 using System.Windows.Controls;
@@ -32,6 +35,29 @@
 
         private Timer autoRfhTimer;
 
+        private long pageSize = 50;
+
+        private long currentPage = 1;
+        public long CurrentPage
+        {
+            get => currentPage;
+            set
+            {
+                Set(ref currentPage, value);
+                Filtrate(value, pageSize);
+            }
+        }
+
+        private long maxPage = 1;
+        public long MaxPage
+        {
+            get => maxPage;
+            set
+            {
+                Set(ref maxPage, value);
+            }
+        }
+
 
         public LogViewer()
         {
@@ -39,11 +65,12 @@
             autoRfhTimer = new Timer
             {
                 Enabled = false,
-                Interval = 1000,
+                Interval = 1500,
                 AutoReset = false
             };
             autoRfhTimer.Elapsed += AutoRfhTimer_Elapsed;
             InitializeComponent();
+            QueryReset();
         }
 
         public override void InitFinish()
@@ -72,7 +99,6 @@
             //}
         }
 
-
         private void UserControl_Loaded(object sender, RoutedEventArgs e)
         {
             Loaded -= UserControl_Loaded;
@@ -82,6 +108,10 @@
         {
             Refresh100items();
         }
+
+        //private void RefreshTable() { 
+        //    if(CurrentPage == )
+        //}
 
         private void Button_Click(object sender, RoutedEventArgs e)
         {
@@ -93,11 +123,35 @@
                     break;
                 case "resetBtn":
                     QueryReset();
+                    CurrentPage = 1;
                     break;
                 case "exportBtn":
+                    DoExport();
                     break;
                 default:
                     break;
+            }
+        }
+
+        private void DoExport()
+        {
+            try
+            {
+                SaveFileDialog sfd = new SaveFileDialog
+                {
+                    Filter = "Excel Files (*.xls)|*.xls",
+                };
+                if (sfd.ShowDialog() == true)
+                {
+                    var dt = GetDataTable(false, 1, 1, out long totalPage);
+                    ExcelHelper.ExportExcel<LogData>(sfd.FileName, dt);
+                    ToastHelper.Success(this.lang("App.ExportSuccess"));
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Export Log Failed.", ex);
+                MsgBoxHelper2.Error($"瀵煎嚭澶辫触: {ex.Message}");
             }
         }
 
@@ -118,9 +172,10 @@
                     return;
                 }
 
-                queryBtn.IsEnabled = false;
-                autoRfhInput.IsEnabled = false;
-                Filtrate();
+                AutoRfh = false;
+                //queryBtn.IsEnabled = false;
+                //autoRfhInput.IsEnabled = false;
+                CurrentPage = 1;
             }
             catch (Exception ex)
             {
@@ -136,27 +191,104 @@
 
         private void QueryReset()
         {
+            var today = DateTime.Now;
+            var start = DateTime.Parse(today.ToString("yyyy-MM-dd 00:00:00")).AddDays(-7);
+            var end = DateTime.Parse(today.ToString("yyyy-MM-dd 00:00:00")).AddDays(1);
+
             levelInput.Text = null;
-            startTimeInput.SelectedDateTime = null;
-            endTimeInput.SelectedDateTime = null;
-            startTimeInput.Text = null;
-            table.ItemsSource = null;
+            startTimeInput.SelectedDateTime = start;
+            endTimeInput.SelectedDateTime = end;
         }
 
-        private void Filtrate()
+        public DataTable GetDataTable(bool usePage, long page, long size, out long totalPage)
         {
-            string str = LoadSql();
-            DataTable dt = new DataTable();
+            totalPage = 0;
             var files = GetOldDbFiles(PathHelper.LogViewerDir, new DateTime?[] { startTimeInput.SelectedDateTime,
                 endTimeInput.SelectedDateTime });
-            foreach (string file in files)
+            if (files.Length <= 0)
             {
-                SqliteHelper sql = new SqliteHelper(file);
-                dt.Merge(sql.GetDataTable(str));
-                sql.Close();
+                return new DataTable();
             }
-            dt.DefaultView.Sort = "time Desc";
-            table.ItemsSource = dt.DefaultView;
+
+            using (Sqlite3Helper helper = new Sqlite3Helper(files[0]))
+            {
+                for (int i = 0; i < files.Length; i++)
+                {
+                    var attach = $"ATTACH DATABASE '{files[i]}' AS 'db{i}'";
+                    helper.Execute(attach);
+                }
+
+                string sql = string.Join(" UNION ALL ", GetSqls(files));
+
+                string sortName = "time", sortDirection = "DESC";
+
+                string baseSql = $"SELECT level,time,source,text FROM ({sql}) as _temp";
+
+                string countSql = $"SELECT COUNT(1) FROM ({sql}) as __temp";
+
+                long total = (long)helper.SelectOne(countSql);
+                totalPage = (total / pageSize) + ((total % pageSize) > 0 ? 1 : 0);
+
+                if (usePage)
+                {
+                    sql = $"{baseSql} ORDER BY {sortName} {sortDirection} LIMIT {size} OFFSET {(page - 1) * size} ";
+                }
+                else
+                {
+                    sql = $"{baseSql} ORDER BY {sortName} {sortDirection}";
+                }
+
+                DataTable dt = helper.GetDataTable(sql);
+                return dt;
+            }
+        }
+
+        private void Filtrate(long page, long size)
+        {
+            try
+            {
+                //var files = GetOldDbFiles(PathHelper.LogViewerDir, new DateTime?[] { startTimeInput.SelectedDateTime,
+                //endTimeInput.SelectedDateTime });
+                //if (files.Length <= 0)
+                //{
+                //    table.ItemsSource = new DataTable().DefaultView;
+                //    return;
+                //}
+
+                //using (Sqlite3Helper helper = new Sqlite3Helper(files[0]))
+                //{
+                //    for (int i = 0; i < files.Length; i++)
+                //    {
+                //        var attach = $"ATTACH DATABASE '{files[i]}' AS 'db{i}'";
+                //        helper.Execute(attach);
+                //    }
+
+                //    string sql = string.Join(" UNION ALL ", GetSqls(files));
+
+                //    string sortName = "time", sortDirection = "DESC";
+
+                //    string baseSql = $"SELECT level,time,source,text FROM ({sql}) as _temp";
+
+                //    string countSql = $"SELECT COUNT(1) FROM ({sql}) as __temp";
+
+                //    long total = (long)helper.SelectOne(countSql);
+                //    long pages = (total/pageSize)+ ((total % pageSize) > 0 ? 1 : 0);
+
+                //    sql = $"{baseSql} ORDER BY {sortName} {sortDirection} LIMIT {size} OFFSET {(page - 1) * size} ";
+
+                //    DataTable dt = helper.GetDataTable(sql);
+                //    table.ItemsSource = dt.DefaultView;
+
+                //    MaxPage = pages;
+                //}
+                table.ItemsSource = GetDataTable(true, page, size, out long totalPage).DefaultView;
+                MaxPage = totalPage;
+            }
+            catch (Exception ex)
+            {
+                log.Error("Select Log Error.", ex);
+                MsgBoxHelper2.Error($"鏌ヨ澶辫触: {ex.Message}");
+            }
         }
 
         public static string[] GetOldDbFiles(string folderPath, DateTime?[] range)
@@ -174,9 +306,9 @@
                     var lastWriteTime = File.GetLastWriteTime(file);
                     bool flag = true;
                     if (range[0] != null) flag &= lastWriteTime >= range[0];
-                    if (range[1] != null) flag &= lastWriteTime <= range[1];
+                    //if (range[1] != null) flag &= lastWriteTime <= range[1];
                     return flag;
-                }).ToArray();
+                }).OrderByDescending(f => f).ToArray();
 
                 return oldFiles;
             }
@@ -187,35 +319,40 @@
         }
 
         /// <summary>
-        /// 鍔犺浇鐣岄潰鍒ゆ柇鏁版嵁搴撹鍙�
+        /// 
         /// </summary>
-        /// <returns> str鏁版嵁搴撶殑璇彞 </returns>
-        private string LoadSql()
+        /// <param name="files"></param>
+        /// <returns></returns>
+        private string[] GetSqls(string[] files)
         {
-            string sql = " select level,time,source,text from log";
-            List<string> datas = new List<string>();
-            if (!string.IsNullOrEmpty(levelInput.Text))
+            string[] sqls = new string[files.Length];
+            for (int i = 0; i < files.Length; i++)
             {
-                datas.Add($"level='{levelInput.Text}'");
-            }
-            if (!string.IsNullOrEmpty(startTimeInput.Text))
-            {
-                datas.Add($"time>='{startTimeInput.Text}'");
-            }
-            if (!string.IsNullOrEmpty(endTimeInput.Text))
-            {
-                datas.Add($"time<='{endTimeInput.Text}'");
-            }
-            if (!string.IsNullOrEmpty(sourceInput.Text))
-            {
-                datas.Add($"source='{sourceInput.Text}'");
-            }
+                string sql = $"SELECT level,time,source,text FROM db{i}.log";
+                List<string> datas = new List<string>();
+                if (!string.IsNullOrEmpty(levelInput.Text))
+                {
+                    datas.Add($"level='{levelInput.Text}'");
+                }
+                if (!string.IsNullOrEmpty(startTimeInput.Text))
+                {
+                    datas.Add($"time>='{startTimeInput.Text}'");
+                }
+                if (!string.IsNullOrEmpty(endTimeInput.Text))
+                {
+                    datas.Add($"time<'{endTimeInput.Text}'");
+                }
+                if (!string.IsNullOrEmpty(sourceInput.Text))
+                {
+                    datas.Add($"source='{sourceInput.Text}'");
+                }
 
-            string condition = string.Join(" AND ", datas);
-            condition = string.IsNullOrEmpty(condition) ? string.Empty : $" WHERE {condition}";
-
-            sql = $"{sql}{condition} order by time desc";
-            return sql;
+                string condition = string.Join(" AND ", datas);
+                condition = string.IsNullOrEmpty(condition) ? string.Empty : $" WHERE {condition}";
+                sql = $"{sql}{condition}";
+                sqls[i] = sql;
+            }
+            return sqls;
         }
 
         /// <summary>
@@ -223,28 +360,37 @@
         /// </summary>
         private void Refresh100items()
         {
-            try
+            autoRfhTimer.Enabled = false;
+            Task.Run(() =>
             {
-                autoRfhTimer.Enabled = false;
-                string todayLogFile = Path.Combine(PathHelper.LogViewerDir, $"log_{DateTime.Today:yyyy-MM-dd}.db");
-                if (!File.Exists(todayLogFile)) return;
-                string str = "select level,time,source,text from log order by time desc limit 100";
-                SqliteHelper sql = new SqliteHelper(todayLogFile);
-                var dt = sql.GetDataTable(str);
-                this.Dispatcher.BeginInvoke((Action)delegate ()
+                try
                 {
-                    table.ItemsSource = dt.DefaultView;
-                });
-            }
-            catch (Exception ex)
-            {
-                log.Error("Log Auto Refresh Failed.", ex);
-                this.Error($"鑷姩鍒锋柊澶辫触锛亄ex.Message}");
-            }
-            finally
-            {
-                autoRfhTimer.Enabled = AutoRfh;
-            }
+                    string todayLogFile = Path.Combine(PathHelper.LogViewerDir, $"log_{DateTime.Today:yyyy-MM-dd}.db");
+                    if (!File.Exists(todayLogFile)) return;
+                    string str = "select level,time,source,text from log order by time desc limit 100";
+                    using (SqliteHelper sql = new SqliteHelper(todayLogFile))
+                    {
+                        var dt = sql.GetDataTable(str);
+                        this.Dispatcher.BeginInvoke((Action)delegate ()
+                        {
+                            table.ItemsSource = dt.DefaultView;
+                            MaxPage = 1;
+                        });
+                    }
+                }
+                catch (Exception ex)
+                {
+                    log.Error("Log Auto Refresh Failed.", ex);
+                    this.Error($"鑷姩鍒锋柊澶辫触锛亄ex.Message}");
+                }
+                finally
+                {
+                    this.Dispatcher.BeginInvoke((Action)delegate ()
+                    {
+                        autoRfhTimer.Enabled = AutoRfh;
+                    });
+                }
+            });
         }
     }
 }

--
Gitblit v1.9.1