using LocalhostMES.DataBase; using LocalhostMES.Core; using LocalhostMES.Models; using LocalhostMES.ViewModels.Services; using Prism.Commands; using Prism.Mvvm; using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; namespace LocalhostMES.ViewModels.Tabs { public class ProcessRecordsViewModel : BindableBase { private readonly IMesWorkspace _workspace; public ProcessRecordsViewModel(IMesWorkspace workspace) { _workspace = workspace; _workspace.Initialize(); RefreshProcessRecords(); MesDataChangedNotifier.Changed += OnDataChanged; if (_workspace is INotifyPropertyChanged npc) { npc.PropertyChanged += OnWorkspacePropertyChanged; } } private ObservableCollection _dgProcessRecords = new ObservableCollection(); public ObservableCollection DgProcessRecords { get => _dgProcessRecords; set => SetProperty(ref _dgProcessRecords, value); } private ProcessRecord _selectProcessRecord; public ProcessRecord SelectProcessRecord { get => _selectProcessRecord; set { if (SetProperty(ref _selectProcessRecord, value) && value != null) { SearchSn = value.Sn; } } } private DelegateCommand _refreshProcessRecordsCommand; public DelegateCommand RefreshProcessRecordsCommand => _refreshProcessRecordsCommand ?? (_refreshProcessRecordsCommand = new DelegateCommand(RefreshProcessRecords)); private DelegateCommand _clearProcessRecordsCommand; public DelegateCommand ClearProcessRecordsCommand => _clearProcessRecordsCommand ?? (_clearProcessRecordsCommand = new DelegateCommand(ClearProcessRecords)); private string _searchSn; public string SearchSn { get => _searchSn; set => SetProperty(ref _searchSn, value); } private DelegateCommand _searchBySnCommand; public DelegateCommand SearchBySnCommand => _searchBySnCommand ?? (_searchBySnCommand = new DelegateCommand(SearchBySn)); private void RefreshProcessRecords() { try { var sn = (SearchSn ?? string.Empty).Trim(); var response = string.IsNullOrEmpty(sn) ? DatabaseHelper.SelectProcessRecord() : DatabaseHelper.SelectProcessRecord(sn); if (response.Count != 0) { DgProcessRecords = new ObservableCollection(response); _workspace.ShowStatus(string.IsNullOrEmpty(sn) ? $"已加载 {response.Count} 条加工记录" : $"按SN查询到 {response.Count} 条加工记录", false); } else { _workspace.ShowStatus(string.IsNullOrEmpty(sn) ? "暂无加工记录" : $"未查询到SN={sn}的加工记录", true); } } catch (Exception ex) { _workspace.ShowStatus($"刷新失败: {ex.Message}", true); } } private void SearchBySn() { RefreshProcessRecords(); } private void ClearProcessRecords() { var result = MessageBox.Show("确定要清空所有加工记录吗?", "确认清空", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (result == MessageBoxResult.Yes) { try { DatabaseHelper.DeleteProcessRecord(); DgProcessRecords.Clear(); _workspace.ShowStatus("加工记录已清空", false); } catch (Exception ex) { _workspace.ShowStatus($"清空失败: {ex.Message}", true); } } } private void OnDataChanged(object sender, MesDataChangedEventArgs e) { if (!e.Has(MesDataScope.ProcessRecord)) { return; } Application.Current?.Dispatcher.Invoke(RefreshProcessRecords); } private void OnWorkspacePropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(IMesWorkspace.CrossPageSn) || e.PropertyName == nameof(IMesWorkspace.SelectedTabIndex)) { if (_workspace.SelectedTabIndex == 6) { var sn = (_workspace.CrossPageSn ?? string.Empty).Trim(); if (!string.IsNullOrEmpty(sn)) { SearchSn = sn; Application.Current?.Dispatcher.Invoke(RefreshProcessRecords); } } } } } }