using Microsoft.Win32; using OrpaonVision.ConfigApp.ViewModels; using OrpaonVision.Core.Abstractions; using OrpaonVision.Model.Production; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace OrpaonVision.ConfigApp.Views; /// /// 产品会话管理窗口。 /// public partial class ProductionSessionManagementWindow : Window { private readonly ProductionSessionManagementViewModel _viewModel; /// /// 构造函数。 /// public ProductionSessionManagementWindow(ProductionSessionManagementViewModel viewModel) { _viewModel = viewModel; InitializeComponent(); DataContext = _viewModel; InitializeControls(); } /// /// 初始化控件。 /// private void InitializeControls() { // 初始化筛选条件 InitializeFilterControls(); // 绑定数据 SessionsDataGrid.ItemsSource = _viewModel.Sessions; ProductTypeStatisticsDataGrid.ItemsSource = _viewModel.Statistics?.ByProductType; StationStatisticsDataGrid.ItemsSource = _viewModel.Statistics?.ByStation; OperatorStatisticsDataGrid.ItemsSource = _viewModel.Statistics?.ByOperator; // 订阅属性变化事件 _viewModel.PropertyChanged += (sender, e) => { if (e.PropertyName == nameof(_viewModel.Sessions)) { SessionsDataGrid.ItemsSource = _viewModel.Sessions; UpdatePageInfo(); UpdateRecordCount(); } else if (e.PropertyName == nameof(_viewModel.Statistics)) { UpdateStatisticsDisplay(); } else if (e.PropertyName == nameof(_viewModel.StatusText)) { StatusTextBlock.Text = _viewModel.StatusText; } }; UpdatePageInfo(); UpdateRecordCount(); } /// /// 初始化筛选控件。 /// private void InitializeFilterControls() { // 产品类型 ProductTypeComboBox.Items.Add(new ComboBoxItem { Content = "全部", Tag = "" }); ProductTypeComboBox.Items.Add(new ComboBoxItem { Content = "VFD-001", Tag = "VFD-001" }); ProductTypeComboBox.Items.Add(new ComboBoxItem { Content = "VFD-002", Tag = "VFD-002" }); ProductTypeComboBox.SelectedIndex = 0; // 工位 StationComboBox.Items.Add(new ComboBoxItem { Content = "全部", Tag = "" }); StationComboBox.Items.Add(new ComboBoxItem { Content = "装配工位1", Tag = "ST-001" }); StationComboBox.Items.Add(new ComboBoxItem { Content = "装配工位2", Tag = "ST-002" }); StationComboBox.SelectedIndex = 0; // 操作员 OperatorComboBox.Items.Add(new ComboBoxItem { Content = "全部", Tag = "" }); OperatorComboBox.Items.Add(new ComboBoxItem { Content = "张三", Tag = "OP-001" }); OperatorComboBox.Items.Add(new ComboBoxItem { Content = "李四", Tag = "OP-002" }); OperatorComboBox.Items.Add(new ComboBoxItem { Content = "王五", Tag = "OP-003" }); OperatorComboBox.SelectedIndex = 0; // 状态 StatusComboBox.SelectedIndex = 0; } /// /// 查询按钮点击事件。 /// private async void OnQueryClicked(object sender, RoutedEventArgs e) { try { await _viewModel.QuerySessionsAsync(); } catch (Exception ex) { MessageBox.Show($"查询失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 重置按钮点击事件。 /// private void OnResetClicked(object sender, RoutedEventArgs e) { try { _viewModel.ResetFilters(); ProductTypeComboBox.SelectedIndex = 0; StationComboBox.SelectedIndex = 0; OperatorComboBox.SelectedIndex = 0; StatusComboBox.SelectedIndex = 0; } catch (Exception ex) { MessageBox.Show($"重置失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 导出Excel按钮点击事件。 /// private async void OnExportExcelClicked(object sender, RoutedEventArgs e) { try { var saveFileDialog = new SaveFileDialog { Filter = "Excel文件|*.xlsx|所有文件|*.*", Title = "导出Excel文件", FileName = $"产品会话记录_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx" }; if (saveFileDialog.ShowDialog() == true) { await _viewModel.ExportSessionsAsync(saveFileDialog.FileName, ExportFormat.Excel); MessageBox.Show("导出成功!", "成功", MessageBoxButton.OK, MessageBoxImage.Information); } } catch (Exception ex) { MessageBox.Show($"导出Excel失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 导出CSV按钮点击事件。 /// private async void OnExportCsvClicked(object sender, RoutedEventArgs e) { try { var saveFileDialog = new SaveFileDialog { Filter = "CSV文件|*.csv|所有文件|*.*", Title = "导出CSV文件", FileName = $"产品会话记录_{DateTime.Now:yyyyMMdd_HHmmss}.csv" }; if (saveFileDialog.ShowDialog() == true) { await _viewModel.ExportSessionsAsync(saveFileDialog.FileName, ExportFormat.Csv); MessageBox.Show("导出成功!", "成功", MessageBoxButton.OK, MessageBoxImage.Information); } } catch (Exception ex) { MessageBox.Show($"导出CSV失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 查看统计按钮点击事件。 /// private async void OnViewStatisticsClicked(object sender, RoutedEventArgs e) { try { await _viewModel.LoadStatisticsAsync(); } catch (Exception ex) { MessageBox.Show($"加载统计信息失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 会话双击事件。 /// private void OnSessionDoubleClicked(object sender, MouseButtonEventArgs e) { try { if (SessionsDataGrid.SelectedItem is ProductionSessionModel session) { _viewModel.ViewSessionDetail(session); } } catch (Exception ex) { MessageBox.Show($"查看会话详情失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 上一页按钮点击事件。 /// private async void OnPreviousPageClicked(object sender, RoutedEventArgs e) { try { await _viewModel.GoToPreviousPageAsync(); UpdatePageInfo(); } catch (Exception ex) { MessageBox.Show($"翻页失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 下一页按钮点击事件。 /// private async void OnNextPageClicked(object sender, RoutedEventArgs e) { try { await _viewModel.GoToNextPageAsync(); UpdatePageInfo(); } catch (Exception ex) { MessageBox.Show($"翻页失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 更新分页信息。 /// private void UpdatePageInfo() { PageInfoTextBlock.Text = $"第 {_viewModel.CurrentPage} 页,共 {_viewModel.TotalPages} 页"; } /// /// 更新记录数。 /// private void UpdateRecordCount() { RecordCountTextBlock.Text = $"记录数: {_viewModel.Sessions?.Count ?? 0}"; } /// /// 更新统计显示。 /// private void UpdateStatisticsDisplay() { if (_viewModel.Statistics == null) return; // 总体统计 TotalSessionsTextBlock.Text = _viewModel.Statistics.TotalSessions.ToString(); OkSessionsTextBlock.Text = _viewModel.Statistics.OkSessions.ToString(); NgSessionsTextBlock.Text = _viewModel.Statistics.NgSessions.ToString(); PassRateTextBlock.Text = $"{_viewModel.Statistics.PassRate:P1}"; AvgProcessingTimeTextBlock.Text = $"{_viewModel.Statistics.AverageProcessingTimeSeconds:F1} 秒"; ThroughputTextBlock.Text = $"{_viewModel.Statistics.ThroughputPerHour:F1}"; InProgressSessionsTextBlock.Text = _viewModel.Statistics.InProgressSessions.ToString(); CancelledSessionsTextBlock.Text = _viewModel.Statistics.CancelledSessions.ToString(); // 分组统计 ProductTypeStatisticsDataGrid.ItemsSource = _viewModel.Statistics.ByProductType; StationStatisticsDataGrid.ItemsSource = _viewModel.Statistics.ByStation; OperatorStatisticsDataGrid.ItemsSource = _viewModel.Statistics.ByOperator; } /// /// 窗口关闭事件。 /// protected override void OnClosed(EventArgs e) { _viewModel.Dispose(); base.OnClosed(e); } }