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 { /// /// 用于监控环穿参数面板的定时器 /// private DispatcherTimer dispatcherTimer; public DataInfoViewModel() { //传递frame控件用于顶部面板点击事件跳转 //_navigationFrame = navigationFrame; TaskBars = new ObservableCollection(); Tasks = new ObservableCollection(); RowSeriesTitles = new string[13]; RowSeriesCollection = new SeriesCollection(new Series[13]); RowValues = new ChartValues(new double[13]); PieSeriesCollection = new SeriesCollection(); PieValuesCount = new ChartValues(new int[4]); LineValuesCount = new ChartValues(new int[4]); LineValuesPallets = new ChartValues(new int[7]); LineValuesGoods = new ChartValues(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(); } /// /// 执行中任务动态转圈元素显示 /// [ObservableProperty] Visibility _taskExecutingProgressIsVisible; /// /// 报警动态转圈元素显示 /// [ObservableProperty] Visibility _alarmProgressIsVisible; /// /// 上方任务面板对象 /// [ObservableProperty] ObservableCollection _taskBars; /// /// 顶部参数面板属性 /// 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" } /// /// 数据展示1---顶部参数面板数据 /// 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 _tasks; /// /// 部分执行中任务展示面板 /// 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 }); } /// /// 数据展示2---获取日期最早的3条任务 /// 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; } /// /// 饼图数据集合 /// [ObservableProperty] SeriesCollection _pieSeriesCollection; /// /// 数据集合值 /// [ObservableProperty] double[] pieValues = new double[4]; //设备使用次数 [ObservableProperty] ChartValues _pieValuesCount; string[] s = new string[] { "1009线", "1010线", "1011线", "1012线" }; int[] dValuesPie = new int[4]; /// /// 数据展示4---饼图面板 /// 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 { PieValuesCount[i] }, DataLabels = false, }); } } /// /// 图形数据集合 /// [ObservableProperty] SeriesCollection _rowSeriesCollection; /// /// 运行里程集合 /// [ObservableProperty] ChartValues _rowValues; List brushes = new List() { 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, }; /// /// 标题集合 /// [ObservableProperty] string[] _rowSeriesTitles; /// /// 里程统计条形图初始化 /// private void GetRowsInitialize() { List 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() .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 { RowValues[i] }, // RowPadding = 10, // MinHeight = 30, //}); //} } private void GetRows() { List 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 lineValuesCount; int[] dValuesWeekLine = new int[4]; /// /// 数据展示3---曲线图面板1---月内(每周)任务数量 /// 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; /// /// 空托任务曲线集合初始化 /// [ObservableProperty] ChartValues lineValuesPallets; /// /// 实垛任务曲线集合初始化 /// [ObservableProperty] ChartValues lineValuesGoods; int[] dValuesTask = new int[7]; int[] dValuesTask1 = new int[7]; /// /// 数据展示5---曲线图面板2---当日各类型任务数量 /// 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]; } } /// /// 获取时间字符串 /// /// 以当天为准偏移i天 /// 偏移天数 string GetDate(int i) { return DateTime.Now.AddDays(i).ToString(TimeFormat.stringFormatDateOnly); } } }