using CommunityToolkit.Mvvm.Input; using GalaSoft.MvvmLight; using LiveCharts; using LiveCharts.Defaults; using LiveCharts.Wpf; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using SlnMesnac.Model.domain; using SlnMesnac.Model.dto.taskType; using SlnMesnac.WPF.Model; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Documents; using System.Windows.Media; namespace SlnMesnac.WPF.ViewModel { public partial class IndexViewModel : ViewModelBase { private ISqlSugarClient sqlSugarClient; private readonly ILogger _logger; public IndexViewModel() { sqlSugarClient = App.ServiceProvider.GetService()!; _logger = App.ServiceProvider.GetService>()!; InitData(); } [RelayCommand] public void DeleteTask(int? id) { try { var result = MessageBox.Show("是否确认删除计划!", "确认", MessageBoxButton.YesNo); if (result == MessageBoxResult.Yes) { WcsTask? wcsTask = sqlSugarClient.Queryable().Where(x => x.Id == id).First(); if (wcsTask != null && (wcsTask.TaskType == StaticTaskType.MoveLocationTask || wcsTask.TaskType == StaticTaskType.SupplyEmptyPalletTask || wcsTask.TaskType == StaticTaskType.TransferMaterialBoxTask)) { if (wcsTask.TaskStatus >= 2) { //举着箱子去异常库位 wcsTask.IsDelete = 2; } else { //删除任务 wcsTask.IsDelete = 1; } } else { wcsTask.IsDelete = 1; } sqlSugarClient.Updateable(wcsTask).ExecuteCommand(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void InitData() { Task.Run(async () => { while (true) { GetTaskList(); await RefreChartAsync(); await LoadAgvDataAsync(); //PrintMessageToListBox("测试消息" + Guid.NewGuid()); await Task.Delay(5000); } }); } #region 参数定义 private ObservableCollection listItems = new ObservableCollection(); /// /// AGV状态信息列表 /// private ObservableCollection agvList = new ObservableCollection(); public ObservableCollection AgvList { get { return agvList; } set { agvList = value; RaisePropertyChanged(() => AgvList); } } /// /// 任务列表 /// private ObservableCollection wcsTaskItems = new ObservableCollection(); public ObservableCollection WcsTaskItems { get { return wcsTaskItems; } set { wcsTaskItems = value; RaisePropertyChanged(() => WcsTaskItems); } } /// /// 日志LisBox数据模板 /// private IEnumerable logInfoListBox; public IEnumerable LogInfoListBox { get { return logInfoListBox; } set { logInfoListBox = value; RaisePropertyChanged(() => LogInfoListBox); } } #region 日产量柱状图X轴日期 /// /// 日产量柱状图X轴日期 /// private List productionHourList = new List(); public List ProductionHourList { get { return productionHourList; } set { productionHourList = value; } } #endregion 日产量柱状图X轴日期 #region 型号统计柱状图 /// /// 型号统计柱状图 /// private SeriesCollection achievement = new SeriesCollection(); public SeriesCollection Achievement { get { return achievement; } set { achievement = value; } } #endregion 型号统计柱状图 #endregion 参数定义 /// /// 获取任务列表 /// /// private void GetTaskList() { List tasks = sqlSugarClient.Queryable().ToList(); Application.Current.Dispatcher.Invoke(() => { WcsTaskItems.Clear(); if (tasks != null && tasks.Count > 0) { foreach (var task in tasks) { WcsTaskItems.Add(task); } } }); } /// /// 系统运行日志输出 /// /// private void PrintMessageToListBox(string message) { try { string formattedMessage = $"{DateTime.Now.ToString("HH:mm:ss.ss")} ==> {message}"; lock (listItems) { listItems.Add(formattedMessage); while (listItems.Count > 120) { listItems.RemoveAt(0); } var orderedList = listItems.OrderByDescending(x => x).ToList(); // 排序后转为 List Application.Current.Dispatcher.Invoke(() => { LogInfoListBox = orderedList; // 更新 UI }); } } catch (Exception ex) { _logger.LogError($"日志数据绑定异常:{ex.Message}"); } } /// /// 加载AGV数据 /// private async Task LoadAgvDataAsync() { try { List agvList = await sqlSugarClient.Queryable().OrderBy(x => x.RobotCode).ToListAsync(); await Application.Current.Dispatcher.InvokeAsync(() => { AgvList.Clear(); foreach (WcsAgvStatus agv in agvList) { AgvInfo? agvPage = AgvList.FirstOrDefault(x => x.Name == agv.RobotCode); if (agvPage != null) { agvPage.Battery = agv.Battery; agvPage.IsOnline = bool.Parse(agv.Online); agvPage.Status = agv.StatusDetail; agvPage.ImageSource = GetPicturePathByStatus(agv.Status); } else { AgvList.Add(new AgvInfo { Name = agv.RobotCode, Battery = agv.Battery, IsOnline = bool.Parse(agv.Online), Status = agv.StatusDetail, ImageSource = GetPicturePathByStatus(agv.Status) }); } } }); } catch (Exception ex) { _logger.LogError(ex.Message); } } private string GetPicturePathByStatus(string status) { List okStrings = new List() { "1", "2", "4", "6", "7", "8", "63", "67", "68", "69", "70", "151", "200", "201", "202", "203", "246", "247", "248" }; if (okStrings.Contains(status)) { return "/Templates/image/agv-green.png"; } else { return "/Templates/image/agv-red.png"; } } private async Task RefreChartAsync() { try { // 查询所有任务记录 List list = await sqlSugarClient.Queryable().Where(x => x.CreatedTime >= DateTime.Now.AddHours(-8)).ToListAsync(); await Application.Current.Dispatcher.InvokeAsync(() => { ProductionHourList.Clear(); // 生成最近八小时的小时列表 for (int i = 7; i >= 0; i--) { DateTime hour = DateTime.Now.AddHours(-i); ProductionHourList.Add($"{hour.Hour}:00"); } }); // 初始化每小时任务量字典 Dictionary hourProductionCount = new Dictionary(); foreach (var hour in ProductionHourList) { hourProductionCount[hour] = 0; } // 统计每小时任务量 foreach (var task in list) { string hourKey = $"{task.CreatedTime.Hour}:00"; if (hourProductionCount.ContainsKey(hourKey)) { hourProductionCount[hourKey]++; } } await Application.Current.Dispatcher.InvokeAsync(() => { Achievement.Clear(); ChartValues achievement = new ChartValues(); int i = 0; foreach (var kvp in hourProductionCount) { achievement.Add(new ObservablePoint(i++, kvp.Value)); } var column = new ColumnSeries(); column.DataLabels = true; column.Title = "agv任务量"; column.Values = achievement; column.Fill = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1edaf2")); column.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1edaf2")); Achievement.Add(column); }); } catch (Exception ex) { _logger.LogError($"产量统计图表异常:{ex.Message}"); } } } }