using LocalhostMES.DataBase; using LocalhostMES.Core; using LocalhostMES.Models; using LocalhostMES.ViewModels.Services; using LocalhostMES.Views; using Prism.Commands; using Prism.Mvvm; using System; using System.Collections.ObjectModel; using System.Linq; using System.Windows; namespace LocalhostMES.ViewModels.Tabs { public class SnManagementViewModel : BindableBase { private readonly IMesWorkspace _workspace; private bool _skipNextSnRefresh; public SnManagementViewModel(IMesWorkspace workspace) { _workspace = workspace; _workspace.Initialize(); MesDataChangedNotifier.Changed += OnDataChanged; } public ObservableCollection DgWorkOrders => _workspace.WorkOrders; private ObservableCollection _dgSns = new ObservableCollection(); public ObservableCollection DgSns { get => _dgSns; set => SetProperty(ref _dgSns, value); } private SnInfo _selectSnInfo; public SnInfo SelectSnInfo { get => _selectSnInfo; set => SetProperty(ref _selectSnInfo, value); } private string _searchWorkOrder; public string SearchWorkOrder { get => _searchWorkOrder; set => SetProperty(ref _searchWorkOrder, value); } private DelegateCommand _searchSnsCommand; public DelegateCommand SearchSnsCommand => _searchSnsCommand ?? (_searchSnsCommand = new DelegateCommand(SearchSns)); private DelegateCommand _editSnCommand; public DelegateCommand EditSnCommand => _editSnCommand ?? (_editSnCommand = new DelegateCommand(EditSn)); private DelegateCommand _gotoBindRecordsCommand; public DelegateCommand GotoBindRecordsCommand => _gotoBindRecordsCommand ?? (_gotoBindRecordsCommand = new DelegateCommand(GotoBindRecords)); private DelegateCommand _gotoProcessRecordsCommand; public DelegateCommand GotoProcessRecordsCommand => _gotoProcessRecordsCommand ?? (_gotoProcessRecordsCommand = new DelegateCommand(GotoProcessRecords)); private void SearchSns() { try { DgSns.Clear(); var workOrderNo = (SearchWorkOrder ?? string.Empty).Trim(); if (string.IsNullOrEmpty(workOrderNo)) { _workspace.ShowStatus("请输入工单号", true); return; } var response = DatabaseHelper.SelectSnInfo(workOrderNo); if (response.Count != 0) { DgSns = new ObservableCollection(response); _workspace.ShowStatus($"已加载 {response.Count} 个SN", false); } else { _workspace.ShowStatus($"加载失败: {response.Count}", true); } } catch (Exception ex) { _workspace.ShowStatus($"查询失败: {ex.Message}", true); } } private void OnDataChanged(object sender, MesDataChangedEventArgs e) { if (!e.Has(MesDataScope.Sn)) { return; } if (_skipNextSnRefresh) { _skipNextSnRefresh = false; return; } var workOrderNo = (SearchWorkOrder ?? string.Empty).Trim(); if (string.IsNullOrEmpty(workOrderNo)) { return; } Application.Current?.Dispatcher.Invoke(SearchSns); } private void EditSn() { if (SelectSnInfo == null) { _workspace.ShowStatus("请先选择要修改的SN", true); return; } try { var dialog = new SnDialog(SelectSnInfo) { Owner = Application.Current?.MainWindow }; if (dialog.ShowDialog() == true) { _skipNextSnRefresh = true; if (DatabaseHelper.UpdateSnInfo(dialog.SnInfo)) { var edited = dialog.SnInfo; var index = DgSns.IndexOf(SelectSnInfo); if (index >= 0) { var updatedRow = new SnInfo { Sn = edited.Sn, WorkOrderNo = edited.WorkOrderNo, PrintType = edited.PrintType, GenerateTime = edited.GenerateTime, IsUsed = edited.IsUsed }; DgSns[index] = updatedRow; SelectSnInfo = updatedRow; } var selectedWorkOrderNo = (edited.WorkOrderNo ?? string.Empty).Trim(); if (!string.IsNullOrEmpty(selectedWorkOrderNo) && !_workspace.WorkOrders.Any(w => w.WorkOrderNo == selectedWorkOrderNo)) { _workspace.WorkOrders.Add(new WorkOrderInfo { WorkOrderNo = selectedWorkOrderNo }); } SearchWorkOrder = selectedWorkOrderNo; _workspace.ShowStatus("SN信息修改成功", false); } else { _skipNextSnRefresh = false; _workspace.ShowStatus("修改失败", true); } } } catch (Exception ex) { _workspace.ShowStatus($"修改失败: {ex.Message}", true); } } private void GotoBindRecords() { var sn = (SelectSnInfo?.Sn ?? string.Empty).Trim(); if (string.IsNullOrEmpty(sn)) { _workspace.ShowStatus("请先选择一条SN记录", true); return; } _workspace.CrossPageSn = sn; _workspace.SelectedTabIndex = 5; } private void GotoProcessRecords() { var sn = (SelectSnInfo?.Sn ?? string.Empty).Trim(); if (string.IsNullOrEmpty(sn)) { _workspace.ShowStatus("请先选择一条SN记录", true); return; } _workspace.CrossPageSn = sn; _workspace.SelectedTabIndex = 6; } } }