Files
FT479/WPFWCSDemo/ViewModels/AlarmHistoryViewModel.cs
2026-06-29 14:46:32 +08:00

695 lines
20 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPFWCSDemo.Utilities;
using System.Windows;
using WPFWCSDemo.StateCode;
using Serilog;
using WPFWCSDemo.Models.Tables;
using WPFWCSDemo.Data;
namespace WPFWCSDemo.ViewModels
{
public partial class AlarmHistoryViewModel:ObservableObject
{
public AlarmHistoryViewModel()
{
AlarmHistory = new ObservableCollection<AlarmHistory>();
ColumnList = new ObservableCollection<string>();
columnDic = new Dictionary<string, string>();
Pages = new ObservableCollection<string>();
DateStart = DateTime.Now.AddDays(-1).ToString(TimeFormat.stringFormatDateOnly);
TimeStart = DateTime.Now.AddDays(-1).ToString("HH:mm");
DateEnd = DateTime.Now.ToString(TimeFormat.stringFormatDateOnly);
TimeEnd = DateTime.Now.ToString("HH:mm");
LoadAlarmHistory(1);
LoadColumnName();
PageInput = 1;
PageCurrent = 1;
PageInfo = $"当前 {PageCurrent} 页";
}
/// <summary>
/// false-表示默认表数据集 true-表示执行查询操作后的表数据集
/// </summary>
bool b;
/// <summary>
/// 历史表数据
/// </summary>
[ObservableProperty]
ObservableCollection<AlarmHistory> _alarmHistory;
/// <summary>
/// 起始日期
/// </summary>
[ObservableProperty]
string _dateStart;
/// <summary>
/// 起始时间
/// </summary>
[ObservableProperty]
string _timeStart;
/// <summary>
/// 结束日期
/// </summary>
[ObservableProperty]
string _dateEnd;
/// <summary>
/// 结束时间
/// </summary>
[ObservableProperty]
string _timeEnd;
/// <summary>
/// 报警级别选中项
/// </summary>
[ObservableProperty]
int _alarmLevelSelectedIndex;
/// <summary>
/// 报警级别选中项
/// </summary>
[ObservableProperty]
int _alarmLevelSelectedItem;
string alarmLevel;
/// <summary>
/// 查询字段名
/// </summary>
[ObservableProperty]
string _columnName;
/// <summary>
/// 查询关键词
/// </summary>
[ObservableProperty]
string _keywords;
/// <summary>
/// 查询字段选择项集合
/// </summary>
[ObservableProperty]
ObservableCollection<string> _columnList;
/// <summary>
/// 查询字段名
/// </summary>
Dictionary<string, string> columnDic;
/// <summary>
/// 显示表数据
/// </summary>
/// <param name="page">页数</param>
void LoadAlarmHistory(int page)
{
b = false;
using var context = new AppDbContext();
int dtCount = context.Set<AlarmHistory>()
.OrderByDescending(t => t.End_Time)
.Count();
//var alarmHistories = context.Set<AlarmHistory>()
// .OrderByDescending(t => t.End_Time)
// .Skip((page - 1) * countPerPage)
// .Take(countPerPage)
// .ToList();
//AlarmHistory.Clear();
//foreach (AlarmHistory a in alarmHistories)
//{
// AlarmHistory.Add(a);
//}
DataTable? dt = SqlHelper.ExecuteTable("SELECT POINT_ID,DESCRIPTION,PRIORITY,DEVICE_ID,GEN_TIME,END_TIME FROM ALARM_LOG ORDER BY END_TIME DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
new SqlParameter("@Rows", page - 1));
var datas = dt.Rows;
//遍历表中每行数据并初始化值
foreach (DataRow data in datas)
{
try
{
AlarmHistory a = new AlarmHistory();
a.Point_Id = data["Point_Id"].ToString();
a.Description = data["Description"].ToString();
a.Priority = data["Priority"].ToString();
a.Device_Id = data["Device_Id"].ToString();
a.Gen_Time = Convert.ToDateTime(data["Gen_Time"]);
a.End_Time = Convert.ToDateTime(data["End_Time"]);
AlarmHistory.Add(a);
}
catch (Exception)
{
}
}
UpdatePageInfo(dtCount, page);
}
void LoadAlarmHistory(DataTable dt)
{
AlarmHistory.Clear();
var datas = dt.Rows;
//遍历表中每行数据并初始化值
foreach (DataRow data in datas)
{
AlarmHistory a = new AlarmHistory();
a.Point_Id = data["Point_Id"].ToString();
a.Description = data["Description"].ToString();
a.Priority = data["Priority"].ToString();
a.Device_Id = data["Device_Id"].ToString();
a.Gen_Time = Convert.ToDateTime(data["Gen_Time"]);
a.End_Time = Convert.ToDateTime(data["End_Time"]);
AlarmHistory.Add(a);
}
}
/// <summary>
/// 加载可选的搜索字段
/// </summary>
void LoadColumnName()
{
//下拉框选项填充
ColumnList.Clear();
ColumnList.Add("报警名称");
ColumnList.Add("报警信息");
ColumnList.Add("优先级");
ColumnList.Add("设备类别");
ColumnList.Add("生成时间");
ColumnList.Add("结束时间");
//列名映射
columnDic.Clear();
columnDic.Add("报警名称", "Point_Id");
columnDic.Add("报警信息", "Description");
columnDic.Add("优先级", "Priority");
columnDic.Add("设备类别", "Device_Id");
columnDic.Add("生成时间", "Gen_Time");
columnDic.Add("结束时间", "End_Time");
}
[RelayCommand]
void AlarmLevelSelectItemChanged()
{
DataTable? dt;
if (AlarmLevelSelectedIndex == 0) alarmLevel = "HIGH";
if (AlarmLevelSelectedIndex == 1) alarmLevel = "MEDIUM";
if (AlarmLevelSelectedIndex == 2) alarmLevel = "LOW";
if (string.IsNullOrEmpty(Keywords))
{
dt = SqlHelper.ExecuteTable(
"SELECT POINT_ID,DESCRIPTION,PRIORITY,DEVICE_ID,GEN_TIME,END_TIME FROM ALARM_LOG WHERE PRIORITY=@Priority",
new SqlParameter("@Priority", alarmLevel));
}
else
{
dt = SqlHelper.ExecuteTable(
"SELECT POINT_ID,DESCRIPTION,PRIORITY,DEVICE_ID,GEN_TIME,END_TIME FROM ALARM_LOG WHERE PRIORITY=@Priority AND DESCRIPTION LIKE @Keywords",
new SqlParameter("@Priority", alarmLevel),
new SqlParameter("@Keywords", $"%{Keywords}%"));//此处代表如果未填写关键词则忽略该条件
}
var datas = dt.Rows;
AlarmHistory.Clear();
//遍历表中每行数据并初始化值
foreach (DataRow data in datas)
{
try
{
AlarmHistory a = new AlarmHistory();
a.Point_Id = data["Point_Id"].ToString();
a.Description = data["Description"].ToString();
a.Priority = data["Priority"].ToString();
a.Device_Id = data["Device_Id"].ToString();
a.Gen_Time = Convert.ToDateTime(data["Gen_Time"]);
//a.Reset_Time = data["Reset_Time"].ToString();
a.End_Time = Convert.ToDateTime(data["End_Time"]);
AlarmHistory.Add(a);
}
catch
{
}
}
}
/// <summary>
/// 查询
/// </summary>
[RelayCommand]
void Query(string num)
{
b = true;
AlarmHistory.Clear();
DataTable? dt;
DataTable? dtCount;
using var context = new AppDbContext();
//int dataCount;
if (!DateStringFormat())
{
return;
}
try
{
if (!string.IsNullOrEmpty(ColumnName) && !string.IsNullOrEmpty(Keywords))
{
//dataCount = context.Set<AlarmHistory>()
// .Where(a => a.Description.Contains(Keywords) && a.End_Time >= strDateStartNew)
// .Count();
dtCount = SqlHelper.ExecuteTable(
$"SELECT * FROM ALARM_LOG WHERE DESCRIPTION like @Keywords AND END_TIME>=@StartTime AND END_TIME<@End_Time ORDER BY End_Time DESC",
new SqlParameter("@Keywords", $"%{Keywords}%"),
new SqlParameter("@StartTime", dateTimeStart),
new SqlParameter("@End_Time", dateTimeEnd)
);
dt = SqlHelper.ExecuteTable(
$"SELECT * FROM ALARM_LOG WHERE DESCRIPTION like @Keywords AND END_TIME>=@StartTime AND END_TIME<@End_Time ORDER BY End_Time DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
new SqlParameter("@Keywords", $"%{Keywords}%"),
new SqlParameter("@StartTime", dateTimeStart),
new SqlParameter("@End_Time", dateTimeEnd),
new SqlParameter("@Rows", int.Parse(num) - 1)
);
}
else
{
dtCount = SqlHelper.ExecuteTable(
$"SELECT * FROM ALARM_LOG WHERE END_TIME>=@StartTime AND End_Time<@End_Time ORDER BY End_Time DESC",
new SqlParameter("@StartTime", dateTimeStart),
new SqlParameter("@End_Time", dateTimeEnd)
);
dt = SqlHelper.ExecuteTable(
$"SELECT * FROM ALARM_LOG WHERE END_TIME>=@StartTime AND End_Time<@End_Time ORDER BY End_Time DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
new SqlParameter("@StartTime", dateTimeStart),
new SqlParameter("@End_Time", dateTimeEnd),
new SqlParameter("@Rows", int.Parse(num) - 1)
);
}
LoadAlarmHistory(dt);
UpdatePageInfo(dtCount, num);
}
catch (Exception)
{
}
}
/// <summary>
/// 重置选择
/// </summary>
[RelayCommand]
void Clear()
{
Keywords = string.Empty;
AlarmHistory.Clear();
LoadAlarmHistory(1);
}
//---------------------------------时间字符串格式化对象---------------------------------
DateTime dateTimeStart;
DateTime dateTimeEnd;
/// <summary>
/// 日期格式处理
/// </summary>
bool DateStringFormat()
{
//处理字符串格式,规范字符串类型的时间值
bool b = DateTime.TryParse($"{DateStart} {TimeStart}", out dateTimeStart);
bool b1 = DateTime.TryParse($"{DateEnd} {TimeEnd}", out dateTimeEnd);
if (!b || !b1)
{
MessageBox.Show("时间格式错误!");
return false;
}
return true;
}
//-----------------------------------------页面跳转/统计相关-----------------------------------------
//-----------------------------------------页面跳转/统计相关-----------------------------------------
/// <summary>
/// 每页条数
/// </summary>
const int countPerPage = 12;
/// <summary>
/// 总数据条数-显示文本
/// </summary>
[ObservableProperty]
string _dataCount;
/// <summary>
/// 查询后的总条数
/// </summary>
[ObservableProperty]
int _dataCountNumber;
/// <summary>
/// 总页数
/// </summary>
[ObservableProperty]
int _pageCount;
/// <summary>
/// 手动输入页数
/// </summary>
[ObservableProperty]
int _pageInput;
/// <summary>
/// 鼠标需要点击的页面跳转按钮值
/// </summary>
[ObservableProperty]
int _pageSelected;
/// <summary>
/// 要显示页码的集合
/// </summary>
[ObservableProperty]
ObservableCollection<string> _pages;
/// <summary>
/// 当前页
/// </summary>
[ObservableProperty]
int _pageCurrent;
/// <summary>
/// 当前页信息-显示文本
/// </summary>
[ObservableProperty]
string _pageInfo;
/// <summary>
/// 点击页码至指定页
/// </summary>
[RelayCommand]
void PageClick(string pageNumber)
{
JumpToPage(int.Parse(pageNumber));
//MessageBox.Show(pageNumber.ToString());
}
/// <summary>
/// 动态更新页数-下方显示具体X-X页
/// </summary>
void DynamicPage()
{
//设置最多显示5页按钮
Pages.Clear();
//总页数小于8-显示1-X页
if (PageSelected < 8)
{
for (int i = 1; i <= PageCount; i++)
{
Pages.Add(i.ToString());
}
}
//总页数大于8
else
{
//距离尾页是否多于3页
if (PageCount - PageSelected >= 3)
{
//显示当前页的前3和后3页码
if (PageCount > 7)
{
for (int i = PageSelected - 3; i <= PageSelected + 3; i++)
{
Pages.Add(i.ToString());
}
}
else//7页内显示全部
{
for (int i = 1; i <= PageCount; i++)
{
Pages.Add(i.ToString());
}
}
}
//距离尾页是否少于3页
else
{
if (PageCount - PageSelected == 2)
{
for (int i = PageSelected - 4; i <= PageCount; i++)
{
Pages.Add(i.ToString());
}
}
if (PageCount - PageSelected == 1)
{
for (int i = PageSelected - 5; i <= PageCount; i++)
{
Pages.Add(i.ToString());
}
}
if (PageCount == PageSelected)
{
for (int i = PageSelected - 6; i <= PageCount; i++)
{
Pages.Add(i.ToString());
}
}
}
}
}
/// <summary>
/// 获取数据集的总条数和页码数,更新属性
/// </summary>
/// <param name="dt">总数据条数</param>
/// <param name="pageCurrent">当前页</param>
void UpdatePageInfo(int dataCount, int pageCurrent)
{
//总数据条数
DataCountNumber = dataCount;
//文本显示
DataCount = $"共 {dataCount} 条";
//总页数
if (DataCountNumber % countPerPage == 0)
{
PageCount = DataCountNumber / countPerPage;
}
else
{
PageCount = DataCountNumber / countPerPage + 1;
}
PageCurrent = pageCurrent;
DynamicPage();
}
void UpdatePageInfo(DataTable dataCount, string pageCurrent)
{
//总数据条数
DataCountNumber = dataCount.Rows.Count;
//文本显示
DataCount = $"共 {DataCountNumber} 条";
//总页数
if (DataCountNumber % countPerPage == 0)
{
PageCount = DataCountNumber / countPerPage;
}
else
{
PageCount = DataCountNumber / countPerPage + 1;
}
PageCurrent = int.Parse(pageCurrent);
DynamicPage();
}
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
/// <summary>
/// 跳转至指定页
/// </summary>
[RelayCommand]
void JumpPageClick(string pageNumber)
{
try
{
if (int.Parse(pageNumber) > PageCount)
{
MessageBox.Show("不能超过最大页码数!");
return;
}
if (int.Parse(pageNumber) < 1)
{
MessageBox.Show("请使用正确页码数查询!");
return;
}
JumpToPage(int.Parse(pageNumber));
}
catch (Exception)
{
Log.Warning("【瞎β操作】查询历史记录时,跳转页面输入错误!");
}
}
/// <summary>
/// 前页
/// </summary>
[RelayCommand]
void PageBefore()
{
if (PageCurrent == 1) return;
PageCurrent -= 1;
JumpToPage(PageCurrent);
PageInfo = $"当前 {PageCurrent} 页";
}
/// <summary>
/// 后一页
/// </summary>
[RelayCommand]
void PageNext()
{
if (PageCurrent == PageCount) return;
PageCurrent += 1;
JumpToPage(PageCurrent);
PageInfo = $"当前 {PageCurrent} 页";
}
/// <summary>
/// 首页
/// </summary>
[RelayCommand]
void PageFirst()
{
PageCurrent = 1;
JumpToPage(PageCurrent);
PageInfo = $"当前 {PageCurrent} 页";
}
/// <summary>
/// 尾页
/// </summary>
[RelayCommand]
void PageLast()
{
if (PageCurrent == PageCount) return;
JumpToPage(PageCount);
PageInfo = $"当前 {PageCurrent} 页";
}
/// <summary>
/// 跳转到指定页
/// </summary>
/// <param name="pageNumber"></param>
void JumpToPage(int pageNumber)
{
//获取指定页数从具体第几条数据开始计数
int index = (pageNumber - 1) * 10 + 1;
if (b == false)
{
//默认数据集条件下跳转
LoadAlarmHistory(index);
}
else
{
//查询之后的数据集条件下跳转
Query(index.ToString());
}
if (pageNumber <= PageCount)
{
PageCurrent = pageNumber;
PageInfo = $"当前 {pageNumber} 页";
}
}
}
}