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