diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopOverview.razor b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopOverview.razor
index efec47e0..a6e8e76a 100644
--- a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopOverview.razor
+++ b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopOverview.razor
@@ -155,7 +155,7 @@
+
+
+
+
+
+
+
+
+
+
+ @foreach (var (label, days) in new[] { ("7 ngày", 7), ("30 ngày", 30), ("90 ngày", 90), ("Tất cả", 0) })
+ {
+
+ }
+
+
+
+
+
+@* ─── KPI Summary Cards ─── *@
+@{
+ var filteredOrders = GetFilteredOrders();
+ var totalRevenue = filteredOrders.Sum(o => o.TotalAmount);
+ var totalOrders = filteredOrders.Count;
+ var avgOrderValue = totalOrders > 0 ? filteredOrders.Average(o => o.TotalAmount) : 0m;
+}
-
@ShopHelpers.FormatVND(_reportOrders.Sum(o => o.TotalAmount))Tổng doanh thu
-
@_reportOrders.CountTổng đơn hàng
-
@ShopHelpers.FormatVND(_reportOrders.Any() ? _reportOrders.Average(o => o.TotalAmount) : 0)Giá trị TB / đơn
+
@ShopHelpers.FormatVND(totalRevenue)Tổng doanh thu
+
@totalOrdersTổng đơn hàng
+
@ShopHelpers.FormatVND(avgOrderValue)Giá trị TB / đơn
@_reportProducts.CountSản phẩm
-@* Revenue Report *@
+
+@* ─── Revenue Report ─── *@
- @if (_revenueReport.Any())
+ @if (_loadingRevenue)
+ {
+
+
+ Đang tải...
+
+ }
+ else if (_revenueReport.Any())
{
@@ -34,22 +80,33 @@
@foreach (var r in _revenueReport)
{
+ var periodLabel = _reportPeriod switch {
+ "weekly" => $"Tuần {r.PeriodStart:dd/MM}",
+ "monthly" => r.PeriodStart.ToString("MM/yyyy"),
+ _ => r.PeriodStart.ToString("dd/MM/yyyy")
+ };
- | @r.Period.ToString("dd/MM/yyyy") |
+ @periodLabel |
@r.OrderCount |
@ShopHelpers.FormatVND(r.Revenue) |
}
+
+ | Tổng cộng |
+ @_revenueReport.Sum(r => r.OrderCount) |
+ @ShopHelpers.FormatVND(_revenueReport.Sum(r => r.Revenue)) |
+
}
else
{
-
Nhấn Ngày / Tuần / Tháng để tải dữ liệu doanh thu.
+
Không có dữ liệu cho khoảng thời gian đã chọn.
}
-@* ─── Top products from real order_items data ─── *@
+
+@* ─── Top Products ─── *@
@if (_topProducts.Any())
{