You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
11 KiB
C#
326 lines
11 KiB
C#
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<IndexViewModel> _logger;
|
|
|
|
public IndexViewModel()
|
|
{
|
|
sqlSugarClient = App.ServiceProvider.GetService<ISqlSugarClient>()!;
|
|
_logger = App.ServiceProvider.GetService<ILogger<IndexViewModel>>()!;
|
|
InitData();
|
|
}
|
|
|
|
[RelayCommand]
|
|
public void DeleteTask(int? id)
|
|
{
|
|
try
|
|
{
|
|
var result = MessageBox.Show("是否确认删除计划!", "确认", MessageBoxButton.YesNo);
|
|
if (result == MessageBoxResult.Yes)
|
|
{
|
|
WcsTask? wcsTask = sqlSugarClient.Queryable<WcsTask>().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<dynamic> listItems = new ObservableCollection<dynamic>();
|
|
|
|
/// <summary>
|
|
/// AGV状态信息列表
|
|
/// </summary>
|
|
private ObservableCollection<AgvInfo> agvList = new ObservableCollection<AgvInfo>();
|
|
|
|
public ObservableCollection<AgvInfo> AgvList
|
|
{
|
|
get { return agvList; }
|
|
set
|
|
{
|
|
agvList = value;
|
|
RaisePropertyChanged(() => AgvList);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 任务列表
|
|
/// </summary>
|
|
private ObservableCollection<WcsTask> wcsTaskItems = new ObservableCollection<WcsTask>();
|
|
|
|
public ObservableCollection<WcsTask> WcsTaskItems
|
|
{
|
|
get { return wcsTaskItems; }
|
|
set
|
|
{
|
|
wcsTaskItems = value;
|
|
RaisePropertyChanged(() => WcsTaskItems);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 日志LisBox数据模板
|
|
/// </summary>
|
|
private IEnumerable logInfoListBox;
|
|
|
|
public IEnumerable LogInfoListBox
|
|
{
|
|
get { return logInfoListBox; }
|
|
set { logInfoListBox = value; RaisePropertyChanged(() => LogInfoListBox); }
|
|
}
|
|
|
|
#region 日产量柱状图X轴日期
|
|
|
|
/// <summary>
|
|
/// 日产量柱状图X轴日期
|
|
/// </summary>
|
|
private List<string> productionHourList = new List<string>();
|
|
|
|
public List<string> ProductionHourList
|
|
{
|
|
get { return productionHourList; }
|
|
set { productionHourList = value; }
|
|
}
|
|
|
|
#endregion 日产量柱状图X轴日期
|
|
|
|
#region 型号统计柱状图
|
|
|
|
/// <summary>
|
|
/// 型号统计柱状图
|
|
/// </summary>
|
|
private SeriesCollection achievement = new SeriesCollection();
|
|
|
|
public SeriesCollection Achievement
|
|
{
|
|
get { return achievement; }
|
|
set { achievement = value; }
|
|
}
|
|
|
|
#endregion 型号统计柱状图
|
|
|
|
#endregion 参数定义
|
|
|
|
/// <summary>
|
|
/// 获取任务列表
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
private void GetTaskList()
|
|
{
|
|
List<WcsTask> tasks = sqlSugarClient.Queryable<WcsTask>().ToList();
|
|
Application.Current.Dispatcher.Invoke(() =>
|
|
{
|
|
WcsTaskItems.Clear();
|
|
if (tasks != null && tasks.Count > 0)
|
|
{
|
|
foreach (var task in tasks)
|
|
{
|
|
WcsTaskItems.Add(task);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 系统运行日志输出
|
|
/// </summary>
|
|
/// <param name="message"></param>
|
|
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}");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 加载AGV数据
|
|
/// </summary>
|
|
private async Task LoadAgvDataAsync()
|
|
{
|
|
try
|
|
{
|
|
List<WcsAgvStatus> agvList = await sqlSugarClient.Queryable<WcsAgvStatus>().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<string> okStrings = new List<string>() { "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<WcsTaskLog> list = await sqlSugarClient.Queryable<WcsTaskLog>().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<string, int> hourProductionCount = new Dictionary<string, int>();
|
|
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<ObservablePoint> achievement = new ChartValues<ObservablePoint>();
|
|
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}");
|
|
}
|
|
}
|
|
}
|
|
} |