using Prism.Commands; using Prism.Ioc; using Prism.Mvvm; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using TeamAAS_VP.Core; using TeamAAS_VP.Interfaces; using TeamAAS_VP.Models; using TeamAAS_VP.Models.Feeder; namespace TeamAAS_VP.ViewModels.Home { public class AddScrewViewModel1 : BindableBase, IDialogAware { private readonly IConfigService _configService; private readonly ISystemDatabaseService _systemDatabaseService; IContainerProvider _container; public AddScrewViewModel1(IConfigService configService, ISystemDatabaseService systemDatabaseService, IContainerProvider containerProvider) { _configService = configService; _systemDatabaseService = systemDatabaseService; _container = containerProvider; ScrewFeeders = new ObservableCollection(); AddCommand = new DelegateCommand(ExecuteAddCommand, CanExecuteAdd).ObservesProperty(() => SelectedFeeder).ObservesProperty(() => NewBatchNumber); ClearCommand = new DelegateCommand(ExecuteClearCommand, () => SelectedFeeder != null).ObservesProperty(() => SelectedFeeder); CloseCommand = new DelegateCommand(ExecuteCloseCommand); } public DelegateCommand AddCommand { get; } public DelegateCommand ClearCommand { get; } public DelegateCommand CloseCommand { get; } private DelegateCommand _FeederSelectedCommand; public DelegateCommand FeederSelectedCommand => _FeederSelectedCommand ?? (_FeederSelectedCommand = new DelegateCommand(ExecuteFeederSelectedCommand)); public ObservableCollection ScrewFeeders { get; } private ScrewFeederInfo _selectedFeeder; public ScrewFeederInfo SelectedFeeder { get => _selectedFeeder; set { SetProperty(ref _selectedFeeder, value); } } private string _newBatchNumber; public string NewBatchNumber { get => _newBatchNumber; set => SetProperty(ref _newBatchNumber, value); } private string _currentBatchNumber; public string CurrentBatchNumber { get => _currentBatchNumber; set => SetProperty(ref _currentBatchNumber, value); } private int _remainingCount; public int RemainingCount { get => _remainingCount; set => SetProperty(ref _remainingCount, value); } private string _lastAddTime; public string LastAddTime { get => _lastAddTime; set => SetProperty(ref _lastAddTime, value); } public string Title => "添加螺丝"; public event Action RequestClose; public bool CanCloseDialog() { return true; } public void OnDialogClosed() { } public void OnDialogOpened(IDialogParameters parameters) { // load screw feeders try { var list = _configService.GetAllScrewFeeders(); if (list != null) { ScrewFeeders.Clear(); foreach (var s in list) { ScrewFeeders.Add(s); } } } catch { } } void ExecuteFeederSelectedCommand() { UpdateSelectedFeederInfo(); } private async void UpdateSelectedFeederInfo() { if (SelectedFeeder != null) { CurrentBatchNumber = SelectedFeeder.BatchNumber; RemainingCount = SelectedFeeder.RemainingCount; //获取最后一次的螺丝添加时间,这里简单设置为未知,实际应用中可从数据库记录中获取 var latestRecord = await _systemDatabaseService.GetLatestScrewFeederBatchRecordAsync(SelectedFeeder.FeederNumber); if (latestRecord != null) { LastAddTime = latestRecord.ChangeTime.ToString("u"); } else LastAddTime = "(unknown)"; // could be enriched from DB records } else { CurrentBatchNumber = string.Empty; RemainingCount = 0; LastAddTime = string.Empty; } } private bool CanExecuteAdd() { return SelectedFeeder != null && !string.IsNullOrWhiteSpace(NewBatchNumber); } private async void ExecuteAddCommand() { if (SelectedFeeder == null) return; // set batch and add pack size _configService.SetBatchForFeederNumber(SelectedFeeder.FeederNumber, NewBatchNumber); // refresh var refreshed = _configService.GetScrewFeeder(SelectedFeeder.Id); if (refreshed != null) { SelectedFeeder.RemainingCount = refreshed.RemainingCount; SelectedFeeder.BatchNumber = refreshed.BatchNumber; CurrentBatchNumber = refreshed.BatchNumber; RemainingCount = refreshed.RemainingCount; LastAddTime = DateTime.Now.ToString("u"); } Management management = _container.Resolve(); if (SelectedFeeder.FeederNumber == 1) management.NumStatistics.Feeder1Num = refreshed.RemainingCount; else if (SelectedFeeder.FeederNumber == 2) management.NumStatistics.Feeder2Num = refreshed.RemainingCount; // try to record batch change to system DB asynchronously try { var rec = new ScrewFeederBatchRecord { BatchNumber = NewBatchNumber, PackSize = SelectedFeeder.PackSize, ChangeTime = DateTime.Now, RemainingCount = SelectedFeeder.RemainingCount, FeederNumber = SelectedFeeder.FeederNumber, FeederName = SelectedFeeder.Name, PreviousCount = SelectedFeeder.RemainingCount - SelectedFeeder.PackSize, OperatorName = _systemDatabaseService.GetCurrentUser()?.UserName }; await _systemDatabaseService.RecordScrewFeederBatchAsync(rec); } catch(Exception ex) { LogHelper.WriteLogError("Failed to record screw feeder batch change.", ex); } } private void ExecuteClearCommand() { if (SelectedFeeder == null) return; _configService.ClearScrewFeederByNumber(SelectedFeeder.FeederNumber); var refreshed = _configService.GetScrewFeeder(SelectedFeeder.Id); if (refreshed != null) { SelectedFeeder.RemainingCount = refreshed.RemainingCount; SelectedFeeder.BatchNumber = refreshed.BatchNumber; CurrentBatchNumber = refreshed.BatchNumber; RemainingCount = refreshed.RemainingCount; LastAddTime = DateTime.Now.ToString("u"); } Management management = _container.Resolve(); if (SelectedFeeder.FeederNumber==1) management.NumStatistics.Feeder1Num = 0; else if (SelectedFeeder.FeederNumber == 2) management.NumStatistics.Feeder2Num = 0; } private void ExecuteCloseCommand() { RequestClose?.Invoke(new DialogResult(ButtonResult.OK)); } } }