using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Serilog;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Threading;
using WPFWCSDemo.Common;
using WPFWCSDemo.Data;
using WPFWCSDemo.Models.Tables;
using WPFWCSDemo.StateCode;
using WPFWCSDemo.Utilities;
using WPFWCSDemo.Utilities.Table;
namespace WPFWCSDemo.ViewModels
{
public partial class AlarmViewModel : ObservableObject
{
///
/// 用于报警的定时器
///
private DispatcherTimer dispatcherTimer;
///
/// 查询操作停止刷新页面标志 true-查询操作后停止刷新 false-正常定时刷新
///
bool b;
public AlarmViewModel()
{
Alarm = new ObservableCollection();
b = false;
//AlarmInitialize();
LoadAlarm();
//Task.Run(() => AlarmMonitorAsync());
// 设置定时器属性
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(2); // 设置时间间隔1秒
dispatcherTimer.Tick += AlarmDispatcherTimer_Tick; // 添加事件处理程序
dispatcherTimer.Start(); // 启动计时器
}
static Dictionary alarms = new Dictionary();
///
/// 实时表数据
///
[ObservableProperty]
ObservableCollection _alarm;
///
/// 报警级别选中项
///
[ObservableProperty]
int _alarmLevelSelectedIndex;
///
/// 报警级别选中项
///
[ObservableProperty]
int _alarmLevelSelectedItem;
string alarmLevel;
///
/// 查询关键词
///
[ObservableProperty]
string _keywords;
private void AlarmDispatcherTimer_Tick(object? sender, EventArgs e)
{
RealTimeAlarm();
if (!b)
{
LoadAlarm();
}
}
///
/// 加载表数据
///
[RelayCommand]
void LoadAlarm()
{
using var context = new AppDbContext();
var alarms = context.Set()
.OrderBy(t => t.Gen_Time)
.ToList();
Alarm.Clear();
if (alarms is null || alarms.Count == 0) return;
foreach (var alarm in alarms)
{
Alarm.Add(alarm);
}
}
///
/// 切换优先级筛选报警
///
[RelayCommand]
void AlarmLevelSelectItemChanged()
{
Alarm.Clear();
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 FROM ALARM WHERE PRIORITY=@Priority",
new SqlParameter("@Priority", alarmLevel));
}
else
{
dt = SqlHelper.ExecuteTable(
"SELECT POINT_ID,DESCRIPTION,PRIORITY,DEVICE_ID,GEN_TIME FROM ALARM WHERE PRIORITY=@Priority AND DESCRIPTION LIKE @Keywords",
new SqlParameter("@Priority", alarmLevel),
new SqlParameter("@Keywords", $"%{Keywords}%"));//此处代表如果未填写关键词则忽略该条件
}
var datas = dt.Rows;
//遍历表中每行数据并初始化值
foreach (DataRow data in datas)
{
Alarm a = new Alarm();
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"]);
Alarm.Add(a);
}
LoadAlarm();
b = true;
}
///
/// 查询
///
[RelayCommand]
void Query()
{
Alarm.Clear();
DataTable? dt;
if (!string.IsNullOrEmpty(Keywords))
{
dt = SqlHelper.ExecuteTable(
$"SELECT * FROM ALARM WHERE DESCRIPTION like @Keywords ORDER BY Gen_Time DESC",
new SqlParameter("@Keywords", $"%{Keywords}%"));
}
else
{
dt = SqlHelper.ExecuteTable("SELECT * FROM ALARM");
}
var datas = dt.Rows;
foreach (DataRow data in datas)
{
Alarm a = new Alarm();
a.Point_Id = data["Point_Id"].ToString();
a.Description = data["Description"].ToString();
a.Priority = data["Priority"].ToString();
a.Device_Id = data["Device_Id"].ToString();
try
{
a.Gen_Time = Convert.ToDateTime(data["Gen_Time"]);
}
catch
{
}
Alarm.Add(a);
}
b = true;
}
///
/// 重置选择
///
[RelayCommand]
void Clear()
{
Keywords = string.Empty;
Alarm.Clear();
LoadAlarm();
b = false;
}
///
/// 触发报警-显示在报警表中
///
public static void RealTimeAlarm()
{
AlarmTrigger("DB622.0.2", false);
AlarmTrigger("DB622.8.1", false);
AlarmTrigger("DB622.10.1", false);
AlarmTrigger("DB622.2.2", false);
AlarmTrigger("DB622.2.3", false);
AlarmTrigger("DB622.6.1", false);
AlarmTrigger("DB622.0.1", false);
AlarmTrigger("DB622.2.1", false);
for (int i = 1; i <= RGVStation.RGVCount; i++)
{
AlarmTrigger($"DB" + (300 + i) + ".24.0", true);
AlarmTrigger($"DB" + (300 + i) + ".24.1", true);
AlarmTrigger($"DB" + (300 + i) + ".24.2", true);
AlarmTrigger($"DB" + (300 + i) + ".24.3", true);
AlarmTrigger($"DB" + (300 + i) + ".24.4", true);
AlarmTrigger($"DB" + (300 + i) + ".24.5", true);
AlarmTrigger($"DB" + (300 + i) + ".24.6", true);
AlarmTrigger($"DB" + (300 + i) + ".25.0", true);
AlarmTrigger($"DB" + (300 + i) + ".25.1", true);
AlarmTrigger($"DB" + (300 + i) + ".25.2", true);
AlarmTrigger($"DB" + (300 + i) + ".25.3", true);
AlarmTrigger($"DB" + (300 + i) + ".25.4", true);
AlarmTrigger($"DB" + (300 + i) + ".25.5", true);
AlarmTrigger($"DB" + (300 + i) + ".25.6", true);
AlarmTrigger($"DB" + (300 + i) + ".25.7", true);
}
AlarmTrigger($"DB500.1.0", true);
AlarmTrigger($"DB500.1.1", true);
AlarmTrigger($"DB500.1.2", true);
AlarmTrigger($"DB500.1.3", true);
}
///
/// 实时报警触发(读PLC地址)
///
/// 报警地址
/// 报警触发值:true-正常触发(0-正常 1-报警) false-取反触发(0-报警 1-正常)
public static void AlarmTrigger(string address, bool b)
{
try
{
//正常触发 即true-报警 false-正常
if (b)
{
if (CircleRGVsViewModel.Instance.GetStationConnection().ReadBool(address).Content)
{
int result = AlarmManager.Insert(alarms[address]);
if (result == 1 && alarms[address].Priority=="HIGH")
{
Log.Warning($"【报警信息】触发{alarms[address].Description}");
}
}
else
{
int result = AlarmManager.Delete(alarms[address]);
if (result == 1 && alarms[address].Priority == "HIGH")
{
Log.Warning($"【报警信息】{alarms[address].Description}已复位");
}
}
}
//取反触发 即true-正常 false-触发
else
{
if (!CircleRGVsViewModel.Instance.GetStationConnection().ReadBool(address).Content)
{
int result = AlarmManager.Insert(alarms[address]);
if (result == 1 && alarms[address].Priority == "HIGH")
{
Log.Warning($"【报警信息】触发{alarms[address].Description}");
}
}
else
{
int result = AlarmManager.Delete(alarms[address]);
if (result == 1 && alarms[address].Priority == "HIGH")
{
Log.Warning($"【报警信息】{alarms[address].Description}已复位");
}
}
}
}
catch (Exception)
{
}
}
///
/// 实时报警触发(自定义报警)
///
///
/// 报警触发值:true-正常触发(0-正常 1-报警) false-取反触发(0-报警 1-正常)
public void AlarmTrigger(bool b)
{
try
{
//正常触发 即true-报警 false-正常
//if (b)
//{
// if (CircleRGVsViewModel.stationConnection.ReadBool(address).Content)
// {
// int result = AlarmManager.Insert(alarms[address]);
// if (result == 1 && alarms[address].Priority == "HIGH")
// {
// Log.Warning($"【报警信息】触发{alarms[address].Description}");
// }
// }
// else
// {
// int result = AlarmManager.Delete(alarms[address]);
// if (result == 1 && alarms[address].Priority == "HIGH")
// {
// Log.Warning($"【报警信息】{alarms[address].Description}已复位");
// }
// }
//}
////取反触发 即true-正常 false-触发
//else
//{
// if (!CircleRGVsViewModel.stationConnection.ReadBool(address).Content)
// {
// int result = AlarmManager.Insert(alarms[address]);
// if (result == 1 && alarms[address].Priority == "HIGH")
// {
// Log.Warning($"【报警信息】触发{alarms[address].Description}");
// }
// }
// else
// {
// int result = AlarmManager.Delete(alarms[address]);
// if (result == 1 && alarms[address].Priority == "HIGH")
// {
// Log.Warning($"【报警信息】{alarms[address].Description}已复位");
// }
// }
//}
}
catch (Exception)
{
}
}
///
/// 将某条报警添加到集合中在表中显示,若该集合中已存在当前报警,则不执行
///
/// 报警对象
public static void AlarmInitialize()
{
alarms.Clear();
//alarms.Add("DB610.64.0", new Alarm() { Point_Id = "AlarmTest", Description = "报警功能测试", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add("DB622.0.2", new Alarm() { Point_Id = "Conv_Alarm1", Description = "无法下发任务-1001供实垛输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
alarms.Add("DB622.8.1", new Alarm() { Point_Id = "Conv_Alarm2", Description = "无法下发任务-1003供实垛/1004放空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
alarms.Add("DB622.10.1", new Alarm() { Point_Id = "Conv_Alarm3", Description = "无法下发任务-1005供实垛输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
alarms.Add("DB622.2.2", new Alarm() { Point_Id = "Conv_Alarm4", Description = "无法下发任务-1007放实垛输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
alarms.Add("DB622.2.3", new Alarm() { Point_Id = "Conv_Alarm5", Description = "无法下发任务-1008放实垛输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
alarms.Add("DB622.6.1", new Alarm() { Point_Id = "Conv_Alarm6", Description = "无法下发任务-1013供空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
alarms.Add("DB622.0.1", new Alarm() { Point_Id = "Conv_Alarm7", Description = "无法下发任务-1002放空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
//alarms.Add("DB622.8.1", new Alarm() { Point_Id = "Conv_Alarm6", Description = "无法下发任务-1004供空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
alarms.Add("DB622.2.1", new Alarm() { Point_Id = "Conv_Alarm8", Description = "无法下发任务-1006放空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" });
for (int i = 1; i <= RGVStation.RGVCount; i++)
{
alarms.Add($"DB" + (300 + i) + ".25.0", new Alarm() { Point_Id = $"RGV{i}_Alarm1", Description = $"{i}#环穿 急停触发", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".25.1", new Alarm() { Point_Id = $"RGV{i}_Alarm2", Description = $"{i}#环穿 运行变频报警", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".25.2", new Alarm() { Point_Id = $"RGV{i}_Alarm3", Description = $"{i}#环穿 输送变频报警", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".25.3", new Alarm() { Point_Id = $"RGV{i}_Alarm4", Description = $"{i}#环穿 取货超时", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".25.4", new Alarm() { Point_Id = $"RGV{i}_Alarm5", Description = $"{i}#环穿 放货超时", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".25.5", new Alarm() { Point_Id = $"RGV{i}_Alarm6", Description = $"{i}#环穿 BPS出错", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".25.6", new Alarm() { Point_Id = $"RGV{i}_Alarm7", Description = $"{i}#环穿 输送超时", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".25.7", new Alarm() { Point_Id = $"RGV{i}_Alarm8", Description = $"{i}#环穿 安全门打开", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".24.0", new Alarm() { Point_Id = $"RGV{i}_Alarm9", Description = $"{i}#环穿 输送机超界", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".24.1", new Alarm() { Point_Id = $"RGV{i}_Alarm10", Description = $"{i}#环穿 货物探测状态异常", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".24.2", new Alarm() { Point_Id = $"RGV{i}_Alarm11", Description = $"{i}#环穿 防撞触发", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".24.3", new Alarm() { Point_Id = $"RGV{i}_Alarm12", Description = $"{i}#环穿 触边保护", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".24.4", new Alarm() { Point_Id = $"RGV{i}_Alarm13", Description = $"{i}#环穿 倾斜检测触发", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".24.5", new Alarm() { Point_Id = $"RGV{i}_Alarm14", Description = $"{i}#环穿 维修小车移位", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".24.6", new Alarm() { Point_Id = $"RGV{i}_Alarm15", Description = $"{i}#环穿 卡阻标志", Device_Id = "环穿", Priority = "HIGH" });
alarms.Add($"DB" + (300 + i) + ".24.7", new Alarm() { Point_Id = $"RGV{i}_Alarm16", Description = $"{i}#环穿 安全光栅触发", Device_Id = "环穿", Priority = "HIGH" });
}
//alarms.Add($"DB500.1.0", new Alarm() { Point_Id = $"Conv_A_Alarm1", Description = $"实垛A线 下发任务超时", Device_Id = "系统", Priority = "HIGH" });
//alarms.Add($"DB500.1.1", new Alarm() { Point_Id = $"Conv_B_Alarm1", Description = $"实垛B线 下发任务超时", Device_Id = "系统", Priority = "HIGH" });
//alarms.Add($"DB500.1.2", new Alarm() { Point_Id = $"Conv_C_Alarm1", Description = $"实垛C线 下发任务超时", Device_Id = "系统", Priority = "HIGH" });
//alarms.Add($"DB500.1.3", new Alarm() { Point_Id = $"Conv_D_Alarm1", Description = $"实垛D线 下发任务超时", Device_Id = "系统", Priority = "HIGH" });
}
}
}