@if (_dailyRevenue.Any())
{
- var recent = _revenuePeriod == "monthly" ? _dailyRevenue.TakeLast(30).ToList() : _dailyRevenue.TakeLast(7).ToList();
+ var recent = _revenuePeriod switch {
+ "monthly" => _dailyRevenue.TakeLast(12).ToList(),
+ "weekly" => _dailyRevenue.TakeLast(8).ToList(),
+ _ => _dailyRevenue.TakeLast(7).ToList()
+ };
var maxVal = recent.Max(r => r.Revenue);
@foreach (var r in recent)
{
var pct = maxVal > 0 ? (int)(r.Revenue / maxVal * 100) : 0;
+ var barLabel = _revenuePeriod switch {
+ "monthly" => r.PeriodStart.ToString("MM/yy"),
+ "weekly" => $"T{r.PeriodStart:dd/MM}",
+ _ => r.PeriodStart.ToString("dd/MM")
+ };
@FormatVND(r.Revenue)
-
@r.PeriodStart.ToString("dd/MM")
+
@barLabel
}
@@ -183,10 +209,10 @@
- @if (_orders.Any())
+ @if (GetFilteredOrders().Any())
{
- @foreach (var o in _orders.Take(5))
+ @foreach (var o in GetFilteredOrders().Take(5))
{
@@ -244,13 +270,12 @@
private PosDataService.ShopInfo? _shop;
private string _posVertical = "cafe";
- private List
_orders = new();
+ private List _allOrders = new();
private List _products = new();
private List _dailyRevenue = new();
private string _revenuePeriod = "daily";
+ private int _activePeriod = 30; // default 30 days
- // EN: Cascade layout reference to set shop context for sidebar switching.
- // VI: Cascade layout để set shop context cho sidebar chuyển đổi.
[CascadingParameter] public AdminLayout? Layout { get; set; }
protected override async Task OnInitializedAsync()
@@ -267,11 +292,12 @@
_posVertical = MapCategoryToVertical(_shop.Category);
Layout?.SetShopContext(ShopId, _shop.Name ?? "Cửa hàng", _shop.Category);
}
- // EN: Load KPI data in parallel / VI: Tải dữ liệu KPI song song
- var ordersTask = DataService.GetOrdersAsync(id);
+ // EN: Load all orders + products + revenue in parallel
+ // VI: Tải tất cả đơn hàng + sản phẩm + doanh thu song song
+ var ordersTask = DataService.GetOrdersAsync(id, "all");
var productsTask = DataService.GetAllProductsAsync(id);
var revenueTask = DataService.GetRevenueReportAsync("daily", id);
- _orders = await ordersTask;
+ _allOrders = await ordersTask;
_products = await productsTask;
try { _dailyRevenue = await revenueTask; } catch { _dailyRevenue = new(); }
}
@@ -284,6 +310,26 @@
finally { IsLoading = false; }
}
+ private List GetFilteredOrders()
+ {
+ if (_activePeriod == -1) return _allOrders; // all
+ if (_activePeriod == 0) return _allOrders.Where(o => o.CreatedAt.Date == DateTime.UtcNow.Date).ToList(); // today
+ return _allOrders.Where(o => o.CreatedAt >= DateTime.UtcNow.AddDays(-_activePeriod)).ToList();
+ }
+
+ private void SetPeriod(int days)
+ {
+ _activePeriod = days;
+ StateHasChanged();
+ }
+
+ private string GetPeriodLabel() => _activePeriod switch
+ {
+ 0 => DateTime.UtcNow.ToString("dd/MM/yyyy"),
+ -1 => "Toàn bộ thời gian",
+ _ => $"{DateTime.UtcNow.AddDays(-_activePeriod):dd/MM} — {DateTime.UtcNow:dd/MM/yyyy}"
+ };
+
private async Task SwitchRevenuePeriod(string period)
{
_revenuePeriod = period;
@@ -295,9 +341,7 @@
}
private static string FormatVND(decimal val) => val.ToString("N0") + " ₫";
-
private static string GetStatusBadgeClass(string? status) => ShopVerticalHelper.GetStatusBadgeClass(status);
-
private static string GetStatusLabel(string? status) => ShopVerticalHelper.GetStatusLabel(status);
private static string MapCategoryToVertical(string? category) => (category?.ToLowerInvariant()) switch