using demo_trade.Domain; using demo_trade.Models; using DynamicData; using ReactiveUI; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reactive; using System.Text; using System.Threading.Tasks; namespace demo_trade.ViewModels { public class OrderManagerViewModel : ViewModelBase, IRoutableViewModel { OrderManagerUseCase _orderManagerUseCase; public string? UrlPathSegment { get; } = Guid.NewGuid().ToString(); private ObservableCollection _orders = new(); private Dictionary _changedOrdes = new(); private List _dateSource = new(); public ObservableCollection Orders { get => _orders; set => this.RaiseAndSetIfChanged(ref _orders, value); } private int _selectedSortNumber = 0; public int SelectedSortNumber { get => _selectedSortNumber; set => this.RaiseAndSetIfChanged(ref _selectedSortNumber, value); } public IScreen HostScreen { get; } public ReactiveCommand ConfirmChangeCommand { get; } public OrderManagerViewModel(IScreen screen, OrderManagerUseCase orderManagerUseCase) { _orderManagerUseCase = orderManagerUseCase; _dateSource = _orderManagerUseCase.GetOrders(); this.WhenAnyValue(sort => sort.SelectedSortNumber).Subscribe(_ => DisplayList()); ConfirmChangeCommand = ReactiveCommand.Create(() => { if (_changedOrdes.Values.Count == 0) return; _orderManagerUseCase.ChangeOrders(_changedOrdes.Values.ToList()); }); HostScreen = screen; } private void DisplayList() { var temp = _dateSource; if (SelectedSortNumber == 1) { temp = temp.OrderByDescending(it => it.OrderSumCost).ToList(); } else if (SelectedSortNumber == 2) temp = temp.OrderBy(it => it.OrderSumCost).ToList(); _orders.Clear(); foreach (var order in temp) { _orders.Add(order); } } public void OrderDateChanged(int id, DateTimeOffset dateDelivery) { if (dateDelivery.DateTime <= DateTime.Now) return; if (_changedOrdes.ContainsKey(id)) { _changedOrdes[id].OrderDeliveryDate = DateOnly.FromDateTime(dateDelivery.DateTime); return; } _changedOrdes.Add(id, new OrderChanged { OrderDeliveryDate = DateOnly.FromDateTime(dateDelivery.DateTime), OrderId= id }); } public void OrderStatusChanged(int id, int status) { if (status != 1) return; if (_changedOrdes.ContainsKey(id)) { _changedOrdes[id].OrderStatus = "Завершен"; return; } _changedOrdes.Add(id, new OrderChanged { OrderStatus = "Завершен", OrderId = id }); } } }