From 9d1660270272180cd71147d6ddd53d1382643d2e Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 18:00:14 +0800
Subject: [PATCH] merge: 并入远程 Initial commit 作为历史根节点

---
 HMI.LogViewer/LogViewer.xaml.cs |  396 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 396 insertions(+), 0 deletions(-)

diff --git a/HMI.LogViewer/LogViewer.xaml.cs b/HMI.LogViewer/LogViewer.xaml.cs
new file mode 100644
index 0000000..72f3461
--- /dev/null
+++ b/HMI.LogViewer/LogViewer.xaml.cs
@@ -0,0 +1,396 @@
+锘縰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;
+
+namespace HMI.LogViewer
+{
+    /// <summary>
+    /// UserControl1.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    public partial class LogViewer : PluginControl
+    {
+
+        private bool autoRfh;
+
+        public bool AutoRfh
+        {
+            get { return autoRfh; }
+            set
+            {
+                Set(ref autoRfh, value);
+                if (autoRfhTimer != null) autoRfhTimer.Enabled = value;
+            }
+        }
+
+        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()
+        {
+            DataContext = this;
+            autoRfhTimer = new Timer
+            {
+                Enabled = false,
+                Interval = 1500,
+                AutoReset = false
+            };
+            autoRfhTimer.Elapsed += AutoRfhTimer_Elapsed;
+            InitializeComponent();
+            QueryReset();
+        }
+
+        public override void InitFinish()
+        {
+            //base.InitFinish();
+            //string baseFile = Path.Combine(logDir, "log.db");
+
+            //try
+            //{
+            //    if (!File.Exists(baseFile))
+            //    {
+            //        SqliteHelper.CreateDatabase(baseFile);
+            //    }
+            //    SqliteHelper sqliteHelper = new SqliteHelper(baseFile);
+            //    sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS log (
+            //        id INTEGER PRIMARY KEY AUTOINCREMENT,
+            //        level TEXT NOT NULL,
+            //        text TEXT NOT NULL,
+            //        source TEXT,
+            //        time TIME
+            //        );");
+            //}
+            //catch (Exception ex)
+            //{
+            //    log.Error("Create Log File Failed.", ex);
+            //}
+        }
+
+        private void UserControl_Loaded(object sender, RoutedEventArgs e)
+        {
+            Loaded -= UserControl_Loaded;
+        }
+
+        private void AutoRfhTimer_Elapsed(object sender, ElapsedEventArgs e)
+        {
+            Refresh100items();
+        }
+
+        //private void RefreshTable() { 
+        //    if(CurrentPage == )
+        //}
+
+        private void Button_Click(object sender, RoutedEventArgs e)
+        {
+            Button btn = sender as Button;
+            switch (btn.Name)
+            {
+                case "queryBtn":
+                    QueryLog();
+                    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}");
+            }
+        }
+
+        private void QueryLog()
+        {
+            try
+            {
+                if (startTimeInput.SelectedDateTime == null && endTimeInput.SelectedDateTime == null)
+                {
+                    ToastHelper.Error(this.lang("log.timeCantBeNull"));
+                    return;
+                }
+
+                if (endTimeInput.SelectedDateTime != null && startTimeInput.SelectedDateTime != null &&
+                endTimeInput.SelectedDateTime < startTimeInput.SelectedDateTime)
+                {
+                    ToastHelper.Error(this.lang("log.timeRangeError"));
+                    return;
+                }
+
+                AutoRfh = false;
+                //queryBtn.IsEnabled = false;
+                //autoRfhInput.IsEnabled = false;
+                CurrentPage = 1;
+            }
+            catch (Exception ex)
+            {
+                log.Error("Log Query Failed.", ex);
+                this.Error($"鏌ヨ澶辫触锛亄ex.Message}");
+            }
+            finally
+            {
+                queryBtn.IsEnabled = true;
+                autoRfhInput.IsEnabled = true;
+            }
+        }
+
+        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 = start;
+            endTimeInput.SelectedDateTime = end;
+        }
+
+        public DataTable GetDataTable(bool usePage, long page, long size, out long totalPage)
+        {
+            totalPage = 0;
+            var files = GetOldDbFiles(PathHelper.LogViewerDir, new DateTime?[] { startTimeInput.SelectedDateTime,
+                endTimeInput.SelectedDateTime });
+            if (files.Length <= 0)
+            {
+                return new DataTable();
+            }
+
+            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)
+        {
+            if (!Directory.Exists(folderPath))
+            {
+                return new string[0];
+            }
+            // 鑾峰彇鎵�鏈�.db鏂囦欢骞剁瓫閫夊嚭7澶╁墠鏇存柊鐨勬枃浠�
+            var oldFiles = Directory.GetFiles(folderPath, "*.db");
+            try
+            {
+                oldFiles = oldFiles.Where(file =>
+                {
+                    var lastWriteTime = File.GetLastWriteTime(file);
+                    bool flag = true;
+                    if (range[0] != null) flag &= lastWriteTime >= range[0];
+                    //if (range[1] != null) flag &= lastWriteTime <= range[1];
+                    return flag;
+                }).OrderByDescending(f => f).ToArray();
+
+                return oldFiles;
+            }
+            catch (Exception ex)
+            {
+                return new string[0];
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="files"></param>
+        /// <returns></returns>
+        private string[] GetSqls(string[] files)
+        {
+            string[] sqls = new string[files.Length];
+            for (int i = 0; i < files.Length; i++)
+            {
+                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}";
+                sqls[i] = sql;
+            }
+            return sqls;
+        }
+
+        /// <summary>
+        /// 鍒锋柊100鏉℃暟鎹�
+        /// </summary>
+        private void Refresh100items()
+        {
+            autoRfhTimer.Enabled = false;
+            Task.Run(() =>
+            {
+                try
+                {
+                    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