wenxiangchao
3 天以前 b544d5cccd76735e034c8055918a50927b437474
HMI.LogViewer/LogViewer.xaml.cs
@@ -1,16 +1,17 @@
using HMI.Base;
using HMI.Core.Util;
using HMI.UI.Util;
using log4net.Core;
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;
using static System.Net.Mime.MediaTypeNames;
namespace HMI.LogViewer
{
@@ -34,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()
        {
@@ -41,11 +65,12 @@
            autoRfhTimer = new Timer
            {
                Enabled = false,
                Interval = 1000,
                Interval = 1500,
                AutoReset = false
            };
            autoRfhTimer.Elapsed += AutoRfhTimer_Elapsed;
            InitializeComponent();
            QueryReset();
        }
        public override void InitFinish()
@@ -74,7 +99,6 @@
            //}
        }
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            Loaded -= UserControl_Loaded;
@@ -84,6 +108,10 @@
        {
            Refresh100items();
        }
        //private void RefreshTable() {
        //    if(CurrentPage == )
        //}
        private void Button_Click(object sender, RoutedEventArgs e)
        {
@@ -95,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}");
            }
        }
@@ -120,9 +172,10 @@
                    return;
                }
                queryBtn.IsEnabled = false;
                autoRfhInput.IsEnabled = false;
                Filtrate();
                AutoRfh = false;
                //queryBtn.IsEnabled = false;
                //autoRfhInput.IsEnabled = false;
                CurrentPage = 1;
            }
            catch (Exception ex)
            {
@@ -138,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)
@@ -176,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;
            }
@@ -189,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>
@@ -225,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;
                    });
                }
            });
        }
    }
}