- Добавлена вкладка «Загрузить» (между Отчёты и Отправить, как в исходной программе): постраничная загрузка прайса с прогрессом, кэш в памяти (PriceCache), итог «N позиций от K поставщиков» + timestamp - Верхняя навигация уплотнена под 8 вкладок (Справочник больше не обрезается) - Core: PriceCache Проверено вживую: все 8 вкладок влезают, загрузка прайса работает (500 поз.). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
79 lines
2.8 KiB
C#
79 lines
2.8 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using CommunityToolkit.Mvvm.ComponentModel;
|
||
using CommunityToolkit.Mvvm.Input;
|
||
using Elfisa.Core;
|
||
|
||
namespace Elfisa.Avalonia.ViewModels;
|
||
|
||
/// <summary>«Загрузить» — скачивание актуального прайса с сервера в память.</summary>
|
||
public partial class LoadPriceViewModel : ViewModelBase
|
||
{
|
||
private readonly ApiClient _api = new();
|
||
|
||
[ObservableProperty] private bool _busy;
|
||
[ObservableProperty] private double _progress; // 0..100
|
||
[ObservableProperty] private string _progressText = "";
|
||
[ObservableProperty] private string? _result;
|
||
|
||
public string LastLoaded =>
|
||
PriceCache.LoadedAt is { } dt
|
||
? $"Последняя загрузка: {dt:dd.MM.yyyy HH:mm} — {PriceCache.Items.Count} позиций"
|
||
: "Прайс ещё не загружался в этой сессии.";
|
||
|
||
public LoadPriceViewModel()
|
||
{
|
||
_api.SetToken(Session.Current.Token);
|
||
}
|
||
|
||
[RelayCommand]
|
||
private async Task LoadAsync()
|
||
{
|
||
Result = null;
|
||
try
|
||
{
|
||
Busy = true;
|
||
Progress = 0;
|
||
ProgressText = "Соединение с сервером…";
|
||
|
||
var all = new List<PriceItem>();
|
||
const int page = 500;
|
||
int offset = 0, total = 0;
|
||
|
||
while (true)
|
||
{
|
||
var resp = await _api.GetPriceSummaryAsync(null, limit: page, offset: offset);
|
||
var batch = resp.Summary ?? new();
|
||
if (resp.TotalDrugs > 0) total = resp.TotalDrugs;
|
||
all.AddRange(batch);
|
||
|
||
Progress = total > 0 ? Math.Min(100.0, all.Count * 100.0 / total) : 0;
|
||
ProgressText = total > 0
|
||
? $"Загружено {all.Count} из {total} позиций…"
|
||
: $"Загружено {all.Count} позиций…";
|
||
|
||
offset += batch.Count;
|
||
if (batch.Count < page || (total > 0 && all.Count >= total) || offset > 30000)
|
||
break;
|
||
}
|
||
|
||
PriceCache.Items = all;
|
||
PriceCache.LoadedAt = DateTime.Now;
|
||
Progress = 100;
|
||
ProgressText = "Готово.";
|
||
|
||
var suppliers = all.Select(x => x.SupplierName).Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().Count();
|
||
Result = $"Прайс загружен: {all.Count} позиций от {suppliers} поставщик(ов).";
|
||
OnPropertyChanged(nameof(LastLoaded));
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Result = "Ошибка загрузки: " + ex.Message;
|
||
ProgressText = "";
|
||
}
|
||
finally { Busy = false; }
|
||
}
|
||
}
|