using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Media; using OrpaonVision.Core.Production; using OrpaonVision.Core.Production.Contracts; using OrpaonVision.Core.Production.Contracts.Queries; namespace OrpaonVision.ConfigApp.ViewModels; /// /// 生产监控ViewModel。 /// public sealed class ProductionMonitoringViewModel : INotifyPropertyChanged { private readonly IProductionAppService _productionAppService; private string _statusText = "准备就绪。"; private Brush _statusBrush = Brushes.DarkGreen; private string _outputText = string.Empty; private RealtimeProductionStatusDto? _realtimeStatus; private ProductionStatisticsDto? _statistics; /// /// 构造函数。 /// public ProductionMonitoringViewModel(IProductionAppService productionAppService) { _productionAppService = productionAppService; } /// /// 状态文本。 /// public string StatusText { get => _statusText; private set => SetProperty(ref _statusText, value); } /// /// 状态画刷。 /// public Brush StatusBrush { get => _statusBrush; private set => SetProperty(ref _statusBrush, value); } /// /// 输出文本。 /// public string OutputText { get => _outputText; private set => SetProperty(ref _outputText, value); } /// /// 实时生产状态。 /// public RealtimeProductionStatusDto? RealtimeStatus { get => _realtimeStatus; private set => SetProperty(ref _realtimeStatus, value); } /// /// 生产统计数据。 /// public ProductionStatisticsDto? Statistics { get => _statistics; private set => SetProperty(ref _statistics, value); } /// /// 获取实时生产状态。 /// public async Task GetRealtimeStatusAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在获取实时生产状态..."; // 这里演示如何调用生产服务获取实时状态 var workstationId = Guid.NewGuid(); // 实际应该从配置或选择获取 var result = await _productionAppService.GetRealtimeProductionStatusAsync(workstationId); if (result.Succeeded && result.Data != null) { RealtimeStatus = result.Data; StatusText = "实时状态获取成功"; OutputText = $"工位:{result.Data.WorkstationName}\n" + $"状态:{result.Data.CurrentStatus}\n" + $"今日良率:{result.Data.TodayYieldRate:P2}\n" + $"平均节拍:{result.Data.AverageCycleTimeSeconds:F1}秒"; } else { StatusBrush = Brushes.OrangeRed; StatusText = "获取实时状态失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "获取实时状态异常"; OutputText = $"异常:{ex.Message}"; } } /// /// 获取生产统计数据。 /// public async Task GetProductionStatisticsAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在获取生产统计数据..."; // 这里演示如何调用生产服务获取统计数据 var query = new OrpaonVision.Core.Production.Contracts.Queries.ProductionStatisticsQueryDto { StartTimeUtc = DateTime.UtcNow.AddDays(-7), // 最近7天 EndTimeUtc = DateTime.UtcNow, IncludeDetailedStatistics = true, Granularity = "Day" }; var result = await _productionAppService.GetProductionStatisticsAsync(query); if (result.Succeeded && result.Data != null) { Statistics = result.Data; StatusText = "统计数据获取成功"; OutputText = $"统计时间:{result.Data.StartTimeUtc:yyyy-MM-dd} 至 {result.Data.EndTimeUtc:yyyy-MM-dd}\n" + $"总产品:{result.Data.TotalProducts}\n" + $"良率:{result.Data.YieldRate:P2}\n" + $"平均节拍:{result.Data.AverageCycleTimeSeconds:F1}秒"; } else { StatusBrush = Brushes.OrangeRed; StatusText = "获取统计数据失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "获取统计数据异常"; OutputText = $"异常:{ex.Message}"; } } /// /// 导出生产数据。 /// public async Task ExportProductionDataAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在导出生产数据..."; // 这里演示如何调用生产服务导出数据 var query = new OrpaonVision.Core.Production.Contracts.Queries.ProductSessionQueryDto { StartedAtUtcStart = DateTime.UtcNow.AddDays(-7), StartedAtUtcEnd = DateTime.UtcNow, PageIndex = 1, PageSize = 1000 }; var result = await _productionAppService.ExportProductionDataAsync(query, "Excel"); if (result.Succeeded && result.Data != null) { StatusText = "生产数据导出成功"; OutputText = $"导出文件:{result.Data.FileName}\n" + $"文件大小:{result.Data.FileSizeBytes / 1024.0:F1} KB\n" + $"导出格式:{result.Data.Format}\n" + $"校验和:{result.Data.Checksum}"; } else { StatusBrush = Brushes.OrangeRed; StatusText = "导出生产数据失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "导出生产数据异常"; OutputText = $"异常:{ex.Message}"; } } /// /// 获取质量分析报告。 /// public async Task GetQualityAnalysisReportAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在生成质量分析报告..."; var query = new OrpaonVision.Core.Production.Contracts.Queries.ProductionStatisticsQueryDto { StartTimeUtc = DateTime.UtcNow.AddDays(-30), // 最近30天 EndTimeUtc = DateTime.UtcNow, IncludeDetailedStatistics = true, GroupByLayer = true, GroupByNgType = true, GroupByOperator = true }; var result = await _productionAppService.GetQualityAnalysisReportAsync(query); if (result.Succeeded && result.Data != null) { StatusText = "质量分析报告生成成功"; var report = result.Data; OutputText = $"报告时间:{report.StartTimeUtc:yyyy-MM-dd} 至 {report.EndTimeUtc:yyyy-MM-dd}\n" + $"总体良率:{report.OverallMetrics.YieldRate:P2}\n" + $"质量评分:{report.OverallMetrics.QualityScore:F1}/100\n" + $"质量等级:{report.OverallMetrics.QualityGrade}\n" + $"改进建议数:{report.ImprovementSuggestions.Count}"; } else { StatusBrush = Brushes.OrangeRed; StatusText = "生成质量分析报告失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "生成质量分析报告异常"; OutputText = $"异常:{ex.Message}"; } } /// /// 刷新数据。 /// public async Task RefreshDataAsync() { await GetRealtimeStatusAsync(); await GetProductionStatisticsAsync(); } /// public event PropertyChangedEventHandler? PropertyChanged; private void SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) { return; } field = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }