From 644751be7bcbc2befb22eb6b50d2bfdd035dd37f Mon Sep 17 00:00:00 2001 From: Ho Ngoc Hai Date: Sun, 1 Mar 2026 04:32:13 +0700 Subject: [PATCH] =?UTF-8?q?feat(admin):=20P3=20=E2=80=94=20Karaoke=20hourl?= =?UTF-8?q?y=20pricing=20+=20product=20type=20badges?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - K2+K5: Room hourly rate (VIP 200k, Party 350k, Standard 120k/h) - K2+K5: Active session billing calculator (elapsed hours × rate) - C3-C4: Product type badge (Đồ uống/Dịch vụ/Vật lý) - C3-C4: Variant/topping tag parsing from product description --- .../Pages/Admin/Shop/ShopPage.razor | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 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 c351679f..8e7c2875 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 @@ -164,13 +164,25 @@
@foreach (var p in _products) { + var typeColor = (p.Type ?? "") switch { "Service" => "#EC4899", "Physical" => "#3B82F6", _ => "#F59E0B" }; + var typeLabel = (p.Type ?? "") switch { "Service" => "Dịch vụ", "Physical" => "Vật lý", _ => "Đồ uống" };
@p.Name
-
@(p.CategoryName ?? "—")
+
@(p.CategoryName ?? "—")
+ @typeLabel
@p.Price.ToString("N0")₫
+ @if (p.Description?.Contains("variant:") == true || p.Description?.Contains("topping:") == true) + { +
+ @foreach (var tag in (p.Description ?? "").Split(',').Where(t => t.Trim().StartsWith("variant:") || t.Trim().StartsWith("topping:")).Take(3)) + { + @tag.Trim() + } +
+ }
} @@ -499,7 +511,7 @@ var borderColor = room.Status switch { "available" => "rgba(139,92,246,0.3)", "occupied" => "rgba(239,68,68,0.3)", "reserved" => "rgba(245,158,11,0.3)", _ => "rgba(107,107,111,0.3)" }; var statusColor = room.Status switch { "available" => "#8B5CF6", "occupied" => "#EF4444", "reserved" => "#F59E0B", _ => "#6B6B6F" }; var statusText = room.Status switch { "available" => "Trống", "occupied" => "Đang hát", "reserved" => "Đã đặt", "cleaning" => "Dọn dẹp", _ => room.Status }; - var roomType = (room.Zone ?? "").ToLower() switch { var z when z.Contains("vip") => ("VIP", "#F59E0B"), var z when z.Contains("party") => ("Party", "#EC4899"), _ => ("Standard", "#8B5CF6") }; + var roomType = (room.Zone ?? "").ToLower() switch { var z when z.Contains("vip") => ("VIP", "#F59E0B", 200000m), var z when z.Contains("party") => ("Party", "#EC4899", 350000m), _ => ("Standard", "#8B5CF6", 120000m) };
@@ -508,15 +520,23 @@
@roomType.Item1
-
@(room.Zone ?? "Chung") • @room.Capacity chỗ
+
@(room.Zone ?? "Chung") • @room.Capacity chỗ
+
@FormatVND(roomType.Item3)/giờ
@statusText
@if (room.SessionId.HasValue) { -
- @room.GuestCount khách • Bắt đầu @(room.StartedAt?.ToString("HH:mm") ?? "—") + var elapsed = DateTime.UtcNow - (room.StartedAt ?? DateTime.UtcNow); + var hours = Math.Max(1, (int)Math.Ceiling(elapsed.TotalHours)); + var bill = hours * roomType.Item3; +
+
@room.GuestCount khách • Bắt đầu @(room.StartedAt?.ToString("HH:mm") ?? "—")
+
+ @hours giờ + @FormatVND(bill) +
}