From f045dbf5ed39c8cb01eda0db82978cf3f728df8b Mon Sep 17 00:00:00 2001 From: Ho Ngoc Hai Date: Sun, 1 Mar 2026 04:08:38 +0700 Subject: [PATCH] feat(admin): enhance Customer search + Finance date filter (G6, G8) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Customers: add search bar (filter by ID, membership level) - Customers: membership level displays as badge - Customers: show count header with search input - Finance: add date range tabs (7 ngày / 30 ngày / Tất cả) - Finance: revenue/order stats update based on selected period --- .../Pages/Admin/Shop/ShopPage.razor | 50 ++++++++++++++++--- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor index 06afae51..db121a02 100644 --- a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor +++ b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor @@ -214,10 +214,28 @@ // ═══ FINANCE ═══ case "finance": + var finOrders = _financePeriod switch { + "7d" => _orders.Where(o => o.CreatedAt >= DateTime.UtcNow.AddDays(-7)).ToList(), + "30d" => _orders.Where(o => o.CreatedAt >= DateTime.UtcNow.AddDays(-30)).ToList(), + _ => _orders }; +
+

Tài chính

+
+ @foreach (var (label, val) in new[] { ("7 ngày", "7d"), ("30 ngày", "30d"), ("Tất cả", "all") }) + { + + } +
+
-
@FormatVND(_orders.Sum(o => o.TotalAmount))Tổng doanh thu
-
@_orders.CountĐơn hàng
-
@FormatVND(_orders.Any() ? _orders.Average(o => o.TotalAmount) : 0)TB/đơn
+
@FormatVND(finOrders.Sum(o => o.TotalAmount))Tổng doanh thu
+
@finOrders.CountĐơn hàng
+
@FormatVND(finOrders.Any() ? finOrders.Average(o => o.TotalAmount) : 0)TB/đơn
@FormatVND(_wallets.Sum(w => w.Balance))Số dư ví
@if (_walletTxns.Any()) @@ -346,16 +364,28 @@ // ═══ CUSTOMERS + MEMBERSHIP LEVELS ═══ case "customers": - @if (!_members.Any()) +
+

@_members.Count khách hàng

+
+ + +
+
+ var filteredMembers = string.IsNullOrWhiteSpace(_customerSearch) + ? _members + : _members.Where(m => m.Id.ToString().Contains(_customerSearch, StringComparison.OrdinalIgnoreCase) + || (m.LevelName ?? "").Contains(_customerSearch, StringComparison.OrdinalIgnoreCase)).ToList(); + @if (!filteredMembers.Any()) { @RenderEmpty("heart", "#EF4444", "Chưa có khách hàng", "Khách hàng sẽ hiển thị khi có giao dịch", "monitor", "Mở POS bán hàng", $"/pos/{ShopId}/{_posVertical}") } else {
-
@_members.CountTổng khách hàng
+
@filteredMembers.CountTổng khách hàng
@_memberLevels.CountCấp bậc
-
@(_members.Any() ? _members.Max(m => m.TotalExpEarned).ToString("N0") : "0")EXP cao nhất
+
@(filteredMembers.Any() ? filteredMembers.Max(m => m.TotalExpEarned).ToString("N0") : "0")EXP cao nhất
@if (_memberLevels.Any()) { @@ -390,11 +420,11 @@ EXP Ngày tham gia - @foreach (var m in _members) + @foreach (var m in filteredMembers) { @m.Id.ToString()[..8] - @(m.LevelName ?? "—") + @(m.LevelName ?? "—") @m.TotalExpEarned.ToString("N0") @m.CreatedAt.ToString("dd/MM/yyyy") @@ -889,6 +919,10 @@ private List _staffSchedules = new(); private List _invTxns = new(); private List _resources = new(); + // Customer filter state + private string _customerSearch = ""; + // Finance date range filter state + private string _financePeriod = "all"; // 7d, 30d, all protected override async Task OnInitializedAsync() => await LoadData();