添加项目文件。

This commit is contained in:
Administrator
2026-06-29 14:46:32 +08:00
parent 9a9c508618
commit d9e0324b1d
175 changed files with 17983 additions and 0 deletions

View File

@@ -0,0 +1,694 @@
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} 页";
}
}
}
}

View File

@@ -0,0 +1,455 @@
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
{
/// <summary>
/// 用于报警的定时器
/// </summary>
private DispatcherTimer dispatcherTimer;
/// <summary>
/// 查询操作停止刷新页面标志 true-查询操作后停止刷新 false-正常定时刷新
/// </summary>
bool b;
public AlarmViewModel()
{
Alarm = new ObservableCollection<Alarm>();
b = false;
//AlarmInitialize();
LoadAlarm();
//Task.Run(() => AlarmMonitorAsync());
// 设置定时器属性
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(2); // 设置时间间隔1秒
dispatcherTimer.Tick += AlarmDispatcherTimer_Tick; // 添加事件处理程序
dispatcherTimer.Start(); // 启动计时器
}
static Dictionary<string, Alarm> alarms = new Dictionary<string, Alarm>();
/// <summary>
/// 实时表数据
/// </summary>
[ObservableProperty]
ObservableCollection<Alarm> _alarm;
/// <summary>
/// 报警级别选中项
/// </summary>
[ObservableProperty]
int _alarmLevelSelectedIndex;
/// <summary>
/// 报警级别选中项
/// </summary>
[ObservableProperty]
int _alarmLevelSelectedItem;
string alarmLevel;
/// <summary>
/// 查询关键词
/// </summary>
[ObservableProperty]
string _keywords;
private void AlarmDispatcherTimer_Tick(object? sender, EventArgs e)
{
RealTimeAlarm();
if (!b)
{
LoadAlarm();
}
}
/// <summary>
/// 加载表数据
/// </summary>
[RelayCommand]
void LoadAlarm()
{
using var context = new AppDbContext();
var alarms = context.Set<Alarm>()
.OrderBy(t => t.Gen_Time)
.ToList();
Alarm.Clear();
if (alarms is null || alarms.Count == 0) return;
foreach (var alarm in alarms)
{
Alarm.Add(alarm);
}
}
/// <summary>
/// 切换优先级筛选报警
/// </summary>
[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;
}
/// <summary>
/// 查询
/// </summary>
[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;
}
/// <summary>
/// 重置选择
/// </summary>
[RelayCommand]
void Clear()
{
Keywords = string.Empty;
Alarm.Clear();
LoadAlarm();
b = false;
}
/// <summary>
/// 触发报警-显示在报警表中
/// </summary>
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);
}
/// <summary>
/// 实时报警触发(读PLC地址)
/// </summary>
/// <param name="address">报警地址</param>
/// <param name="b">报警触发值:true-正常触发(0-正常 1-报警) false-取反触发(0-报警 1-正常)</param>
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)
{
}
}
/// <summary>
/// 实时报警触发(自定义报警)
/// </summary>
/// <param name="address"></param>
/// <param name="b">报警触发值:true-正常触发(0-正常 1-报警) false-取反触发(0-报警 1-正常)</param>
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)
{
}
}
/// <summary>
/// 将某条报警添加到集合中在表中显示,若该集合中已存在当前报警,则不执行
/// </summary>
/// <param name="alarm">报警对象</param>
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" });
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,16 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace WPFWCSDemo.ViewModels
{
public partial class ControllerViewModel:ObservableObject
{
}
}

View File

@@ -0,0 +1,75 @@
using HslCommunication;
using HslCommunication.Profinet.Siemens;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using WPFWCSDemo.Models.Devices.CircleRGV;
using WPFWCSDemo.Models.Devices.Conv;
using WPFWCSDemo.Models.Devices.Conv.ConvGet;
using WPFWCSDemo.Models.Devices.Conv.ConvPut;
namespace WPFWCSDemo.ViewModels
{
public class ConvsViewModel
{
public static SiemensS7Net? convConnection;
public static string ip;
public static void InitializeConv()
{
ip = "192.168.10.5";
convConnection = new SiemensS7Net(SiemensPLCS.S1500, ip);
//设置连接超时时间
convConnection.ConnectTimeOut = 2000;
OperateResult result = convConnection.ConnectServer();
if (result.IsSuccess)
{
Log.Warning($"输送机初始化连接成功!");
return;
}
else
{
Log.Warning($"输送机初始化连接失败,{result.Message},错误代码:ConvData0001");
}
}
/// <summary>
/// 输送机plc连接
/// </summary>
/// <returns>1--正常 -1--失败 0-未知异常</returns>
public static int PlcConnect()
{
if (convConnection is null)
{
convConnection = new SiemensS7Net(SiemensPLCS.S1500, ip);
}
try
{
convConnection.ConnectServer();
//Log.Warning($"输送机连接成功");
return 1;
}
catch (Exception e)
{
Log.Warning($"输送机连接失败,{e.Message},错误代码:ConvData0002");
return -1;
}
}
}
}

View File

@@ -0,0 +1,72 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace WPFWCSDemo.ViewModels.CustomComponent
{
public partial class InputDialogViewModel : ObservableObject
{
public InputDialogViewModel(Window window,Action<string> action)
{
Caption = "验证";
InputDialog = window;
_task = action;
}
/// <summary>
/// 标题
/// </summary>
[ObservableProperty]
string _caption;
/// <summary>
/// 内容
/// </summary>
[ObservableProperty]
string _content;
/// <summary>
/// 当前页面
/// </summary>
[ObservableProperty]
Window _inputDialog;
[ObservableProperty]
Action<string>? _task;
/// <summary>
/// 关闭窗口
/// </summary>
/// <param name="window"></param>
[RelayCommand]
void Cancel(Window window)
{
window.Close();
}
/// <summary>
/// 输入密码
/// </summary>
[RelayCommand]
void Accept(string taskId)
{
if (Content == "472")
{
MessageBox.Show("密码正确");
//Task.Invoke(taskId);
}
else
{
MessageBox.Show("密码错误");
}
}
}
}

View File

@@ -0,0 +1,71 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WPFWCSDemo.Views;
namespace WPFWCSDemo.ViewModels.CustomComponent
{
public partial class MessageDialogViewModel:ObservableObject
{
public MessageDialogViewModel(Window window)
{
Caption = "消息";
Content = "关闭该系统可能导致执行中的任务中断,是否确认要退出程序?";
MessageDialog = window;
}
/// <summary>
/// 标题
/// </summary>
[ObservableProperty]
string _caption;
/// <summary>
/// 内容
/// </summary>
[ObservableProperty]
string _content;
/// <summary>
/// 当前页面
/// </summary>
[ObservableProperty]
Window _messageDialog;
/// <summary>
/// 关闭窗口
/// </summary>
/// <param name="window"></param>
[RelayCommand]
void Cancel(Window window)
{
window.Close();
}
/// <summary>
/// 终止程序
/// </summary>
[RelayCommand]
void Accept()
{
Application.Current.Shutdown();
}
public void GetMessageInfo(string content)
{
Caption = "消息";
Content = content;
}
public void GetMessageInfo(string caption,string content)
{
Caption = caption;
Content = content;
}
}
}

View File

@@ -0,0 +1,566 @@
using CommunityToolkit.Mvvm.ComponentModel;
using LiveCharts.Wpf;
using LiveCharts;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPFWCSDemo.Models;
using System.Threading;
using WPFWCSDemo.Utilities.Table;
using System.Data;
using WPFWCSDemo.Utilities;
using WPFWCSDemo.StateCode;
using System.Windows;
using System.ComponentModel;
using System.Windows.Threading;
using WPFWCSDemo.Models.Tables;
using WPFWCSDemo.Models.Devices.CircleRGV;
using System.Windows.Media;
namespace WPFWCSDemo.ViewModels
{
public partial class DataInfoViewModel : ObservableObject
{
/// <summary>
/// 用于监控环穿参数面板的定时器
/// </summary>
private DispatcherTimer dispatcherTimer;
public DataInfoViewModel()
{
//传递frame控件用于顶部面板点击事件跳转
//_navigationFrame = navigationFrame;
TaskBars = new ObservableCollection<DataInfoTaskbar>();
Tasks = new ObservableCollection<DataInfoTaskAsc>();
RowSeriesTitles = new string[13];
RowSeriesCollection = new SeriesCollection(new Series[13]);
RowValues = new ChartValues<double>(new double[13]);
PieSeriesCollection = new SeriesCollection();
PieValuesCount = new ChartValues<int>(new int[4]);
LineValuesCount = new ChartValues<int>(new int[4]);
LineValuesPallets = new ChartValues<int>(new int[7]);
LineValuesGoods = new ChartValues<int>(new int[7]);
CreateTaskBars();
TaskAscRecord();
Data_TaskBar();
Data_TaskRecord();
GetPie();
GetRowsInitialize();
GetLineCountOfWeek();
GetLineOfTaskCompare();
//Task.Run(() => DataMonitorAsync());
// 设置定时器属性
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(2); // 设置时间间隔为1秒
dispatcherTimer.Tick += DispatcherTimer_Tick; // 添加事件处理程序
dispatcherTimer.Start(); // 启动计时器
//MessageBox.Show(GetDate(0));
}
public async Task DataMonitorAsync()
{
while (true)
{
Application.Current.Dispatcher.Invoke(() =>
{
Data_TaskBar();
TaskAscRecord();
Data_TaskRecord();
GetLineCountOfWeek();
GetLineOfTaskCompare();
});
await Task.Delay(1000);
}
}
private void DispatcherTimer_Tick(object? sender, EventArgs e)
{
Data_TaskBar();
TaskAscRecord();
Data_TaskRecord();
GetLineCountOfWeek();
GetLineOfTaskCompare();
GetRows();
//GetRowsInitialize();
}
/// <summary>
/// 执行中任务动态转圈元素显示
/// </summary>
[ObservableProperty]
Visibility _taskExecutingProgressIsVisible;
/// <summary>
/// 报警动态转圈元素显示
/// </summary>
[ObservableProperty]
Visibility _alarmProgressIsVisible;
/// <summary>
/// 上方任务面板对象
/// </summary>
[ObservableProperty]
ObservableCollection<DataInfoTaskbar> _taskBars;
/// <summary>
/// 顶部参数面板属性
/// </summary>
void CreateTaskBars()
{
TaskBars.Add(new DataInfoTaskbar() { Icon = "FormatListBulleted", Title = "待执行", Content = 0, Color = "#FF0CA0FF", Target = "Task" });
TaskBars.Add(new DataInfoTaskbar() { Icon = "Reload", Title = "执行中", Content = 0, Color = "#FF1ECA3A", Target = "Task" });
TaskBars.Add(new DataInfoTaskbar() { Icon = "ClockCheckOutLine", Title = "今日已完成", Content = 0, Color = "#FF02C6DC", Target = "TaskHistory" });
TaskBars.Add(new DataInfoTaskbar() { Icon = "AlarmLightOutline", Title = "实时报警", Content = 0, Color = "Tomato", Target = "Alarm" });//"#FFFFA000"
}
/// <summary>
/// 数据展示1---顶部参数面板数据
/// </summary>
void Data_TaskBar()
{
using DataTable? dt = SqlHelper.ExecuteTable("SELECT COUNT(TASKID) FROM TASK WHERE TASKSTATE=@TaskState UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK WHERE TASKSTATE=@TaskState1 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=@TaskState2 OR TASKSTATE=@TaskState3 OR TASKSTATE=@TaskState4) AND FINISHTIME>=@FinishTime UNION ALL " +
"SELECT COUNT(*) FROM ALARM",
new System.Data.SqlClient.SqlParameter("@TaskState", TaskStateCode.Task_Ready),
new System.Data.SqlClient.SqlParameter("@TaskState1", TaskStateCode.Task_Running),
new System.Data.SqlClient.SqlParameter("@FinishTime", $"{DateTime.Now.Date}"),
new System.Data.SqlClient.SqlParameter("@TaskState2", TaskStateCode.Task_Finish),
new System.Data.SqlClient.SqlParameter("@TaskState3", TaskStateCode.Task_Finish_Manual),
new System.Data.SqlClient.SqlParameter("@TaskState4", TaskStateCode.Task_Finish_Timeout)
);
if (dt == null) return;
TaskBars[0].Content = (int)dt.Rows[0][0];//待执行
TaskBars[1].Content = (int)dt.Rows[1][0];//执行中
TaskBars[2].Content = (int)dt.Rows[2][0];//当日已完成
TaskBars[3].Content = (int)dt.Rows[3][0];//报警
//值为0---面板显示灰色,否则其他颜色
TaskBars[0].Color = (int)dt.Rows[0][0] > 0 ? "Teal" : "DarkGray";
TaskBars[1].Color = (int)dt.Rows[1][0] > 0 ? "#FF1ECA3A" : "DarkGray";
TaskBars[2].Color = (int)dt.Rows[2][0] > 0 ? "#FF02C6DC" : "DarkGray";
TaskBars[3].Color = (int)dt.Rows[3][0] > 0 ? "OrangeRed" : "DarkGray";
AlarmProgressIsVisible = (int)dt.Rows[3][0] > 0 ? Visibility.Visible : Visibility.Hidden;
TaskExecutingProgressIsVisible = (int)dt.Rows[1][0] > 0 ? Visibility.Visible : Visibility.Hidden;
}
[ObservableProperty]
ObservableCollection<DataInfoTaskAsc> _tasks;
/// <summary>
/// 部分执行中任务展示面板
/// </summary>
void TaskAscRecord()
{
Tasks.Clear();
Tasks.Add(new DataInfoTaskAsc() { JobId = string.Empty, TaskId = string.Empty, TaskType = 0, ScheduleState = string.Empty, SourceLocation = string.Empty, TargetLocation = string.Empty });
Tasks.Add(new DataInfoTaskAsc() { JobId = string.Empty, TaskId = string.Empty, TaskType = 0, ScheduleState = string.Empty, SourceLocation = string.Empty, TargetLocation = string.Empty });
Tasks.Add(new DataInfoTaskAsc() { JobId = string.Empty, TaskId = string.Empty, TaskType = 0, ScheduleState = string.Empty, SourceLocation = string.Empty, TargetLocation = string.Empty });
}
/// <summary>
/// 数据展示2---获取日期最早的3条任务
/// </summary>
public void Data_TaskRecord()
{
using DataTable? dt = SqlHelper.ExecuteTable("SELECT TOP 3 * FROM TASK ORDER BY CREATETIME ASC");
if (dt == null) return;
if (dt.Rows.Count == 0) return;
//任务1
using TaskRT? taskRT = TaskManager.ToModels(dt.Rows[0]);
Tasks[0].JobId = taskRT.JobId;
Tasks[0].TaskId = taskRT.TaskId.ToString();
Tasks[0].TaskType = taskRT.TaskType;
Tasks[0].ScheduleState = taskRT.ScheduleState;
Tasks[0].SourceLocation = taskRT.SourceLocation;
Tasks[0].TargetLocation = taskRT.TargetLocation;
if (dt.Rows.Count == 1) return;
//任务2
using TaskRT? taskRT1 = TaskManager.ToModels(dt.Rows[1]);
Tasks[1].JobId = taskRT1.JobId;
Tasks[1].TaskId = taskRT1.TaskId.ToString();
Tasks[1].TaskType = taskRT1.TaskType;
Tasks[1].ScheduleState = taskRT1.ScheduleState;
Tasks[1].SourceLocation = taskRT1.SourceLocation;
Tasks[1].TargetLocation = taskRT1.TargetLocation;
if (dt.Rows.Count == 2) return;
//任务3
using TaskRT? taskRT2 = TaskManager.ToModels(dt.Rows[2]);
Tasks[2].JobId = taskRT2.JobId;
Tasks[2].TaskId = taskRT2.TaskId.ToString();
Tasks[2].TaskType = taskRT2.TaskType;
Tasks[2].ScheduleState = taskRT2.ScheduleState;
Tasks[2].SourceLocation = taskRT2.SourceLocation;
Tasks[2].TargetLocation = taskRT2.TargetLocation;
}
/// <summary>
/// 饼图数据集合
/// </summary>
[ObservableProperty]
SeriesCollection _pieSeriesCollection;
/// <summary>
/// 数据集合值
/// </summary>
[ObservableProperty]
double[] pieValues = new double[4];
//设备使用次数
[ObservableProperty]
ChartValues<int> _pieValuesCount;
string[] s = new string[] { "1009线", "1010线", "1011线", "1012线" };
int[] dValuesPie = new int[4];
/// <summary>
/// 数据展示4---饼图面板
/// </summary>
private void GetPie()
{
using DataTable? dt = SqlHelper.ExecuteTable(
"SELECT COUNT(SOURCELOCATION) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TARGETLOCATION='1009' AND FINISHTIME>=@FinishTime UNION ALL " +
"SELECT COUNT(SOURCELOCATION) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TARGETLOCATION='1010' AND FINISHTIME>=@FinishTime UNION ALL " +
"SELECT COUNT(SOURCELOCATION) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TARGETLOCATION='1011' AND FINISHTIME>=@FinishTime UNION ALL " +
"SELECT COUNT(SOURCELOCATION) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TARGETLOCATION='1012' AND FINISHTIME>=@FinishTime ",
new System.Data.SqlClient.SqlParameter("@FinishTime", DateTime.Now.AddDays(-7).ToString(TimeFormat.stringFormatDateOnly)));
//int[] dValues = new int[]
//{
// (int)dt.Rows[0][0],
// (int)dt.Rows[1][0],
// (int)dt.Rows[2][0],
// (int)dt.Rows[3][0]
//};
for (int i = 0; i < dValuesPie.Length; i++)
{
dValuesPie[i] = (int)dt.Rows[i][0];
}
//前台数据赋值
for (int i = 0; i < dValuesPie.Length; i++)
{
PieValuesCount[i] = dValuesPie[i];
}
//PieSeriesCollection = new SeriesCollection();
//int[] pieValues = new int[] { 25, 36, 85, 45, 69, 45, 85, 33, 79 };
PieSeriesCollection.Clear();
for (int i = 0; i < PieValues.Length; i++)
{
PieSeriesCollection.Add(new PieSeries
{
Title = s[i],
Values = new ChartValues<int> { PieValuesCount[i] },
DataLabels = false,
});
}
}
/// <summary>
/// 图形数据集合
/// </summary>
[ObservableProperty]
SeriesCollection _rowSeriesCollection;
/// <summary>
/// 运行里程集合
/// </summary>
[ObservableProperty]
ChartValues<double> _rowValues;
List<Brush> brushes = new List<Brush>()
{
Brushes.DarkGreen,
Brushes.Salmon,
Brushes.MediumSpringGreen,
Brushes.SlateBlue,
Brushes.Purple,
Brushes.LightPink,
Brushes.Firebrick,
Brushes.DarkOrange,
Brushes.DeepSkyBlue,
Brushes.Yellow,
Brushes.Blue,
Brushes.OliveDrab,
Brushes.Tan,
};
/// <summary>
/// 标题集合
/// </summary>
[ObservableProperty]
string[] _rowSeriesTitles;
/// <summary>
/// 里程统计条形图初始化
/// </summary>
private void GetRowsInitialize()
{
List<CircleRGVState> states = CircleRGVsViewModel.GetAllCircleRGVState();
if (states == null) return;
RowSeriesCollection.Clear();
//前台数据赋值
for (int i = 0; i < states.Count; i++)
{
RowValues[i] = states[i].Read_Mileage;
RowSeriesTitles[i] = ($"{i + 1}#环穿");
}
RowSeriesCollection = new SeriesCollection
{
new RowSeries()
{
Title = "运行里程(km):",
Values = RowValues,
RowPadding = 10,
MinHeight = 30,
Foreground = Brushes.Gray,
Fill=Brushes.Transparent,
DataLabels = true,
Configuration=new LiveCharts.Configurations.CartesianMapper<double>()
.Y((value,index)=>index)
.X(value=>value)
.Fill((value, index) => brushes[index])
}
};
//for (int i = 0; i < RowSeriesTitles.Length; i++)
//{
//RowSeriesCollection.Add(new RowSeries()
//{
// Title = RowSeriesTitles[i],
// Values = new ChartValues<double> { RowValues[i] },
// RowPadding = 10,
// MinHeight = 30,
//});
//}
}
private void GetRows()
{
List<CircleRGVState> states = CircleRGVsViewModel.GetAllCircleRGVState();
if (states == null) return;
//前台数据赋值
for (int i = 0; i < states.Count; i++)
{
RowValues[i] = states[i].Read_Mileage;
//RowSeriesTitles[i] = ($"{i + 1}#环穿");
}
}
[ObservableProperty]
string[] lineLabels = new[] { "第一周", "第二周", "第三周", "第四周" };
[ObservableProperty]
ChartValues<int> lineValuesCount;
int[] dValuesWeekLine = new int[4];
/// <summary>
/// 数据展示3---曲线图面板1---月内(每周)任务数量
/// </summary>
private void GetLineCountOfWeek()
{
//X轴---日期
//LineLabels = new[] { "第一周", "第二周", "第三周", "第四周" };
using DataTable? dt = SqlHelper.ExecuteTable(
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND FINISHTIME>=@FinishTime1 AND FINISHTIME<@FinishTime UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND FINISHTIME>=@FinishTime2 AND FINISHTIME<@FinishTime1 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND FINISHTIME>=@FinishTime3 AND FINISHTIME<@FinishTime2 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND FINISHTIME>=@FinishTime4 AND FINISHTIME<@FinishTime3 "
,
new System.Data.SqlClient.SqlParameter("@FinishTime", $"{DateTime.Now.AddMonths(1).ToString("yyyy-MM")}-01"),
new System.Data.SqlClient.SqlParameter("@FinishTime1", $"{DateTime.Now.ToString("yyyy-MM")}-22"),
new System.Data.SqlClient.SqlParameter("@FinishTime2", $"{DateTime.Now.ToString("yyyy-MM")}-15"),
new System.Data.SqlClient.SqlParameter("@FinishTime3", $"{DateTime.Now.ToString("yyyy-MM")}-08"),
new System.Data.SqlClient.SqlParameter("@FinishTime4", $"{DateTime.Now.ToString("yyyy-MM")}-01")
);
//当日任务量
for (int i = 0; i < dValuesWeekLine.Length; i++)
{
dValuesWeekLine[i] = (int)dt.Rows[3 - i][0];
}
//LineValuesCount.Clear();
for (int i = 0; i < dValuesWeekLine.Length; i++)
{
//LineValuesCount.Add(dValues[i]);
LineValuesCount[i] = dValuesWeekLine[i];
}
}
[ObservableProperty]
string[] lineLabels1;
/// <summary>
/// 空托任务曲线集合初始化
/// </summary>
[ObservableProperty]
ChartValues<int> lineValuesPallets;
/// <summary>
/// 实垛任务曲线集合初始化
/// </summary>
[ObservableProperty]
ChartValues<int> lineValuesGoods;
int[] dValuesTask = new int[7];
int[] dValuesTask1 = new int[7];
/// <summary>
/// 数据展示5---曲线图面板2---当日各类型任务数量
/// </summary>
private void GetLineOfTaskCompare()
{
LineLabels1 = new[] { GetDate(-6), GetDate(-5), GetDate(-4), GetDate(-3), GetDate(-2), GetDate(-1), GetDate(0) };
using DataTable? dt = SqlHelper.ExecuteTable(
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType AND FINISHTIME>@FinishTime1 AND FINISHTIME<@FinishTime UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType AND FINISHTIME>@FinishTime2 AND FINISHTIME<@FinishTime1 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType AND FINISHTIME>@FinishTime3 AND FINISHTIME<@FinishTime2 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType AND FINISHTIME>@FinishTime4 AND FINISHTIME<@FinishTime3 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType AND FINISHTIME>@FinishTime5 AND FINISHTIME<@FinishTime4 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType AND FINISHTIME>@FinishTime6 AND FINISHTIME<@FinishTime5 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType AND FINISHTIME>@FinishTime7 AND FINISHTIME<@FinishTime6 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType1 AND FINISHTIME>@FinishTime1 AND FINISHTIME<@FinishTime UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType1 AND FINISHTIME>@FinishTime2 AND FINISHTIME<@FinishTime1 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType1 AND FINISHTIME>@FinishTime3 AND FINISHTIME<@FinishTime2 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType1 AND FINISHTIME>@FinishTime4 AND FINISHTIME<@FinishTime3 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType1 AND FINISHTIME>@FinishTime5 AND FINISHTIME<@FinishTime4 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType1 AND FINISHTIME>@FinishTime6 AND FINISHTIME<@FinishTime5 UNION ALL " +
"SELECT COUNT(TASKID) FROM TASK_HISTORY WHERE (TASKSTATE=102 OR TASKSTATE=103 OR TASKSTATE=106) AND TASKTYPE LIKE @TaskType1 AND FINISHTIME>@FinishTime7 AND FINISHTIME<@FinishTime6",
new System.Data.SqlClient.SqlParameter("@TaskType", "10%"),
new System.Data.SqlClient.SqlParameter("@TaskType1", "11%"),
new System.Data.SqlClient.SqlParameter("@FinishTime", GetDate(1)),
new System.Data.SqlClient.SqlParameter("@FinishTime1", GetDate(0)),
new System.Data.SqlClient.SqlParameter("@FinishTime2", GetDate(-1)),
new System.Data.SqlClient.SqlParameter("@FinishTime3", GetDate(-2)),
new System.Data.SqlClient.SqlParameter("@FinishTime4", GetDate(-3)),
new System.Data.SqlClient.SqlParameter("@FinishTime5", GetDate(-4)),
new System.Data.SqlClient.SqlParameter("@FinishTime6", GetDate(-5)),
new System.Data.SqlClient.SqlParameter("@FinishTime7", GetDate(-6))
);
//各类型任务数据
for (int i = 0; i < dValuesTask.Length; i++)
{
dValuesTask[i] = (int)dt.Rows[6 - i][0];
}
for (int i = 0; i < dValuesTask.Length; i++)
{
//LineValuesStockIn.Add(dValues[i]);
LineValuesPallets[i] = dValuesTask[i];
}
//重置数据
for (int i = 0; i < dValuesTask1.Length; i++)
{
dValuesTask1[i] = (int)dt.Rows[6 + 7 - i][0];
}
for (int i = 0; i < dValuesTask1.Length; i++)
{
//LineValuesStockOut.Add(dValues2[i]);
LineValuesGoods[i] = dValuesTask1[i];
}
}
/// <summary>
/// 获取时间字符串
/// </summary>
/// <param name="i">以当天为准偏移i天</param>
/// <returns>偏移天数</returns>
string GetDate(int i)
{
return DateTime.Now.AddDays(i).ToString(TimeFormat.stringFormatDateOnly);
}
}
}

View File

@@ -0,0 +1,772 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Serilog;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
using WPFWCSDemo.Common;
using WPFWCSDemo.Data;
using WPFWCSDemo.Models.Devices.CircleRGVStation;
using WPFWCSDemo.Models.Tables;
using WPFWCSDemo.StateCode;
using WPFWCSDemo.Utilities;
using WPFWCSDemo.Utilities.Table;
using WPFWCSDemo.Views.CustomComponent;
namespace WPFWCSDemo.ViewModels.DbViews
{
public partial class TaskDbViewModel : ObservableObject
{
/// <summary>
/// 用于实时更新任务表的定时器
/// </summary>
private DispatcherTimer dispatcherTimer;
public TaskDbViewModel()
{
TaskView = new ObservableCollection<TaskView>();
ColumnList = new List<string>();
col = new Dictionary<string, string>();
SourceLocations = new List<int>();
TargetLocations = new List<int>();
RGVNumbers = new List<int>();
LoadTaskGrid();
LoadColumns();
LocationInitialize();
//Task.Run(() => LoadTaskGridAsync());
b = true;
// 设置定时器属性
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(5); // 设置时间间隔
dispatcherTimer.Tick += DispatcherTimer_Tick; // 添加事件处理程序
dispatcherTimer.Start(); // 启动计时器
}
//调度任务表刷新参数
private void DispatcherTimer_Tick(object? sender, EventArgs e)
{
if (b)
{
LoadTaskGrid();
}
}
/// <summary>
/// 是否更新任务表的标志
/// </summary>
bool b;
/// <summary>
/// 调度任务字段---原数据/视图数据
/// </summary>
[ObservableProperty]
ObservableCollection<TaskView> _taskView;
/// <summary>
/// 搜索关键字
/// </summary>
[ObservableProperty]
string? _keywords;
/// <summary>
/// 筛选列表集合
/// </summary>
[ObservableProperty]
List<string> _columnList;
/// <summary>
/// 筛选列表集合对应的查询字段
/// </summary>
Dictionary<string, string> col;
/// <summary>
/// 筛选列表文本
/// </summary>
[ObservableProperty]
string? _columnName;
/// <summary>
/// 筛选列表文本选择项
/// </summary>
[ObservableProperty]
string? _columnNameSelected;
/// <summary>
/// 筛选列表选项
/// </summary>
[ObservableProperty]
int _taskTypeSelectedIndex;
/// <summary>
/// 右侧对话框弹出属性
/// </summary>
[ObservableProperty]
bool _isRightDrawerOpen;
/// <summary>
/// 顶部对话框弹出属性
/// </summary>
[ObservableProperty]
bool _isTopDrawerOpen;
/// <summary>
/// 站点初始化集合
/// </summary>
[ObservableProperty]
int _rowCount;
[ObservableProperty]
int _columnCount;
[ObservableProperty]
int _floorCount;
[ObservableProperty]
List<int> _rows;
[ObservableProperty]
List<int> _columns;
[ObservableProperty]
List<int> _floors;
/// <summary>
/// 取放货站点集合
/// </summary>
[ObservableProperty]
List<int> _sourceLocations;
[ObservableProperty]
List<int> _targetLocations;
/// <summary>
/// 测试下发界面任务类型
/// </summary>
[ObservableProperty]
int _testingTaskTypeIndex;
/// <summary>
/// 任务类型
/// </summary>
[ObservableProperty]
int _selectedTaskTypeIndex;
/// <summary>
/// 输入托盘号
/// </summary>
[ObservableProperty]
string _inputTaskId;
/// <summary>
/// 取货站点
/// </summary>
[ObservableProperty]
int _selectedSourceLocation;
/// <summary>
/// 放货站点
/// </summary>
[ObservableProperty]
int _selectedTargetLocation;
/// <summary>
/// 小车编号集合
/// </summary>
[ObservableProperty]
List<int> _rGVNumbers;
/// <summary>
/// 选中小车编号
/// </summary>
[ObservableProperty]
int _selectedRGVNumber;
/// <summary>
/// 右侧对话框弹出命令
/// </summary>
[RelayCommand]
private void NewTask()
{
IsRightDrawerOpen = true;
}
/// <summary>
/// 顶部对话框弹出命令---堆垛机测试
/// </summary>
[RelayCommand]
private void StackerTesting()
{
IsTopDrawerOpen = true;
}
/// <summary>
/// 更改任务类型选项直接更新表
/// </summary>
//[RelayCommand]
void TaskTypeSelectItemChanged()
{
//------------------------------------------------------------------视图-----------------------------------------------------------------
//------------------------------------------------------------------视图-----------------------------------------------------------------
//------------------------------------------------------------------视图-----------------------------------------------------------------
DataTable? dtView;
if (TaskTypeSelectedIndex == 1)
{
dtView = SqlHelper.ExecuteTable("SELECT * FROM TASK_VIEW WHERE 任务类型 LIKE @TaskType ORDER BY 生成时间 DESC",
new SqlParameter("@TaskType", TaskTypeSelectedIndex + "%"));
}
else if (TaskTypeSelectedIndex == 2)
{
dtView = SqlHelper.ExecuteTable("SELECT * FROM TASK_VIEW WHERE 任务类型<>@TaskType ORDER BY 生成时间 DESC",
new SqlParameter("@TaskType", 1));
}
else
{
dtView = SqlHelper.ExecuteTable("SELECT * FROM TASK_VIEW ORDER BY 生成时间 DESC");
}
//获取查询语句对应的数据表DataTable
var dataViews = dtView.Rows;
TaskView.Clear();
//遍历表中每行数据并初始化值
foreach (DataRow data in dataViews)
{
TaskView taskView = new TaskView();
taskView.JobId = data["环穿编号"].ToString();
taskView.TaskId = data["任务号"].ToString();
//taskView.PalletId = data["PalletId"].ToString();
taskView.SourceLocation = data["源站点"].ToString();
taskView.TargetLocation = data["目标站点"].ToString();
taskView.TaskType = data["任务类型"].ToString();
taskView.TaskState = data["任务状态"].ToString();
taskView.ScheduleState = data["调度状态"].ToString();
taskView.CreateTime = Convert.ToDateTime(data["生成时间"]);
taskView.ScheduleTime = Convert.ToDateTime(data["调度时间"]);
taskView.ReportState = data["取货状态"].ToString();
TaskView.Add(taskView);
}
}
/// <summary>
/// 查询任务
/// </summary>
[RelayCommand]
public void Query()
{
//关键词不为空且列名不为空
if (!string.IsNullOrEmpty(Keywords) && !string.IsNullOrEmpty(ColumnName))
{
using var context = new AppDbContext();
var tasks = context.Set<TaskView>()
.FromSqlInterpolated($"SELECT * FROM TASK_VIEW WHERE {col[ColumnName]} LIKE %{Keywords}% ORDER BY 生成时间 DESC")
.ToList();
TaskView.Clear();
//遍历表中每行数据并初始化值
foreach (TaskView task in tasks)
{
TaskView.Add(task);
}
}
else
{
LoadTaskGrid();
}
b = false;
}
/// <summary>
/// 重置筛选项
/// </summary>
[RelayCommand]
void Clear()
{
Keywords = string.Empty;
ColumnName = string.Empty;
LoadTaskGrid();
b = true;
}
#region 添加新任务相关
// 下拉框获取值属性 (源/目标排、列、层)
/// <summary>
/// 点击新建任务按钮命令
/// </summary>
[RelayCommand]
public void AddTask()
{
InputCheck();
//MessageBox.Show(SelectedTaskType);
//获取任务参数值
TaskRT taskRT = new TaskRT
{
TaskId = SqlHelper.GetTaskIdByManualGeneration().ToString(),//使用int类型初始值不是空 指定9起始的任务号为人工操作标识
SourceLocation = SelectedSourceLocation.ToString(),
TargetLocation = SelectedTargetLocation.ToString(),
ScheduleState = ScheduleStateCode.Trans_CircleRGV_Ready,
TaskState = TaskStateCode.Task_Running,
CreateTime = DateTime.Now,
//ReportState = 0
};
//任务校验和添加新任务(区分任务类型)
if (SelectedTaskTypeIndex == 0)
{
taskRT.TaskType = 10;
}
else if (SelectedTaskTypeIndex == 1)
{
taskRT.TaskType = 11;
}
else if (SelectedTaskTypeIndex == 2 || SelectedTaskTypeIndex == 3)
{
taskRT.TaskType = SelectedTaskTypeIndex;
}
else
{
MessageBox.Show("任务类型错误!");
return;
}
Insert(taskRT, taskRT.TaskType);
SqlHelper.NewEventLog($"手动下发调度任务:任务号:{taskRT.TaskId}", "USER");
//重载任务表
LoadTaskGrid();
}
#endregion
/// <summary>
/// 加载下拉框内容
/// </summary>
public void LoadColumns()
{
ColumnList.Clear();
//ColumnList.Add("作业号");
ColumnList.Add("任务号");
//ColumnList.Add("托盘号");
ColumnList.Add("任务类型");
ColumnList.Add("源站点");
ColumnList.Add("目标站点");
ColumnList.Add("任务状态");
//ColumnList.Add("生成时间");
col.Clear();
//col.Add("作业号", "JobId");
col.Add("任务号", "任务号");
//col.Add("托盘号", "PalletId");
col.Add("任务类型", "任务类型");
col.Add("源站点", "源站点");
col.Add("目标站点", "目标站点");
col.Add("任务状态", "任务状态");
//col.Add("生成时间", "CreateTime");
RGVNumbers.Clear();
for (int i = 0; i < RGVStation.RGVCount; i++)
{
RGVNumbers.Add(i);
}
}
/// <summary>
/// 加载表格内容
/// </summary>
public void LoadTaskGrid()
{
//-------------------------------------------------------------------------视图----------------------------------------------------------------------
//-------------------------------------------------------------------------视图----------------------------------------------------------------------
//-------------------------------------------------------------------------视图----------------------------------------------------------------------
using var context = new AppDbContext();
var tasks = context.Set<TaskView>()
.OrderByDescending(t => t.CreateTime)
.ToList();
TaskView.Clear();
//遍历表中每行数据并初始化值
foreach (TaskView task in tasks)
{
TaskView.Add(task);
}
}
/// <summary>
/// 向调度表中插入任务
/// </summary>
/// <param name="TaskRT">TaskRT类的实例化对象</param>
/// <param name="taskType">任务类型</param>
/// <returns></returns>
public void Insert(TaskRT taskRT, int taskType)
{
try
{
using var context = new AppDbContext();
context.Set<TaskRT>()
.Add(taskRT);
int result = context.SaveChanges();
if (result == 1) Log.Warning($"【手动添加调度任务】任务号:{taskRT.TaskId},{JsonConvert.SerializeObject(taskRT)}");
}
catch (DbUpdateException e)
{
MessageBox.Show($"发生了预期之外的错误:{e.Message}(错误代码:TVM000002)");
}
LoadTaskGrid();
}
/// <summary>
/// 站点信息初始化
/// </summary>
void LocationInitialize()
{
//Rows = new List<int>();
//Columns = new List<int>();
//Floors = new List<int>();
//RowCount = int.Parse(ConfigurationManager.AppSettings["Row"]);
//for (int i = 1; i <= RowCount; i++)
//{
// Rows.Add(i);
//}
//ColumnCount = int.Parse(ConfigurationManager.AppSettings["Column"]);
//for (int i = 1; i <= ColumnCount; i++)
//{
// Columns.Add(i);
//}
//FloorCount = int.Parse(ConfigurationManager.AppSettings["Floor"]);
//for (int i = 1; i <= FloorCount; i++)
//{
// Floors.Add(i);
//}
SourceLocations.Clear();
foreach (var item in CircleRGVsViewModel.route)
{
SourceLocations.Add(item.Key);
}
}
/// <summary>
/// 取货站点对应放货站点
/// </summary>
[RelayCommand]
void SourceToTarget()
{
try
{
SelectedTargetLocation = CircleRGVsViewModel.route[SelectedSourceLocation];
}
catch (Exception)
{
}
}
/// <summary>
/// 下发测试任务
/// </summary>
[RelayCommand]
void SendRGVTest()
{
if (MessageBox.Show("此操作会向环穿地面站PLC直接写入命令!是否继续?", "", MessageBoxButton.YesNo) != MessageBoxResult.Yes)
{
return;
}
CircleRGVStationCommand circleRGVStationCommand = new CircleRGVStationCommand()
{
Write_DeviceNumber = SelectedRGVNumber,
Write_TaskNumber = SqlHelper.GetTaskIdByManualGeneration(),
Write_TaskType = TestingTaskTypeIndex + 1,
Write_SourceLocation = SelectedSourceLocation,
Write_TargetLocation = SelectedTargetLocation,
};
CircleRGVsViewModel.SendRGVStationCommand(circleRGVStationCommand);
Log.Information($"【环穿下发任务测试】直接向地面站下发任务:{JsonConvert.SerializeObject(circleRGVStationCommand)}");
SqlHelper.NewEventLog($"向地面站PLC直接写入测试任务:任务号:{circleRGVStationCommand.Write_TaskNumber}", "USER");
IsTopDrawerOpen = false;
}
/// <summary>
/// 清空选择项
/// </summary>
[RelayCommand]
void TestClear()
{
SelectedRGVNumber = 0;
SelectedSourceLocation = 0;
SelectedTargetLocation = 0;
}
/// <summary>
/// 新任务输入校验
/// </summary>
public void InputCheck()
{
//跨巷道使用
if (string.IsNullOrEmpty(SelectedSourceLocation.ToString().Trim()))
{
MessageBox.Show("请选择取货站点!");
return;
}
if (string.IsNullOrEmpty(SelectedTargetLocation.ToString().Trim()))
{
MessageBox.Show("请选择目标站点!");
return;
}
}
Action<string> action;
//[RelayCommand]
void TaskFinishHandler()
{
InputDialog inputDialog = new InputDialog();
inputDialog.ShowDialog();
action = TaskFinish;
}
void TaskCancelHandler()
{
InputDialog inputDialog = new InputDialog();
inputDialog.ShowDialog();
action = TaskDelete;
}
void UpdateTaskStateToReadyHandler()
{
InputDialog inputDialog = new InputDialog();
inputDialog.ShowDialog();
action = UpdateTaskStateToReady;
}
/// <summary>
/// 手动完成任务
/// </summary>
[RelayCommand]
void TaskFinish(string taskId)
{
using var context = new AppDbContext();
var task = context.Set<TaskRT>()
.Where(t => t.TaskId == taskId)
.FirstOrDefault();
if (task == null)
{
MessageBox.Show("获取任务号错误!自动移除该任务");
context.Database
.ExecuteSqlInterpolated($"DELETE FROM TASK WHERE TASKID={taskId}");
context.SaveChanges();
return;
}
string taskType = "";
switch (task.TaskType)
{
case 10:
taskType = "实垛";
break;
case 11:
taskType = "空托";
break;
default:
break;
}
if (MessageBox.Show($"确认人工完成任务号:{taskId}的任务?\r\n(错误的操作时机可能会导致生成空任务)", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
task.TaskState = TaskStateCode.Task_Finish_Manual;
if (context.SaveChanges() == 1)
{
Log.Information($"【人工操作】手动完成任务,任务号:{taskId}");
SqlHelper.NewEventLog($"人工完成{taskType}任务:{taskId}", "USER");
}
}
LoadTaskGrid();
}
/// <summary>
/// 手动删除(取消)任务
/// </summary>
[RelayCommand]
void TaskDelete(string taskId)
{
using var context = new AppDbContext();
var task = context.Set<TaskRT>()
.Where(t => t.TaskId == taskId)
.FirstOrDefault();
if (task == null)
{
MessageBox.Show("获取任务号错误!自动移除该任务");
context.Database
.ExecuteSqlInterpolated($"DELETE FROM TASK WHERE TASKID={taskId}");
context.SaveChanges();
return;
}
string taskType = "";
switch (task.TaskType)
{
case 10:
taskType = "实垛";
break;
case 11:
taskType = "空托";
break;
default:
break;
}
if (MessageBox.Show($"确认人工取消任务号:{taskId}的任务?\r\n(错误的操作时机可能会导致生成空任务)", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
task.TaskState = TaskStateCode.Task_Finish_Cancel;
if (context.SaveChanges() == 1)
{
Log.Information($"【人工操作】手动取消任务,任务号:{taskId}");
SqlHelper.NewEventLog($"人工取消{taskType}任务:{taskId}", "USER");
}
}
LoadTaskGrid();
}
/// <summary>
/// 当向环穿下发任务失败时,可以选择重新下发
/// 只能在调度状态为【环穿-待执行】时可用
/// </summary>
/// <param name="taskId"></param>
[RelayCommand]
void UpdateTaskStateToReady(string taskId)
{
using var context = new AppDbContext();
var task = context.Set<TaskRT>()
.Where(t => t.TaskId == taskId && t.ScheduleState == ScheduleStateCode.Trans_CircleRGV_Ready)
.FirstOrDefault();
if (task == null)
{
MessageBox.Show("设备运行时的任务无法重下!");
return;
}
if (MessageBox.Show($"确认将任务:{taskId}的任务状态更改为【待执行】?\r\n此操作会重新下发当前任务(仅在环穿调度状态为【环穿-待执行】时生效)", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
task.TaskState = TaskStateCode.Task_Ready;
if (context.SaveChanges() == 1)
{
Log.Information($"【人工操作】重新下发任务,任务号:{taskId}");
SqlHelper.NewEventLog($"人工重下任务:{taskId}", "USER");
}
}
LoadTaskGrid();
}
}
}

View File

@@ -0,0 +1,641 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Serilog;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WPFWCSDemo.Models.Tables;
using WPFWCSDemo.StateCode;
using WPFWCSDemo.Utilities;
namespace WPFWCSDemo.ViewModels.DbViews
{
public partial class TaskHistoryDbViewModel : ObservableObject
{
public TaskHistoryDbViewModel()
{
TaskHistory = new ObservableCollection<TaskHistory>();
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");
LoadTaskHistory(1);
LoadColumnName();
PageInput = 1;
PageCurrent = 1;
PageInfo = $"当前 {PageCurrent} 页";
DynamicPage(PageCurrent);
}
/// <summary>
/// false-表示默认表数据集 true-表示查询后的表数据集
/// </summary>
bool b;
/// <summary>
/// 历史表数据
/// </summary>
[ObservableProperty]
ObservableCollection<TaskHistory> _taskHistory;
/// <summary>
/// 起始日期
/// </summary>
[ObservableProperty]
string? _dateStart;
/// <summary>
/// 起始时间
/// </summary>
[ObservableProperty]
string? _timeStart;
/// <summary>
/// 结束日期
/// </summary>
[ObservableProperty]
string? _dateEnd;
/// <summary>
/// 结束时间
/// </summary>
[ObservableProperty]
string? _timeEnd;
/// <summary>
/// 默认值-起始日期
/// </summary>
[ObservableProperty]
string? _txtDateStart;
/// <summary>
/// 默认值-起始时间
/// </summary>
[ObservableProperty]
string? _txtTimeStart;
/// <summary>
/// 默认值-结束日期
/// </summary>
[ObservableProperty]
string? _txtDateEnd;
/// <summary>
/// 默认值-结束时间
/// </summary>
[ObservableProperty]
string? _txtTimeEnd;
/// <summary>
/// 查询字段选择项集合
/// </summary>
[ObservableProperty]
ObservableCollection<string> _columnList = new ObservableCollection<string>();
/// <summary>
/// 查询字段名
/// </summary>
[ObservableProperty]
string _columnName;
/// <summary>
/// 查询字段名
/// </summary>
Dictionary<string, string> columnDic = new Dictionary<string, string>();
/// <summary>
/// 查询关键词
/// </summary>
[ObservableProperty]
string _keywords;
/// <summary>
/// 加载/重载表数据
/// </summary>
/// <param name="page">页数</param>
void LoadTaskHistory(int page)
{
b = false;
TaskHistory.Clear();
DataTable? dtCount = SqlHelper.ExecuteTable("SELECT * FROM TASK_HISTORY_VIEW ORDER BY 结束时间 DESC");
DataTable? dt = SqlHelper.ExecuteTable("SELECT * FROM TASK_HISTORY_VIEW ORDER BY 结束时间 DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
new SqlParameter("@Rows", page - 1));
var datas = dt.Rows;
//遍历表中每行数据并初始化值
foreach (DataRow data in datas)
{
TaskHistory t = new TaskHistory();
t.JobId = data["环穿编号"].ToString();
t.TaskId = data["任务号"].ToString();
//t.PalletId = data["PalletId"].ToString();
t.SourceLocation = data["源站点"].ToString();
t.TargetLocation = data["目标站点"].ToString();
t.TaskType = data["任务类型"].ToString();
t.TaskState = data["任务状态"].ToString();
t.ScheduleState = data["调度状态"].ToString();
//t.ReportState = data["取货状态"].ToString();
t.CreateTime = Convert.ToDateTime(data["生成时间"]);
t.ScheduleTime = Convert.ToDateTime(data["调度时间"]);
t.FinishTime = Convert.ToDateTime(data["结束时间"]);
//数据结果
TaskHistory.Add(t);
}
UpdatePageInfo(dtCount, page);
}
/// <summary>
/// 加载/重载表数据---指定数据集
/// </summary>
void LoadTaskHistory(DataTable dt)
{
TaskHistory.Clear();
var datas = dt.Rows;
//遍历表中每行数据并初始化值
foreach (DataRow data in datas)
{
TaskHistory t = new()
{
JobId = data["环穿编号"].ToString(),
TaskId = data["任务号"].ToString(),
//t.PalletId = data["PalletId"].ToString(),
SourceLocation = data["源站点"].ToString(),
TargetLocation = data["目标站点"].ToString(),
TaskType = data["任务类型"].ToString(),
TaskState = data["任务状态"].ToString(),
ScheduleState = data["调度状态"].ToString(),
//ReportState = data["取货状态"].ToString(),
CreateTime = Convert.ToDateTime(data["生成时间"]),
ScheduleTime = Convert.ToDateTime(data["调度时间"]),
FinishTime = Convert.ToDateTime(data["结束时间"]),
};
//数据结果
TaskHistory.Add(t);
}
}
/// <summary>
/// 加载可选的搜索字段
/// </summary>
void LoadColumnName()
{
//下拉框选项填充
ColumnList.Clear();
ColumnList.Add("环穿编号");
ColumnList.Add("任务号");
//ColumnList.Add("托盘号");
ColumnList.Add("任务类型");
ColumnList.Add("源站点");
ColumnList.Add("目标站点");
ColumnList.Add("任务状态");
ColumnList.Add("生成时间");
ColumnList.Add("调度时间");
ColumnList.Add("完成时间");
//列名映射
columnDic.Clear();
columnDic.Add("环穿编号", "环穿编号");
columnDic.Add("任务号", "任务号");
//columnDic.Add("托盘号", "PalletId");
columnDic.Add("任务类型", "任务类型");
columnDic.Add("源站点", "源站点");
columnDic.Add("目标站点", "目标站点");
columnDic.Add("任务状态", "任务状态");
columnDic.Add("生成时间", "生成时间");
columnDic.Add("调度时间", "调度时间");
columnDic.Add("完成时间", "完成时间");
}
/// <summary>
/// 查询指令获取显示结果
/// </summary>
/// <param name="num">页数</param>
[RelayCommand]
void Query(string num)
{
b = true;
TaskHistory.Clear();
DataTable? dt;
DataTable? dtCount;
if (!DateStringFormat())
{
return;
}
try
{
//搜索条件为空或其他
if (!string.IsNullOrEmpty(ColumnName) && !string.IsNullOrEmpty(Keywords.Trim()))
{
dtCount = SqlHelper.ExecuteTable(
$"SELECT * FROM TASK_HISTORY_VIEW WHERE {ColumnName} LIKE @Keywords AND 结束时间>=@FinishTime1 AND 结束时间<@FinishTime2 ORDER BY 结束时间 DESC",
new SqlParameter("@Keywords", $"%{Keywords.Trim()}%"),
new SqlParameter("@FinishTime1", dateTimeStart),
new SqlParameter("@FinishTime2", dateTimeEnd)
);
dt = SqlHelper.ExecuteTable(
$"SELECT * FROM TASK_HISTORY_VIEW WHERE {ColumnName} LIKE @Keywords AND 结束时间>=@FinishTime1 AND 结束时间<@FinishTime2 ORDER BY 结束时间 DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
new SqlParameter("@Keywords", $"%{Keywords.Trim()}%"),
new SqlParameter("@FinishTime1", dateTimeStart),
new SqlParameter("@FinishTime2", dateTimeEnd),
new SqlParameter("@Rows", int.Parse(num) - 1)
);
}
else
{
dtCount = SqlHelper.ExecuteTable(
$"SELECT * FROM TASK_HISTORY_VIEW WHERE 结束时间>=@FinishTime1 AND 结束时间<@FinishTime2 ORDER BY 结束时间 DESC",
new SqlParameter("@FinishTime1", dateTimeStart),
new SqlParameter("@FinishTime2", dateTimeEnd)
);
dt = SqlHelper.ExecuteTable(
$"SELECT * FROM TASK_HISTORY_VIEW WHERE 结束时间>=@FinishTime1 AND 结束时间<@FinishTime2 ORDER BY 结束时间 DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
new SqlParameter("@FinishTime1", dateTimeStart),
new SqlParameter("@FinishTime2", dateTimeEnd),
new SqlParameter("@Rows", int.Parse(num) - 1)
);
}
LoadTaskHistory(dt);
UpdatePageInfo(dtCount, num);
}
catch (Exception)
{
}
}
/// <summary>
/// 重置选择
/// </summary>
[RelayCommand]
void Clear()
{
ColumnName = string.Empty;
Keywords = string.Empty;
TaskHistory.Clear();
LoadTaskHistory(1);
}
//---------------------------------时间字符串格式化对象---------------------------------
DateTime dateTimeStart;
DateTime dateTimeEnd;
/// <summary>
/// 日期格式处理
/// </summary>
/// <returns>格式是否正确 true-正确 false-错误</returns>
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 = 10;
/// <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>
/// <param name="pageCurrent">跳转后的页数</param>
void DynamicPage(int pageCurrent)
{
//设置最多显示5页按钮
Pages.Clear();
//总页数小于8-显示1-X页
if (PageCount < 8 && pageCurrent < 8)
{
for (int i = 1; i < PageCount; i++)
{
Pages.Add(i.ToString());
}
}
//总页数大于等于8
else
{
//距离尾页多于3页
if (PageCount - pageCurrent >= 3)
{
//1---显示前7页
if (pageCurrent < 8)
{
for (int i = 1; i < 8; i++)
{
Pages.Add(i.ToString());
}
}
else
{
//显示当前页的前3和后3页码
for (int i = pageCurrent - 3; i <= pageCurrent + 3; i++)
{
Pages.Add(i.ToString());
}
}
}
//距离尾页是否少于3页---显示尾页前7页
else
{
if (PageCount - pageCurrent <= 2)
{
for (int i = PageCount - 6; i <= PageCount; i++)
{
Pages.Add(i.ToString());
}
}
}
}
}
/// <summary>
/// 获取数据集的总条数和页码数,更新属性
/// </summary>
/// <param name="dt"></param>
/// <param name="pageCurrent">当前页</param>
void UpdatePageInfo(DataTable dt, int pageCurrent)
{
//总数据条数
DataCountNumber = dt.Rows.Count;
//文本显示
DataCount = $"共 {DataCountNumber} 条";
//总页数
if (DataCountNumber % countPerPage == 0)
{
PageCount = DataCountNumber / countPerPage;
}
else
{
PageCount = DataCountNumber / countPerPage + 1;
}
PageCurrent = pageCurrent;
DynamicPage(pageCurrent);
}
void UpdatePageInfo(DataTable dt, string pageCurrent)
{
//总数据条数
DataCountNumber = dt.Rows.Count;
//文本显示
DataCount = $"共 {DataCountNumber} 条";
//总页数
if (DataCountNumber % countPerPage == 0)
{
PageCount = DataCountNumber / countPerPage;
}
else
{
PageCount = DataCountNumber / countPerPage + 1;
}
PageCurrent = int.Parse(pageCurrent);
DynamicPage(int.Parse(pageCurrent));
}
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
/// <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)
{
//默认数据集条件下跳转
LoadTaskHistory(index);
}
else
{
//查询之后的数据集条件下跳转
Query(index.ToString());
}
if (pageNumber <= PageCount)
{
PageCurrent = pageNumber;
PageInfo = $"当前 {pageNumber} 页";
}
}
}
}

View File

@@ -0,0 +1,66 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace WPFWCSDemo.ViewModels
{
public partial class DevicesNavigationViewModel:ObservableObject
{
private readonly Frame _navigationFrame;
public DevicesNavigationViewModel(Frame navigationFrame)
{
_navigationFrame = navigationFrame;
}
/// <summary>
/// 打开设备清单
/// </summary>
[RelayCommand]
void OpenDevicePage()
{
_navigationFrame.Navigate(new Uri($"Views\\Devices\\DeviceListView.xaml", UriKind.Relative));
}
/// <summary>
/// 打开堆垛机窗口
/// </summary>
[RelayCommand]
void OpenStackerPage()
{
_navigationFrame.Navigate(new Uri($"Views\\Devices\\StackersView.xaml", UriKind.Relative));
}
/// <summary>
/// 打开输送机窗口
/// </summary>
[RelayCommand]
void OpenConvPage()
{
_navigationFrame.Navigate(new Uri($"Views\\Devices\\ConvsView.xaml", UriKind.Relative));
}
/// <summary>
/// 打开提升机窗口
/// </summary>
[RelayCommand]
void OpenLiftPage()
{
_navigationFrame.Navigate(new Uri($"Views\\Devices\\LiftsView.xaml", UriKind.Relative));
}
/// <summary>
/// 打开RGV窗口
/// </summary>
[RelayCommand]
void OpenRGVPage()
{
_navigationFrame.Navigate(new Uri($"Views\\Devices\\RGVsView.xaml", UriKind.Relative));
}
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WPFWCSDemo.ViewModels
{
public class DevicesViewModel
{
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WPFWCSDemo.ViewModels
{
class HelperViewModel
{
}
}

View File

@@ -0,0 +1,141 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using WPFWCSDemo.Data;
namespace WPFWCSDemo.ViewModels
{
public partial class LineManagementViewModel:ObservableObject
{
public LineManagementViewModel(Window window)
{
LineManagementDialog = window;
Caption = "输送线管理";
Enables = new ObservableCollection<int>();
InitializeStyle();
}
/// <summary>
/// 当前页面
/// </summary>
[ObservableProperty]
string _caption;
/// <summary>
/// 当前页面
/// </summary>
[ObservableProperty]
Window _lineManagementDialog;
/// <summary>
/// 当前页面
/// </summary>
[ObservableProperty]
Color _btnColor;
[RelayCommand]
void Accept(Window window)
{
window.Close();
}
[ObservableProperty]
ObservableCollection<int> _enables;
[ObservableProperty]
int _e1009;
[ObservableProperty]
int _e1010;
[ObservableProperty]
int _e1011;
[ObservableProperty]
int _e1012;
[ObservableProperty]
int _e1002;
[ObservableProperty]
int _e1004;
[ObservableProperty]
int _e1006;
[RelayCommand]
void StateChange(string targetLocation)
{
var context = new AppDbContext();
var res = context.LineState
.Where(a => a.Target == int.Parse(targetLocation))
.ToList();
if (res == null) return;
for (int i = 0; i < res.Count; i++)
{
if (res[i].IsEnable == 0)
{
if (MessageBox.Show($"确认要恢复{targetLocation}输送口允许进垛吗?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
res[i].IsEnable = 1;
}
}
else
{
if (MessageBox.Show($"确认要禁止{targetLocation}输送口进垛吗?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
res[i].IsEnable = 0;
}
}
}
context.SaveChanges();
InitializeStyle();
}
/// <summary>
/// 按钮样式初始化
/// </summary>
void InitializeStyle()
{
var context = new AppDbContext();
var results = context.LineState
.Select(a=>a.IsEnable)
.ToList();
Enables.Clear();
foreach (var result in results)
{
Enables.Add(result);
}
E1009 = Enables[1];
E1010 = Enables[2];
E1011 = Enables[3];
E1012 = Enables[0];
E1002 = Enables[5];
E1004 = Enables[6];
E1006 = Enables[7];
}
}
}

View File

@@ -0,0 +1,201 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows;
using CommunityToolkit.Mvvm.ComponentModel;
using System.Reactive.Linq;
using System.Diagnostics;
using System.Threading;
namespace WPFWCSDemo.ViewModels
{
public partial class LogViewModel : ObservableObject
{
public LogViewModel()
{
//更新(当日)日志
//Task.Run(() =>
//{
// while (true)
// {
// try
// {
// //获取存储日志的字符串
// Content = File.ReadAllText(dirPath + @"logs\2024-10-09\Debug.txt");
// Task.Delay(1000);
// }
// catch (Exception)
// {
// }
// }
//});
}
//存放日志文件路径
//readonly string dirPath = @"E:\VSProject\WPF\FT472\WPFWCSDemo\bin\Debug\net6.0-windows\";
//[ObservableProperty]
//string _content;
/*
#region 下拉框内容初始化
//月份选择下拉框
cbxMonth.Items.Clear();
cbxMonth.Items.Add("-请选择月份-");
cbxMonth.Items.Add("一月");
cbxMonth.Items.Add("二月");
cbxMonth.Items.Add("三月");
cbxMonth.Items.Add("四月");
cbxMonth.Items.Add("五月");
cbxMonth.Items.Add("六月");
cbxMonth.Items.Add("七月");
cbxMonth.Items.Add("八月");
cbxMonth.Items.Add("九月");
cbxMonth.Items.Add("十月");
cbxMonth.Items.Add("十一月");
cbxMonth.Items.Add("十二月");
//下拉框选择初始化
cbxMonth.SelectedIndex = 0;
cbxLogName.SelectedIndex = 0;
#endregion
}
/// <summary>
/// 实时日志【内容更新】事件触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtLog_TextChanged(object sender, EventArgs e)
{
//【搜索】按钮打开当天日志时,令滚动条位于最下
txtLog.SelectionStart = txtLog.Text.Length;
txtLog.ScrollToCaret();
}
/// <summary>
/// 【月份】下拉框的值改变事件--→【日志】名称选择的下拉框也随之变化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cbxMonth_TextChanged(object sender, EventArgs e)
{
//日志文件名选择下拉框
cbxLogName.Items.Clear();
//获取存放日志文件夹所有文件全路径
try
{
//尝试获取路径,否则报错
string[] name = Directory.GetDirectories(dirPath);
//添加到下拉框
cbxLogName.Items.Add("-请选择日志-");
for (int i = 0; i < name.Length; i++)
{
//从文件名筛选符合月份条件的项
if (Path.GetFileNameWithoutExtension(name[i]).Contains("-" + cbxMonth.SelectedIndex.ToString("00") + "-"))
{
//添加当月日志的文件名
cbxLogName.Items.Add(Path.GetFileNameWithoutExtension(name[i]));
}
}
cbxLogName.SelectedIndex = 0;
}
catch (Exception)
{
return;
}
}
/// <summary>
/// 【搜索】按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSearch_Click(object sender, EventArgs e)
{
if (cbxMonth.SelectedIndex != 0 && cbxLogName.SelectedIndex == 0)
{
MessageBox.Show("请选择要查找历史日志的时间!");
return;
}
if (cbxMonth.SelectedIndex == 0 && cbxLogName.SelectedIndex == 0) return;
try
{
//判断选择的日志文件日期是否为当天
if (cbxLogName.Text.Equals(DateTime.Now.ToString("yyyy-MM-dd")))
{
//显示实时日志
txtLog.Visible = true;
}
else
{
if (cbxMonth.SelectedIndex == 0 && cbxLogName.SelectedIndex == 0) return;
//获取选中的路径文件内容
txtLogHistory.Text = File.ReadAllText(dirPath + cbxLogName.Text + @"/Info.log", Encoding.Default);
//隐藏实时日志---显示历史日志
txtLog.Visible = false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
/// <summary>
/// 【取消/刷新】页面按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCancel_Click(object sender, EventArgs e)
{
//【搜索】按钮打开当天日志时,令滚动条位于最下,相比根据【内容更新】事件触发此效果可能存在的时间间隔有观感提升
txtLog.SelectionStart = txtLog.Text.Length;
txtLog.ScrollToCaret();
//显示实时日志
txtLog.Visible = true;
}
/// <summary>
/// 打开当日的日志文档
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenFile_Click(object sender, EventArgs e)
{
//打开当日的日志文档
//Process.Start("notepad", dirPath + DateTime.Now.ToString("yyyy-MM-dd") + "/Info.log");
if (Directory.Exists(dirPath + DateTime.Now.ToString("yyyy-MM-dd")))
{
Process.Start(dirPath + DateTime.Now.ToString("yyyy-MM-dd"));
}
else
{
Process.Start(dirPath);
}
}
*/
}
}

View File

@@ -0,0 +1,454 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using MaterialDesignThemes.Wpf;
using Serilog;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Windows.Threading;
using System.Xml.Linq;
using WPFWCSDemo.Models;
using WPFWCSDemo.Models.Devices.CircleRGVStation;
using WPFWCSDemo.Schedules;
using WPFWCSDemo.Schedules.CircleRGV;
using WPFWCSDemo.StateCode;
using WPFWCSDemo.Utilities;
using WPFWCSDemo.Views;
using WPFWCSDemo.Views.CustomComponent;
using WPFWCSDemo.Views.Devices;
namespace WPFWCSDemo.ViewModels
{
/// <summary>
/// 母窗体
public partial class MainViewModel : ObservableObject
{
/// <summary>
/// 用于监控请求值的定时器
/// </summary>
private readonly DispatcherTimer dispatcherTimer;
/// <summary>
/// 用于接收View中导航用的Frame控件,此项目中使用Frame作为导航母控件
/// </summary>
private readonly Frame _navigationFrame;
/// </summary>
public MainViewModel(Frame navigationFrame)
{
_menuBar = new ObservableCollection<MenuBar>();
CreateMenu();
_navigationFrame = navigationFrame;
// 设置定时器属性
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(1); // 设置时间间隔为1秒
dispatcherTimer.Tick += DispatcherTimer_Tick; // 添加事件处理程序
dispatcherTimer.Start(); // 启动计时器
//ScheduleTask();
}
/// <summary>
/// 定时执行的调度任务
/// </summary>
private static void ScheduleTask()
{
Task.Factory.StartNew(() =>
{
while (true)
{
// //更新任务状态
// CircleRGVSchedule.UpdateScheduleState();
//Excute.ExecuteTask();
//Update.UpdateDeviceNumber();
//Update.UpdateScheduleState();
//Generate.GenerateTask();
////Common.RecordRequestValue();
//Log.Information($"-----------------设备调度-----------------");
// ////任务处理
// TaskFinishSchedule.TaskFinish();
// TaskFinishSchedule.TaskDelete();
// TaskFinishSchedule.TaskForSendFailedHandler();
// TaskFinishSchedule.TaskExceptionHandler();
// //RGV调度
// CircleRGVSchedule.GenerateTask();
// CircleRGVSchedule.ExecuteTask();
// Task.Delay(200).Wait();
}
}, TaskCreationOptions.LongRunning);
Task.Factory.StartNew(() =>
{
while (true)
{
//实时报警
AlarmViewModel.RealTimeAlarm();
Task.Delay(1000).Wait();
}
}, TaskCreationOptions.LongRunning);
//自动备份
//Task.Run(() =>
//{
// while (true)
// {
// GlobalTask.SqlBackupForTime();
// Task.Delay(TimeSpan.FromHours(5)).Wait();
// }
//});
}
/// <summary>
/// ListBox选择项
/// </summary>
[ObservableProperty]
MenuBar? _selectedMenuBar;
[ObservableProperty]
ObservableCollection<MenuBar> _menuBar;
#region 输送口请求指示
[ObservableProperty]
bool _getRequest_1001;
[ObservableProperty]
bool _getRequest_1003;
[ObservableProperty]
bool _getRequest_1005;
[ObservableProperty]
bool _getRequest_1007;
[ObservableProperty]
bool _getRequest_1008;
[ObservableProperty]
bool _getRequest_1013;
[ObservableProperty]
bool _putRequest_1002;
[ObservableProperty]
bool _putRequest_1004;
[ObservableProperty]
bool _putRequest_1006;
[ObservableProperty]
bool _putRequest_1009;
[ObservableProperty]
bool _putRequest_1010;
[ObservableProperty]
int _permission_Station;
#endregion
#region 输送口请求 - 显隐性
[ObservableProperty]
Visibility _getRequest_LineA_Visible;
[ObservableProperty]
Visibility _getRequest_LineB_Visible;
[ObservableProperty]
Visibility _getRequest_LineC_Visible;
[ObservableProperty]
Visibility _getRequest_LineD_Visible;
[ObservableProperty]
Visibility _getRequest_LineAB_Visible;
[ObservableProperty]
Visibility _putRequest_LineB_Visible;
[ObservableProperty]
Visibility _getRequest_LineCD_Visible;
[ObservableProperty]
Visibility _putRequest_LineC_Visible;
#endregion
private void DispatcherTimer_Tick(object? sender, EventArgs e)
{
using CircleRGVStationState circleRGVStationState = CircleRGVsViewModel.GetCircleRGVStaionState();
if (circleRGVStationState == null) return;
GetRequest_1001 = circleRGVStationState.Read_GetRequest_1001;
GetRequest_1003 = circleRGVStationState.Read_GetRequest_1003;
GetRequest_1005 = circleRGVStationState.Read_GetRequest_1005;
GetRequest_1007 = circleRGVStationState.Read_GetRequest_1007;
GetRequest_1008 = circleRGVStationState.Read_GetRequest_1008;
GetRequest_1007 = circleRGVStationState.Read_GetRequest_1007;
GetRequest_1008 = circleRGVStationState.Read_GetRequest_1008;
GetRequest_1013 = circleRGVStationState.Read_GetRequest_1013;
PutRequest_1002 = circleRGVStationState.Read_PutRequest_1002;
PutRequest_1004 = circleRGVStationState.Read_PutRequest_1004;
PutRequest_1006 = circleRGVStationState.Read_PutRequest_1006;
PutRequest_1009 = circleRGVStationState.Read_PutRequest_1009;
PutRequest_1010 = circleRGVStationState.Read_PutRequest_1010;
Permission_Station = circleRGVStationState.Read_Permission;
}
bool b = false;
/// <summary>
/// ListBox按键导航
/// </summary>
/// <param name="name"></param>
[RelayCommand]
void Navigation(string name)
{
if (string.IsNullOrEmpty(name)) return;
//【设置】子页导航
if (name == "SettingView")
{
_navigationFrame.Navigate(new Uri($"Views\\Settings\\{name}.xaml", UriKind.Relative));
return;
}
try
{
if (name == nameof(AlarmView) || name == nameof(TaskView)
|| name == nameof(AlarmHistoryView) || name == nameof(TaskHistoryView))
{
if (!SqlHelper.IsDBConnected())
{
_navigationFrame.Navigate(new Uri($"Views\\BlankView.xaml", UriKind.Relative));
b = true;
return;
}
}
//导航页面
_navigationFrame.Navigate(new Uri($"Views\\{name}.xaml", UriKind.Relative));
}
catch
{
}
}
/// <summary>
/// 后退
/// </summary>
[RelayCommand]
void GoBack()
{
if (b)
{
//删除【连接错误页面】的导航记录
_navigationFrame.NavigationService.RemoveBackEntry();
b = false;
}
try
{
_navigationFrame.NavigationService.GoBack();
}
catch
{
}
}
/// <summary>
/// 前进
/// </summary>
[RelayCommand]
void GoForward()
{
try
{
_navigationFrame.NavigationService.GoForward();
}
catch
{
}
}
/// <summary>
/// 主页
/// </summary>
[RelayCommand]
void Home()
{
//主页面
_navigationFrame.Navigate(new Uri($"Views\\DataInfoView.xaml", UriKind.Relative));
}
public void TaskPage()
{
_navigationFrame.Navigate(new Uri($"Views\\TaskView.xaml", UriKind.Relative));
}
public void TaskHistoryPage()
{
_navigationFrame.Navigate(new Uri($"Views\\TaskHistoryView.xaml", UriKind.Relative));
}
public void AlarmPage()
{
_navigationFrame.Navigate(new Uri($"Views\\AlarmView.xaml", UriKind.Relative));
}
/// <summary>
/// 设备测试
/// </summary>
[RelayCommand]
void DeviceTest()
{
//ControllerView controllerView = new ControllerView();
//controllerView.ShowDialog(1);
}
/// <summary>
/// 顶部工具栏打开日志文件夹
/// </summary>
[RelayCommand]
void OpenLog()
{
string dirPath = @"D:\Logs";
if (Directory.Exists(dirPath))
{
Process.Start("explorer.exe",dirPath);
}
}
/// <summary>
/// 顶部工具栏打开设置页
/// </summary>
[RelayCommand]
void OpenSetting()
{
_navigationFrame.Navigate(new Uri($"Views\\Settings\\SettingView.xaml", UriKind.Relative));
}
/// <summary>
/// 输送线管理
/// </summary>
[RelayCommand]
void LineControl()
{
LineControlDialog dialog = new LineControlDialog();
dialog.ShowDialog();
}
/// <summary>
/// 打开操作手册
/// </summary>
[RelayCommand]
void Helper()
{
try
{
string dirPath = @"D:\滁州东鹏饮料二厂环穿WCS系统使用手册.doc";
string processPath = @"C:\Program Files\Microsoft Office\Office16\WINWORD.exe";
if (File.Exists(dirPath))
{
Process.Start(processPath,dirPath);
}
}
catch
{
}
}
/// <summary>
/// 导航菜单初始化
/// </summary>
void CreateMenu()
{
//生产类画面
MenuBar.Add(new MenuBar() { Icon = "Home", Title = "生产看板", NameSpace = nameof(DataInfoView) });
//MenuBar.Add(new MenuBar() { Icon = "MonitorScreenshot", Title = "生产监控", NameSpace = nameof(MonitorView) });
//MenuBar.Add(new MenuBar() { Icon = "MonitorDashboard", Title = "设备信息", NameSpace = nameof(DevicesNavigationView) });
MenuBar.Add(new MenuBar() { Icon = "MonitorDashboard", Title = "环穿状态", NameSpace = nameof(CircleRGVsView) });
//报表类画面
//MenuBar.Add(new MenuBar() { Icon = "Warehouse", Title = "库存信息", NameSpace = nameof(CargoView) });
MenuBar.Add(new MenuBar() { Icon = "AlarmLightOutline", Title = "实时报警", NameSpace = nameof(AlarmView) });
MenuBar.Add(new MenuBar() { Icon = "History", Title = "历史报警", NameSpace = nameof(AlarmHistoryView) });
MenuBar.Add(new MenuBar() { Icon = "ClipboardTextOutline", Title = "调度任务", NameSpace = nameof(Views.TaskView) });
MenuBar.Add(new MenuBar() { Icon = "ClipboardTextClockOutline", Title = "历史任务", NameSpace = nameof(TaskHistoryView) });
//其他
//MenuBar.Add(new MenuBar() { Icon = "Book", Title = "日志", NameSpace = nameof(LogView) });
//MenuBar.Add(new MenuBar() { Icon = "Tools", Title = "设置", NameSpace = nameof(SettingView) });
//MenuBar.Add(new MenuBar() { Icon = "CommentQuestionOutline", Title = "帮助", NameSpace = nameof(HelperView) });
}
}
}

View File

@@ -0,0 +1,138 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using WPFWCSDemo.Models;
using WPFWCSDemo.Utilities;
namespace WPFWCSDemo.ViewModels
{
public partial class MonitorViewModel : ObservableObject
{
public MonitorViewModel()
{
WarehouseLayout = new ObservableCollection<WareHouseInfo>();
CargoState = new ObservableCollection<Cargo>();
InitializeWarehouseLayout(LayersSelectedIndex);
}
/// <summary>
/// 货位信息
/// </summary>
[ObservableProperty]
ObservableCollection<WareHouseInfo> _warehouseLayout;
/// <summary>
/// 货位状态
/// </summary>
[ObservableProperty]
ObservableCollection<Cargo> _cargoState;
/// <summary>
/// 层数选择
/// </summary>
[ObservableProperty]
int _layersSelectedIndex;
/// <summary>
/// 货位状态绘图初始化
/// </summary>
private void InitializeWarehouseLayout(int layer)
{
WarehouseLayout.Clear();
CargoState.Clear();
double cellWidth = 36;
double cellHeight = 25;
DataTable dt = SqlHelper.ExecuteTable("SELECT STATUS FROM CARGOSPACE WHERE FLOOR=@Floor ORDER BY ROW ASC,[COLUMN] ASC ",
new System.Data.SqlClient.SqlParameter("@Floor", layer + 1));
foreach (DataRow item in dt.Rows)
{
Cargo cargo = new Cargo();
cargo.Status = int.Parse(item["Status"].ToString());
CargoState.Add(cargo);
}
for (int row = 0; row < 8; row++)
{
for (int col = 0; col < 22; col++)
{
WareHouseInfo wareHouseInfo = new WareHouseInfo();
wareHouseInfo.Tooltip = $"排: {row + 1}, 列: {col + 1}, 层: {layer + 1}";
if (CargoState.First().Status == 1)
{
//仓位空
wareHouseInfo.FillColor = Brushes.Silver;
}
else if (CargoState.First().Status == 2)
{
//仓位占用
wareHouseInfo.FillColor = Brushes.LawnGreen;
}
else if (CargoState.First().Status == 3)
{
//仓位盘点
wareHouseInfo.FillColor = Brushes.Orange;
}
else
{
//仓位异常
wareHouseInfo.FillColor = Brushes.Red;
}
CargoState.RemoveAt(0);
//设备排列图形间隔
wareHouseInfo.X = col * cellWidth + 1 + cellWidth;
//wareHouseInfo.Y = row * cellHeight;
//设置奇偶数排图形间隔
if (row % 2 == 0)
{
wareHouseInfo.Y = (row + (row * 1)) * cellHeight + 40;
}
else
{
wareHouseInfo.Y = (row + (row - 1) * 1) * cellHeight + 50;
}
//设置仓位图形缩放中心
wareHouseInfo.RenderCenter = new System.Drawing.Point((int)wareHouseInfo.X + (int)(cellWidth / 2 - 3), (int)wareHouseInfo.Y + (int)(cellWidth / 2 - 3));
WarehouseLayout.Add(wareHouseInfo);
}
}
}
/// <summary>
/// 点击层数切换库存显示
/// </summary>
[RelayCommand]
void LayersSelect()
{
InitializeWarehouseLayout(LayersSelectedIndex);
}
}
}

View File

@@ -0,0 +1,31 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace WPFWCSDemo.ViewModels.Settings
{
public partial class AboutViewModel:ObservableObject
{
[RelayCommand]
void WebNavigation()
{
string url = "http://www.yctd.cn/";
Uri uri = new Uri(url);
// 使用Process.Start打开默认浏览器
Process.Start(new ProcessStartInfo
{
FileName = uri.ToString(),
UseShellExecute = true
});
}
}
}

View File

@@ -0,0 +1,71 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Xml.Linq;
using WPFWCSDemo.Models;
using WPFWCSDemo.Utilities;
using WPFWCSDemo.ViewModels.Settings;
using WPFWCSDemo.Views.Settings;
namespace WPFWCSDemo.ViewModels
{
public partial class SettingViewModel : ObservableObject
{
private readonly Frame frame;
public SettingViewModel(Frame navigationFrame)
{
frame = navigationFrame;
Menu = new ObservableCollection<SettingMenu>();
CreateSettingMenu();
SkinViewModel.GetFrame(frame);
frame.Navigate(new Uri($"Views\\Settings\\SystemView.xaml", UriKind.Relative));
}
/// <summary>
/// 菜单选择项
/// </summary>
[ObservableProperty]
ObservableCollection<SettingMenu> _menu;
void CreateSettingMenu()
{
Menu.Add(new SettingMenu() { Icon = "Pencil", Title = "个性化", NameSpace = "SkinView"/*nameof(SkinView)*/ });
Menu.Add(new SettingMenu() { Icon = "Tools", Title = "系统设置", NameSpace = "SystemView" });
Menu.Add(new SettingMenu() { Icon = "ExclamationThick", Title = "关于", NameSpace = "AboutView" });
}
/// <summary>
/// 切换导航
/// </summary>
/// <param name="name"></param>
[RelayCommand]
void SettingNavigate(SettingMenu menu)
{
try
{
frame.Navigate(new Uri($"Views\\Settings\\{menu.NameSpace}.xaml", UriKind.Relative));
}
catch
{
}
}
}
}

View File

@@ -0,0 +1,77 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using MaterialDesignColors;
using MaterialDesignColors.ColorManipulation;
using MaterialDesignThemes.Wpf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media;
namespace WPFWCSDemo.ViewModels.Settings
{
public partial class SkinViewModel:ObservableObject
{
[ObservableProperty]
static Frame frame;
public IEnumerable<ISwatch> Swatches { get; } = SwatchHelper.Swatches;
//深浅色切换
private bool _isDarkTheme;
public bool IsDarkTheme
{
get => _isDarkTheme;
set
{
if (SetProperty(ref _isDarkTheme, value))
{
ModifyTheme(theme => theme.SetBaseTheme(value ? Theme.Dark : Theme.Light));
}
}
}
//切换主题
private static void ModifyTheme(Action<ITheme> modificationAction)
{
var paletteHelper = new PaletteHelper();
ITheme theme = paletteHelper.GetTheme();
modificationAction?.Invoke(theme);
paletteHelper.SetTheme(theme);
}
private readonly PaletteHelper paletteHelper = new PaletteHelper();
/// <summary>
/// 改变颜色
/// </summary>
/// <param name="obj"></param>
[RelayCommand]
public void ChangeHue(object? obj)
{
var hue = (Color)obj!;
ITheme theme = paletteHelper.GetTheme();
theme.PrimaryLight = new ColorPair(hue.Lighten());
theme.PrimaryMid = new ColorPair(hue);
theme.PrimaryDark = new ColorPair(hue.Darken());
paletteHelper.SetTheme(theme);
}
public static void GetFrame(Frame navigationFrame)
{
frame = navigationFrame;
}
}
}

View File

@@ -0,0 +1,389 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using MaterialDesignThemes.Wpf;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using WPFWCSDemo.Models;
using WPFWCSDemo.Schedules;
using WPFWCSDemo.StateCode;
using WPFWCSDemo.Utilities;
using WPFWCSDemo.Views;
namespace WPFWCSDemo.ViewModels.Settings
{
public partial class SystemViewModel:ObservableObject
{
/// <summary>
/// 选中删除任务数据
/// </summary>
[ObservableProperty]
bool _isTaskDataDelete;
/// <summary>
/// 选中删除报警数据
/// </summary>
[ObservableProperty]
bool _isAlarmDataDelete;
/// <summary>
/// 实垛A线显示文本
/// </summary>
[ObservableProperty]
string _lineAStr = "重置A线请求标志";
/// <summary>
/// 实垛B线显示文本
/// </summary>
[ObservableProperty]
string _lineBStr = "重置B线请求标志";
/// <summary>
/// 实垛C线显示文本
/// </summary>
[ObservableProperty]
string _lineCStr = "重置C线请求标志";
/// <summary>
/// 实垛D线显示文本
/// </summary>
[ObservableProperty]
string _lineDStr = "重置D线请求标志";
/// <summary>
/// 实垛AB线显示文本
/// </summary>
[ObservableProperty]
string _lineABStr = "重置AB线请求标志";
/// <summary>
/// 实垛CD线显示文本
/// </summary>
[ObservableProperty]
string _lineCDStr = "重置CD线请求标志";
/// <summary>
/// 是否限制实垛A线生成任务 0-解禁 1-禁止
/// </summary>
[ObservableProperty]
bool _lineAIsEnable = true;
/// <summary>
/// 是否限制实垛B线生成任务 0-解禁 1-禁止
/// </summary>
[ObservableProperty]
bool _lineBIsEnable = true;
/// <summary>
/// 是否限制实垛C线生成任务 0-解禁 1-禁止
/// </summary>
[ObservableProperty]
bool _lineCIsEnable = true;
/// <summary>
/// 是否限制实垛D线生成任务 0-解禁 1-禁止
/// </summary>
[ObservableProperty]
bool _lineDIsEnable = true;
/// <summary>
/// 是否限制空托AB线生成任务 0-解禁 1-禁止
/// </summary>
[ObservableProperty]
bool _lineABIsEnable = true;
/// <summary>
/// 是否限制空托CD线生成任务 0-解禁 1-禁止
/// </summary>
[ObservableProperty]
bool _lineCDIsEnable = true;
/// <summary>
/// A手动允许下发标志
/// </summary>
public static bool lineAIsEnable = true;
/// <summary>
/// B手动允许下发标志
/// </summary>
public static bool lineBIsEnable = true;
/// <summary>
/// C手动允许下发标志
/// </summary>
public static bool lineCIsEnable = true;
/// <summary>
/// D手动允许下发标志
/// </summary>
public static bool lineDIsEnable = true;
/// <summary>
/// AB手动允许下发标志
/// </summary>
public static bool lineABIsEnable = true;
/// <summary>
/// CD手动允许下发标志
/// </summary>
public static bool lineCDIsEnable = true;
/// <summary>
/// 手动备份当前数据库
/// </summary>
[RelayCommand]
void GetSqlDBBackup()
{
if (MessageBox.Show("确定创建备份文件吗(此操作会生成一份备份文件)?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
SqlDatabaseMaintenance.SQLBackup();
}
else
{
MessageBox.Show("操作已取消");
}
}
/// <summary>
/// 清除近3个月之外所有任务记录(保留最近3个月内数据)
/// </summary>
[RelayCommand]
void DeleteDataOutOfTreeMouths()
{
if (MessageBox.Show("确定删除数据吗(此操作会保留最近3个月内的数据,且删除最近3个月之外的数据)?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
SqlHelper.ExecuteNonQuery("DELETE FROM TASK_HISTORY WHERE FINISHTIME<@FinishTime",
new SqlParameter("@FinishTime", DateTime.Now.AddMonths(-3).ToString("yyyy-MM"))
);
}
}
/// <summary>
/// 调度任务备份
/// </summary>
[RelayCommand]
void TaskBackup()
{
if (MessageBox.Show("确定创建备份文件吗?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
if (IsTaskDataDelete)
{
if (MessageBox.Show("将删除已备份的【调度任务历史记录】数据,是否继续?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
SqlDatabaseMaintenance.SQLTaskBackup("Month", -6, IsTaskDataDelete);
}
else
{
MessageBox.Show("备份操作已取消");
}
}
else
{
//选择仅备份不删除数据
SqlDatabaseMaintenance.SQLTaskBackup("Month", -6, false);
}
}
}
/// <summary>
/// 历史报警备份
/// </summary>
[RelayCommand]
void AlarmBackup()
{
if (MessageBox.Show("确定创建备份文件吗?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
if (IsAlarmDataDelete)
{
if (MessageBox.Show("将删除已备份的【报警历史记录】数据,是否继续?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
SqlDatabaseMaintenance.SQLAlarmBackup("Month", -6, IsAlarmDataDelete);
}
else
{
MessageBox.Show("备份操作已取消");
}
}
else
{
//选择仅备份不删除数据
SqlDatabaseMaintenance.SQLAlarmBackup("Month", -6, false);
}
}
}
/// <summary>
/// 货位初始化
/// </summary>
[RelayCommand]
void CargoInitialize()
{
string result = Microsoft.VisualBasic.Interaction.InputBox("Enter something:", "Input Dialog", "");
MessageBox.Show("You entered: " + result);
CargoTableInitialize.CargoSpaceInit(10,50,5);
}
/// <summary>
/// 手动控制输送线是否允许下发任务 true-允许 false-禁止
/// </summary>
/// <param name="lineName">实垛:A,B,C,D 空托:AB,CD</param>
[RelayCommand]
void LineIsEnabled(string lineName)
{
switch (lineName)
{
case "A":
if (LineAIsEnable)
{
if (MessageBox.Show("是否禁止A线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineAIsEnable = false;
lineAIsEnable = false;
LineAStr = "禁止下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineAStr}】", "USER");
}
}
else
{
if (MessageBox.Show("是否允许A线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineAIsEnable = true;
lineAIsEnable = true;
LineAStr = "允许下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineAStr}】", "USER");
}
}
break;
case "B":
if (LineBIsEnable)
{
if (MessageBox.Show("是否禁止B线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineBIsEnable = false;
lineBIsEnable = false;
LineBStr = "禁止下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineBStr}】", "USER");
}
}
else
{
if (MessageBox.Show("是否允许B线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineBIsEnable = true;
lineBIsEnable = true;
LineBStr = "允许下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineBStr}】", "USER");
}
}
break;
case "C":
if (LineCIsEnable)
{
if (MessageBox.Show("是否禁止C线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineCIsEnable = false;
lineCIsEnable = false;
LineCStr = "禁止下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineCStr}】", "USER");
}
}
else
{
if (MessageBox.Show("是否允许C线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineCIsEnable = true;
lineCIsEnable = true;
LineCStr = "允许下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineCStr}】", "USER");
}
}
break;
case "D":
if (LineDIsEnable)
{
if (MessageBox.Show("是否禁止D线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineDIsEnable = false;
lineDIsEnable = false;
LineDStr = "禁止下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineDStr}】", "USER");
}
}
else
{
if (MessageBox.Show("是否允许D线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineDIsEnable = true;
lineDIsEnable = true;
LineDStr = "允许下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineDStr}】", "USER");
}
}
break;
case "AB":
if (LineABIsEnable)
{
if (MessageBox.Show("是否禁止AB线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineABIsEnable = false;
lineABIsEnable = false;
LineABStr = "禁止下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineABStr}】", "USER");
}
}
else
{
if (MessageBox.Show("是否允许AB线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineABIsEnable = true;
lineABIsEnable = true;
LineABStr = "允许下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineABStr}】", "USER");
}
}
break;
case "CD":
if (LineCDIsEnable)
{
if (MessageBox.Show("是否禁止CD线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineCDIsEnable = false;
lineCDIsEnable = false;
LineCDStr = "禁止下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineCDStr}】", "USER");
}
}
else
{
if (MessageBox.Show("是否允许CD线生成任务?", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
LineCDIsEnable = true;
lineCDIsEnable = true;
LineCDStr = "允许下发";
SqlHelper.NewEventLog($"人工完成任务:{lineName}线切换为【{LineCDStr}】", "USER");
}
}
break;
}
}
}
}

View File

@@ -0,0 +1,673 @@
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.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WPFWCSDemo.Models.Tables;
using WPFWCSDemo.StateCode;
using WPFWCSDemo.Utilities;
namespace WPFWCSDemo.ViewModels
{
public partial class TaskHistoryViewModel : ObservableObject
{
public TaskHistoryViewModel()
{
TaskHistory = new ObservableCollection<TaskHistory>();
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");
LoadTaskHistory(1);
LoadColumnName();
PageInput = 1;
PageCurrent = 1;
PageInfo = $"当前 {PageCurrent} 页";
DynamicPage(PageCurrent);
}
/// <summary>
/// false-表示默认表数据集 true-表示查询后的表数据集
/// </summary>
bool b;
/// <summary>
/// 历史表数据
/// </summary>
[ObservableProperty]
ObservableCollection<TaskHistory> _taskHistory;
/// <summary>
/// 起始日期
/// </summary>
[ObservableProperty]
string? _dateStart;
/// <summary>
/// 起始时间
/// </summary>
[ObservableProperty]
string? _timeStart;
/// <summary>
/// 结束日期
/// </summary>
[ObservableProperty]
string? _dateEnd;
/// <summary>
/// 结束时间
/// </summary>
[ObservableProperty]
string? _timeEnd;
/// <summary>
/// 默认值-起始日期
/// </summary>
[ObservableProperty]
string? _txtDateStart;
/// <summary>
/// 默认值-起始时间
/// </summary>
[ObservableProperty]
string? _txtTimeStart;
/// <summary>
/// 默认值-结束日期
/// </summary>
[ObservableProperty]
string? _txtDateEnd;
/// <summary>
/// 默认值-结束时间
/// </summary>
[ObservableProperty]
string? _txtTimeEnd;
/// <summary>
/// 查询字段选择项集合
/// </summary>
[ObservableProperty]
ObservableCollection<string> _columnList = new ObservableCollection<string>();
/// <summary>
/// 查询字段名
/// </summary>
[ObservableProperty]
string _columnName;
/// <summary>
/// 查询字段名
/// </summary>
Dictionary<string, string> columnDic = new Dictionary<string, string>();
/// <summary>
/// 查询关键词
/// </summary>
[ObservableProperty]
string _keywords;
/// <summary>
/// 加载/重载表数据
/// </summary>
/// <param name="page">页数</param>
void LoadTaskHistory(int page)
{
b = false;
TaskHistory.Clear();
//DataTable? dtCount = SqlHelper.ExecuteTable("SELECT * FROM TASK_HISTORY ORDER BY CREATETIME DESC");
DataTable? dtCount = SqlHelper.ExecuteTable("SELECT * FROM TASK_HISTORY_VIEW ORDER BY 结束时间 DESC");
//DataTable? dt = SqlHelper.ExecuteTable("SELECT * FROM TASK_HISTORY ORDER BY CREATETIME DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
DataTable? dt = SqlHelper.ExecuteTable("SELECT * FROM TASK_HISTORY_VIEW ORDER BY 结束时间 DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
new SqlParameter("@Rows",page - 1));
var datas = dt.Rows;
//遍历表中每行数据并初始化值
foreach (DataRow data in datas)
{
TaskHistory t = new TaskHistory();
//t.JobId = data["JobId"].ToString();
//t.TaskId = data["TaskId"].ToString();
////t.PalletId = data["PalletId"].ToString();
//t.SourceLocation = data["SourceLocation"].ToString();
//t.TargetLocation = data["TargetLocation"].ToString();
//t.TaskType = data["TaskType"].ToString();
//t.TaskState = data["TaskState"].ToString();
//t.ScheduleState = data["ScheduleState"].ToString();
//t.ReportState = (int)data["ReportState"];
//t.CreateTime = data["CreateTime"].ToString();
//t.ScheduleTime = data["ScheduleTime"].ToString();
//t.FinishTime = data["FinishTime"].ToString();
t.JobId = data["环穿编号"].ToString();
t.TaskId = data["任务号"].ToString();
//t.PalletId = data["PalletId"].ToString();
t.SourceLocation = data["源站点"].ToString();
t.TargetLocation = data["目标站点"].ToString();
t.TaskType = data["任务类型"].ToString();
t.TaskState = data["任务状态"].ToString();
t.ScheduleState = data["调度状态"].ToString();
//t.ReportState = data["取货状态"].ToString();
t.CreateTime = Convert.ToDateTime(data["生成时间"]);
t.ScheduleTime = Convert.ToDateTime(data["调度时间"]);
t.FinishTime = Convert.ToDateTime(data["结束时间"]);
//数据结果
TaskHistory.Add(t);
}
UpdatePageInfo(dtCount, page);
}
/// <summary>
/// 加载/重载表数据---指定数据集
/// </summary>
void LoadTaskHistory(DataTable dt)
{
TaskHistory.Clear();
var datas = dt.Rows;
//遍历表中每行数据并初始化值
foreach (DataRow data in datas)
{
TaskHistory t = new()
{
//JobId = data["JobId"].ToString(),
//TaskId = data["TaskId"].ToString(),
////PalletId = data["PalletId"].ToString(),
//SourceLocation = data["SourceLocation"].ToString(),
//TargetLocation = data["TargetLocation"].ToString(),
//TaskType = data["TaskType"].ToString(),
//TaskState = data["TaskState"].ToString(),
//ScheduleState = data["ScheduleState"].ToString(),
//ReportState = (int)data["ReportState"],
//CreateTime = data["CreateTime"].ToString(),
//ScheduleTime = data["ScheduleTime"].ToString(),
//FinishTime = data["FinishTime"].ToString()
JobId = data["环穿编号"].ToString(),
TaskId = data["任务号"].ToString(),
//t.PalletId = data["PalletId"].ToString(),
SourceLocation = data["源站点"].ToString(),
TargetLocation = data["目标站点"].ToString(),
TaskType = data["任务类型"].ToString(),
TaskState = data["任务状态"].ToString(),
ScheduleState = data["调度状态"].ToString(),
ReportState = data["取货状态"].ToString(),
CreateTime = Convert.ToDateTime(data["生成时间"]),
ScheduleTime = Convert.ToDateTime(data["调度时间"]),
FinishTime = Convert.ToDateTime(data["结束时间"]),
};
//数据结果
TaskHistory.Add(t);
}
}
/// <summary>
/// 加载可选的搜索字段
/// </summary>
void LoadColumnName()
{
//下拉框选项填充
ColumnList.Clear();
ColumnList.Add("环穿编号");
ColumnList.Add("任务号");
//ColumnList.Add("托盘号");
ColumnList.Add("任务类型");
ColumnList.Add("源站点");
ColumnList.Add("目标站点");
ColumnList.Add("任务状态");
ColumnList.Add("生成时间");
ColumnList.Add("调度时间");
ColumnList.Add("完成时间");
//列名映射
columnDic.Clear();
columnDic.Add("环穿编号", "环穿编号");
columnDic.Add("任务号", "任务号");
//columnDic.Add("托盘号", "PalletId");
columnDic.Add("任务类型", "任务类型");
columnDic.Add("源站点", "源站点");
columnDic.Add("目标站点", "目标站点");
columnDic.Add("任务状态", "任务状态");
columnDic.Add("生成时间", "生成时间");
columnDic.Add("调度时间", "调度时间");
columnDic.Add("完成时间", "完成时间");
}
/// <summary>
/// 查询指令获取显示结果
/// </summary>
/// <param name="num">页数</param>
[RelayCommand]
void Query(string num)
{
b = true;
TaskHistory.Clear();
DataTable? dt;
DataTable? dtCount;
if (!DateStringFormat())
{
return;
}
try
{
//搜索条件为空或其他
if (!string.IsNullOrEmpty(ColumnName) && !string.IsNullOrEmpty(Keywords.Trim()))
{
dtCount = SqlHelper.ExecuteTable(
//$"SELECT * FROM TASK_HISTORY WHERE @ColumnName like @Keywords AND FINISHTIME>=@StartTime AND FINISHTIME<@FinishTime ORDER BY CREATETIME DESC",
$"SELECT * FROM TASK_HISTORY_VIEW WHERE {ColumnName} LIKE @Keywords AND 结束时间>=@StartTime AND 结束时间<@FinishTime ORDER BY 结束时间 DESC",
//new SqlParameter("@ColumnName", ColumnName),
new SqlParameter("@Keywords", $"%{Keywords.Trim()}%"),
new SqlParameter("@StartTime", dateTimeStart),
new SqlParameter("@FinishTime", dateTimeEnd)
);
dt = SqlHelper.ExecuteTable(
//$"SELECT * FROM TASK_HISTORY WHERE @ColumnName like @Keywords AND FINISHTIME>=@StartTime AND FINISHTIME<@FinishTime ORDER BY CREATETIME DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
$"SELECT * FROM TASK_HISTORY_VIEW WHERE {ColumnName} LIKE @Keywords AND 结束时间>=@StartTime AND 结束时间<@FinishTime ORDER BY 结束时间 DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
//new SqlParameter("@ColumnName", ColumnName),
new SqlParameter("@Keywords", $"%{Keywords.Trim()}%"),
new SqlParameter("@StartTime", dateTimeStart),
new SqlParameter("@FinishTime", dateTimeEnd),
new SqlParameter("@Rows", int.Parse(num) - 1)
);
}
else
{
dtCount = SqlHelper.ExecuteTable(
//$"SELECT * FROM TASK_HISTORY WHERE FINISHTIME>=@StartTime AND FINISHTIME<@FinishTime ORDER BY CREATETIME DESC",
$"SELECT * FROM TASK_HISTORY_VIEW WHERE 结束时间>=@StartTime AND 结束时间<@FinishTime ORDER BY 结束时间 DESC",
new SqlParameter("@StartTime", dateTimeStart),
new SqlParameter("@FinishTime", dateTimeEnd)
);
dt = SqlHelper.ExecuteTable(
//$"SELECT * FROM TASK_HISTORY WHERE FINISHTIME>=@StartTime AND FINISHTIME<@FinishTime ORDER BY CREATETIME DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
$"SELECT * FROM TASK_HISTORY_VIEW WHERE 结束时间>=@StartTime AND 结束时间<@FinishTime ORDER BY 结束时间 DESC OFFSET @Rows ROW FETCH NEXT 10 ROW ONLY",
new SqlParameter("@StartTime", dateTimeStart),
new SqlParameter("@FinishTime", dateTimeEnd),
new SqlParameter("@Rows", int.Parse(num) - 1)
);
}
LoadTaskHistory(dt);
UpdatePageInfo(dtCount, num);
}
catch (Exception)
{
}
}
/// <summary>
/// 重置选择
/// </summary>
[RelayCommand]
void Clear()
{
ColumnName = string.Empty;
Keywords = string.Empty;
TaskHistory.Clear();
LoadTaskHistory(1);
}
//---------------------------------时间字符串格式化对象---------------------------------
DateTime dateTimeStart;
DateTime dateTimeEnd;
/// <summary>
/// 日期格式处理
/// </summary>
/// <returns>格式是否正确 true-正确 false-错误</returns>
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 = 10;
/// <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>
/// <param name="pageCurrent">跳转后的页数</param>
void DynamicPage(int pageCurrent)
{
//设置最多显示5页按钮
Pages.Clear();
//总页数小于8-显示1-X页
if (PageCount < 8 && pageCurrent < 8)
{
for (int i = 1; i < PageCount; i++)
{
Pages.Add(i.ToString());
}
}
//总页数大于等于8
else
{
//距离尾页多于3页
if (PageCount - pageCurrent >= 3)
{
//1---显示前7页
if (pageCurrent < 8)
{
for (int i = 1; i < 8; i++)
{
Pages.Add(i.ToString());
}
}
else
{
//显示当前页的前3和后3页码
for (int i = pageCurrent - 3; i <= pageCurrent + 3; i++)
{
Pages.Add(i.ToString());
}
}
}
//距离尾页是否少于3页---显示尾页前7页
else
{
if (PageCount - pageCurrent <= 2)
{
for (int i = PageCount - 6; i <= PageCount; i++)
{
Pages.Add(i.ToString());
}
}
}
}
}
/// <summary>
/// 获取数据集的总条数和页码数,更新属性
/// </summary>
/// <param name="dt"></param>
/// <param name="pageCurrent">当前页</param>
void UpdatePageInfo(DataTable dt, int pageCurrent)
{
//总数据条数
DataCountNumber = dt.Rows.Count;
//文本显示
DataCount = $"共 {DataCountNumber} 条";
//总页数
if (DataCountNumber % countPerPage == 0)
{
PageCount = DataCountNumber / countPerPage;
}
else
{
PageCount = DataCountNumber / countPerPage + 1;
}
PageCurrent = pageCurrent;
DynamicPage(pageCurrent);
}
void UpdatePageInfo(DataTable dt, string pageCurrent)
{
//总数据条数
DataCountNumber = dt.Rows.Count;
//文本显示
DataCount = $"共 {DataCountNumber} 条";
//总页数
if (DataCountNumber % countPerPage == 0)
{
PageCount = DataCountNumber / countPerPage;
}
else
{
PageCount = DataCountNumber / countPerPage + 1;
}
PageCurrent = int.Parse(pageCurrent);
DynamicPage(int.Parse(pageCurrent));
}
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
//********************************************跳转页码时查询要附加顶部查询条件获取共同查询结果显示*******************************************
/// <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)
{
//默认数据集条件下跳转
LoadTaskHistory(index);
}
else
{
//查询之后的数据集条件下跳转
Query(index.ToString());
}
if (pageNumber <= PageCount)
{
PageCurrent = pageNumber;
PageInfo = $"当前 {pageNumber} 页";
}
}
}
}

View File

@@ -0,0 +1,763 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.EntityFrameworkCore;
using Microsoft.Xaml.Behaviors.Layout;
using Newtonsoft.Json;
using Serilog;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
using WPFWCSDemo.Common;
using WPFWCSDemo.Data;
using WPFWCSDemo.Models.Devices.CircleRGV;
using WPFWCSDemo.Models.Devices.CircleRGVStation;
using WPFWCSDemo.Models.Tables;
using WPFWCSDemo.StateCode;
using WPFWCSDemo.Utilities;
using WPFWCSDemo.Utilities.Table;
using WPFWCSDemo.Views.CustomComponent;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar;
namespace WPFWCSDemo.ViewModels
{
public partial class TaskViewModel : ObservableObject
{
/// <summary>
/// 用于实时更新任务表的定时器
/// </summary>
private DispatcherTimer dispatcherTimer;
public TaskViewModel()
{
TaskRT = new ObservableCollection<TaskRT>();
ColumnList = new List<string>();
col = new Dictionary<string, string>();
SourceLocations = new List<int>();
TargetLocations = new List<int>();
RGVNumbers = new List<int>();
LoadTaskGrid();
LoadColumns();
LocationInitialize();
//Task.Run(() => LoadTaskGridAsync());
b = true;
// 设置定时器属性
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(6); // 设置时间间隔
dispatcherTimer.Tick += DispatcherTimer_Tick; // 添加事件处理程序
dispatcherTimer.Start(); // 启动计时器
}
//调度任务表刷新参数
private void DispatcherTimer_Tick(object? sender, EventArgs e)
{
if (b)
{
LoadTaskGrid();
}
}
/// <summary>
/// 是否更新任务表的标志
/// </summary>
bool b;
/// <summary>
/// 调度任务字段---原数据/视图数据
/// </summary>
[ObservableProperty]
ObservableCollection<TaskRT> _taskRT;
/// <summary>
/// 搜索关键字
/// </summary>
[ObservableProperty]
string? _keywords;
/// <summary>
/// 筛选列表集合
/// </summary>
[ObservableProperty]
List<string> _columnList;
/// <summary>
/// 筛选列表集合对应的查询字段
/// </summary>
Dictionary<string, string> col;
/// <summary>
/// 筛选列表文本
/// </summary>
[ObservableProperty]
string? _columnName;
/// <summary>
/// 筛选列表文本选择项
/// </summary>
[ObservableProperty]
string? _columnNameSelected;
/// <summary>
/// 筛选列表选项
/// </summary>
[ObservableProperty]
int _taskTypeSelectedIndex;
/// <summary>
/// 右侧对话框弹出属性
/// </summary>
[ObservableProperty]
bool _isRightDrawerOpen;
/// <summary>
/// 顶部对话框弹出属性
/// </summary>
[ObservableProperty]
bool _isTopDrawerOpen;
/// <summary>
/// 站点初始化集合
/// </summary>
[ObservableProperty]
int _rowCount;
[ObservableProperty]
int _columnCount;
[ObservableProperty]
int _floorCount;
[ObservableProperty]
List<int> _rows;
[ObservableProperty]
List<int> _columns;
[ObservableProperty]
List<int> _floors;
/// <summary>
/// 取放货站点集合
/// </summary>
[ObservableProperty]
List<int> _sourceLocations;
[ObservableProperty]
List<int> _targetLocations;
/// <summary>
/// 测试下发界面任务类型
/// </summary>
[ObservableProperty]
int _testingTaskTypeIndex;
/// <summary>
/// 任务类型
/// </summary>
[ObservableProperty]
int _selectedTaskTypeIndex;
/// <summary>
/// 输入托盘号
/// </summary>
[ObservableProperty]
string _inputTaskId;
/// <summary>
/// 取货站点
/// </summary>
[ObservableProperty]
int _selectedSourceLocation;
/// <summary>
/// 放货站点
/// </summary>
[ObservableProperty]
int _selectedTargetLocation;
/// <summary>
/// 小车编号集合
/// </summary>
[ObservableProperty]
List<int> _rGVNumbers;
/// <summary>
/// 选中小车编号
/// </summary>
[ObservableProperty]
int _selectedRGVNumber;
/// <summary>
/// 右侧对话框弹出命令
/// </summary>
[RelayCommand]
private void NewTask()
{
IsRightDrawerOpen = true;
}
/// <summary>
/// 顶部对话框弹出命令---堆垛机测试
/// </summary>
[RelayCommand]
private void StackerTesting()
{
IsTopDrawerOpen = true;
}
/// <summary>
/// 更改任务类型选项直接更新表
/// </summary>
//[RelayCommand]
void TaskTypeSelectItemChanged()
{
using var context = new AppDbContext();
List<TaskRT> tasks;
if (TaskTypeSelectedIndex == 1)
{
tasks = context.Set<TaskRT>()
.OrderByDescending(t => t.CreateTime)
.Where(t => t.TaskType == 10)
.ToList();
}
else if (TaskTypeSelectedIndex == 2)
{
tasks = context.Set<TaskRT>()
.OrderByDescending(t => t.CreateTime)
.Where(t => t.TaskType == 11)
.ToList();
}
else
{
tasks = context.Set<TaskRT>()
.OrderByDescending(t => t.CreateTime)
.ToList();
}
TaskRT.Clear();
//遍历表中每行数据并初始化值
foreach (TaskRT task in tasks)
{
TaskRT.Add(task);
}
}
/// <summary>
/// 查询任务
/// </summary>
[RelayCommand]
public void Query()
{
//关键词不为空且列名不为空
if (!string.IsNullOrEmpty(Keywords) && !string.IsNullOrEmpty(ColumnName))
{
using var context = new AppDbContext();
var tasks=context.Set<TaskRT>()
.FromSqlInterpolated($"SELECT * FROM TASK WHERE {col[ColumnName]} LIKE %{Keywords}% ORDER BY CREATETIME DESC")
.ToList();
TaskRT.Clear();
//遍历表中每行数据并初始化值
foreach (TaskRT task in tasks)
{
TaskRT.Add(task);
}
}
else
{
LoadTaskGrid();
}
b = false;
}
/// <summary>
/// 重置筛选项
/// </summary>
[RelayCommand]
void Clear()
{
Keywords = string.Empty;
ColumnName = string.Empty;
LoadTaskGrid();
b = true;
}
#region 添加新任务相关
// 下拉框获取值属性 (源/目标排、列、层)
/// <summary>
/// 点击新建任务按钮命令
/// </summary>
[RelayCommand]
public void AddTask()
{
InputCheck();
//MessageBox.Show(SelectedTaskType);
//获取任务参数值
TaskRT taskRT = new TaskRT
{
TaskId = SqlHelper.GetTaskIdByManualGeneration().ToString(),//使用int类型初始值不是空 指定9起始的任务号为人工操作标识
SourceLocation = SelectedSourceLocation.ToString(),
TargetLocation = SelectedTargetLocation.ToString(),
TaskState = TaskStateCode.Task_Running,
CreateTime = DateTime.Now,
//ReportState = 0
};
//任务校验和添加新任务(区分任务类型)
if (SelectedTaskTypeIndex == 0)
{
taskRT.TaskType = 10;
}
else if (SelectedTaskTypeIndex == 1)
{
taskRT.TaskType = 11;
}
else if (SelectedTaskTypeIndex == 2 || SelectedTaskTypeIndex == 3)
{
taskRT.TaskType = SelectedTaskTypeIndex;
}
else
{
MessageBox.Show("任务类型错误!");
return;
}
Insert(taskRT, taskRT.TaskType);
SqlHelper.NewEventLog($"手动下发调度任务:任务号:{taskRT.TaskId}", "USER");
//重载任务表
LoadTaskGrid();
}
#endregion
/// <summary>
/// 加载下拉框内容
/// </summary>
public void LoadColumns()
{
ColumnList.Clear();
//ColumnList.Add("作业号");
ColumnList.Add("任务号");
//ColumnList.Add("托盘号");
ColumnList.Add("任务类型");
ColumnList.Add("源站点");
ColumnList.Add("目标站点");
ColumnList.Add("任务状态");
//ColumnList.Add("生成时间");
col.Clear();
//col.Add("作业号", "JobId");
col.Add("任务号", "TaskId");
//col.Add("托盘号", "PalletId");
col.Add("任务类型", "TaskType");
col.Add("源站点", "SourceLocation");
col.Add("目标站点", "TargetLocation");
col.Add("任务状态", "TaskState");
//col.Add("生成时间", "CreateTime");
RGVNumbers.Clear();
for (int i = 0; i < RGVStation.RGVCount; i++)
{
RGVNumbers.Add(i);
}
}
/// <summary>
/// 加载表格内容
/// </summary>
public void LoadTaskGrid()
{
using var context = new AppDbContext();
var tasks = context.Set<TaskRT>()
.OrderByDescending(t => t.CreateTime)
.ToList();
TaskRT.Clear();
//遍历表中每行数据并初始化值
foreach (TaskRT task in tasks)
{
TaskRT.Add(task);
}
}
/// <summary>
/// 向调度表中插入任务
/// </summary>
/// <param name="TaskRT">TaskRT类的实例化对象</param>
/// <param name="taskType">任务类型</param>
/// <returns></returns>
public void Insert(TaskRT taskRT, int taskType)
{
try
{
using var context = new AppDbContext();
context.Set<TaskRT>()
.Add(taskRT);
int result = context.SaveChanges();
if (result == 1) Log.Warning($"【手动添加调度任务】任务号:{taskRT.TaskId},{JsonConvert.SerializeObject(taskRT)}");
}
catch (DbUpdateException e)
{
MessageBox.Show($"发生了预期之外的错误:{e.Message}(错误代码:TVM000002)");
}
LoadTaskGrid();
}
/// <summary>
/// 站点信息初始化
/// </summary>
void LocationInitialize()
{
//Rows = new List<int>();
//Columns = new List<int>();
//Floors = new List<int>();
//RowCount = int.Parse(ConfigurationManager.AppSettings["Row"]);
//for (int i = 1; i <= RowCount; i++)
//{
// Rows.Add(i);
//}
//ColumnCount = int.Parse(ConfigurationManager.AppSettings["Column"]);
//for (int i = 1; i <= ColumnCount; i++)
//{
// Columns.Add(i);
//}
//FloorCount = int.Parse(ConfigurationManager.AppSettings["Floor"]);
//for (int i = 1; i <= FloorCount; i++)
//{
// Floors.Add(i);
//}
SourceLocations.Clear();
foreach (var item in CircleRGVsViewModel.route)
{
SourceLocations.Add(item.Key);
}
}
/// <summary>
/// 取货站点对应放货站点
/// </summary>
[RelayCommand]
void SourceToTarget()
{
try
{
SelectedTargetLocation = CircleRGVsViewModel.route[SelectedSourceLocation];
}
catch
{
}
}
/// <summary>
/// 下发测试任务
/// </summary>
[RelayCommand]
void SendRGVTest()
{
if (MessageBox.Show("此操作会向环穿地面站PLC直接写入命令!是否继续?","",MessageBoxButton.YesNo) != MessageBoxResult.OK)
{
return;
}
CircleRGVStationCommand circleRGVStationCommand = new CircleRGVStationCommand()
{
Write_DeviceNumber = SelectedRGVNumber,
Write_TaskNumber = SqlHelper.GetTaskIdByManualGeneration(),
Write_TaskType = TestingTaskTypeIndex + 1,
Write_SourceLocation = SelectedSourceLocation,
Write_TargetLocation = SelectedTargetLocation,
};
CircleRGVsViewModel.SendRGVStationCommand(circleRGVStationCommand);
Log.Information($"【环穿下发任务测试】直接向地面站PLC下发任务:{JsonConvert.SerializeObject(circleRGVStationCommand)}");
SqlHelper.NewEventLog($"向地面站PLC直接写入测试任务:任务号:{circleRGVStationCommand.Write_TaskNumber}", "USER");
IsTopDrawerOpen = false;
}
/// <summary>
/// 清空选择项
/// </summary>
[RelayCommand]
void TestClear()
{
SelectedRGVNumber = 0;
SelectedSourceLocation = 0;
SelectedTargetLocation = 0;
}
/// <summary>
/// 新任务输入校验
/// </summary>
public void InputCheck()
{
//跨巷道使用
if (string.IsNullOrEmpty(SelectedSourceLocation.ToString().Trim()))
{
MessageBox.Show("请选择取货站点!");
return;
}
if (string.IsNullOrEmpty(SelectedTargetLocation.ToString().Trim()))
{
MessageBox.Show("请选择目标站点!");
return;
}
}
Action<string> action;
//[RelayCommand]
void TaskFinishHandler()
{
InputDialog inputDialog = new InputDialog();
inputDialog.ShowDialog();
action = TaskFinish;
}
void TaskCancelHandler()
{
InputDialog inputDialog = new InputDialog();
inputDialog.ShowDialog();
action = TaskDelete;
}
void UpdateTaskStateToReadyHandler()
{
InputDialog inputDialog = new InputDialog();
inputDialog.ShowDialog();
action = UpdateTaskStateToReady;
}
/// <summary>
/// 手动完成任务
/// </summary>
[RelayCommand]
void TaskFinish(string taskId)
{
using var context = new AppDbContext();
var task = context.Set<TaskRT>()
.Where(t => t.TaskId == taskId)
.FirstOrDefault();
if (task == null)
{
MessageBox.Show("获取任务号错误!自动移除该任务");
context.Database
.ExecuteSqlInterpolated($"DELETE FROM TASK WHERE TASKID={taskId}");
context.SaveChanges();
return;
}
string taskType = "";
switch (task.TaskType)
{
case 10:
taskType = "实垛";
break;
case 11:
taskType = "空托";
break;
default:
break;
}
if (MessageBox.Show($"确认人工完成任务号:{taskId}的任务?\r\n(错误的操作时机可能会导致生成空任务)", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
task.TaskState = TaskStateCode.Task_Finish_Manual;
if (context.SaveChanges() == 1)
{
Log.Information($"【人工操作】手动完成任务,任务号:{taskId}");
SqlHelper.NewEventLog($"人工完成{taskType}任务:{taskId}", "USER");
}
}
LoadTaskGrid();
}
/// <summary>
/// 手动删除(取消)任务
/// </summary>
[RelayCommand]
void TaskDelete(string taskId)
{
using var context = new AppDbContext();
var task = context.Set<TaskRT>()
.Where(t => t.TaskId == taskId)
.FirstOrDefault();
if (task == null)
{
MessageBox.Show("获取任务号错误!自动移除该任务");
context.Database
.ExecuteSqlInterpolated($"DELETE FROM TASK WHERE TASKID={taskId}");
context.SaveChanges();
return;
}
string taskType = "";
switch (task.TaskType)
{
case 10:
taskType = "实垛";
break;
case 11:
taskType = "空托";
break;
default:
break;
}
if (MessageBox.Show($"确认人工取消任务号:{taskId}的任务?\r\n(错误的操作时机可能会导致生成空任务)", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
task.TaskState = TaskStateCode.Task_Finish_Cancel;
if (context.SaveChanges() == 1)
{
Log.Information($"【人工操作】手动取消任务,任务号:{taskId}");
SqlHelper.NewEventLog($"人工取消{taskType}任务:{taskId}", "USER");
}
}
LoadTaskGrid();
}
/// <summary>
/// 当向环穿下发任务失败时,可以选择重新下发
/// 只能在调度状态为【环穿-待执行】时可用
/// </summary>
/// <param name="taskId"></param>
[RelayCommand]
void UpdateTaskStateToReady(string taskId)
{
using var context = new AppDbContext();
var task = context.Set<TaskRT>()
.Where(t => t.TaskId == taskId && t.ScheduleState== ScheduleStateCode.Trans_CircleRGV_Ready)
.FirstOrDefault();
if (task == null)
{
MessageBox.Show("设备运行时的任务无法重下!");
return;
}
if (MessageBox.Show($"确认将任务:{taskId}的任务状态更改为【待执行】?\r\n此操作会重新下发当前任务(仅在环穿调度状态为【环穿-待执行】时生效)", "警告", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
task.TaskState= TaskStateCode.Task_Ready;
if (context.SaveChanges() == 1)
{
Log.Information($"【人工操作】重新下发任务,任务号:{taskId}");
SqlHelper.NewEventLog($"人工重下任务:{taskId}", "USER");
}
}
LoadTaskGrid();
}
}
}