Admin xem thống kê gói package
Feature URL
Module
admin
Status
shipped
Priority
P1
Platforms
fe · be
AC progress
9 / 9
Last reviewed
2026-06-08
Mục tiêu
Cung cấp cho admin một cái nhìn tổng hợp về catalog gói và lượng subscriber từng gói trong một lần gọi, phục vụ ra quyết định kinh doanh (gói nào bán chạy, gói nào nên ngừng bán). Toàn bộ số liệu được tính trong một truy vấn grouped duy nhất để tránh N+1, đảm bảo trang dashboard tải nhanh kể cả khi catalog lớn.
Phạm vi
Trong phạm vi (In scope):
- API thống kê
GET /admin/subscriptions/packages/statistics, chỉ roleadmin. - Trả
PackageStatisticsResponsegồm số liệu scalar và mảngitemsper-package. - Scalar:
totalPackages(tổng số gói),activePackages(số góiACTIVE),totalActiveSubscribers(tổng subscriber còn active toàn hệ thống). - Mảng
itemsmỗi gói:packageId,code,name,status,activeSubscriberCount,totalSubscriberCount. - Tính trong một query grouped duy nhất (không N+1).
Ngoài phạm vi (Out of scope):
- Danh sách chi tiết user của từng gói — xem admin-package-subscribers.
- Danh sách cấu hình gói — xem admin-package-list.
- Tạo / cập nhật gói — xem admin-package-create, admin-package-update.
- Báo cáo doanh thu / dòng tiền — không thuộc feature này.
- Lưu lịch sử thống kê theo thời gian / audit log — số liệu tính trực tiếp tại thời điểm gọi.
User Stories
- Là admin, tôi muốn xem tổng số gói và số gói đang bán để nắm nhanh quy mô catalog.
- Là admin, tôi muốn biết mỗi gói có bao nhiêu subscriber đang active để đánh giá gói nào bán chạy.
- Là admin, tôi muốn so sánh subscriber active với tổng subscriber (kể cả đã hết hạn) để đánh giá khả năng giữ chân.
- Là hệ thống, tôi muốn tổng hợp số liệu trong một query grouped để dashboard tải nhanh, tránh N+1.
Luồng chức năng
sequenceDiagram
actor Admin
participant App as FE Admin
participant BE
Admin->>App: Mở dashboard thống kê gói
App->>BE: GET /admin/subscriptions/packages/statistics
BE->>BE: Kiểm tra role admin
BE->>BE: Một query grouped: đếm gói + subscriber active/total per package
BE->>BE: Tính scalar totalPackages, activePackages, totalActiveSubscribers
BE-->>App: PackageStatisticsResponse (scalar + items[])Acceptance Criteria
- AC-1:
GET /admin/subscriptions/packages/statisticsyêu cầu roleadmin. - AC-2: Trả
PackageStatisticsResponsegồm các field scalar và mảngitems. - AC-3:
totalPackages= tổng số gói trong catalog. - AC-4:
activePackages= số gói ở trạng tháiACTIVE. - AC-5:
totalActiveSubscribers= tổng subscriber còn active trên toàn bộ gói. - AC-6: Mỗi entry trong
itemscó:packageId,code,name,status,activeSubscriberCount,totalSubscriberCount. - AC-7:
activeSubscriberCount= số subscriber còn active của gói đó;totalSubscriberCount= mọi assignment kể cả đã hết hạn. - AC-8: Toàn bộ số liệu tính trong một query grouped duy nhất (không N+1).
- AC-9: Gói không có subscriber vẫn xuất hiện trong
itemsvới count = 0.
Quy tắc nghiệp vụ
- Đây là endpoint TRA CỨU thống kê tổng hợp read-only; không thay đổi dữ liệu và không ghi lại thao tác xem.
activeSubscriberCountchỉ đếm subscriber còn hiệu lực;totalSubscriberCountđếm mọi assignment lịch sử (gồmEXPIRED).totalActiveSubscribers(scalar) là tổngactiveSubscriberCounttoàn hệ thống, dùng cho KPI nhanh.- Số liệu phản ánh trạng thái tại thời điểm gọi; không lưu snapshot lịch sử.
- Hiệu năng: bắt buộc gom đếm trong một query grouped để dashboard không phát sinh N+1.
Dữ liệu & Trạng thái
Entity nghiệp vụ:
Package: catalog gói (định nghĩa tại package-view).UserPackage: assignment gói cho user, nguồn để đếm subscriber (sinh tại package-purchase).PackageStatisticsResponse: kết quả tổng hợp — scalar +items[].PackageStatisticsItem: dòng thống kê per-package —packageId,code,name,status,activeSubscriberCount,totalSubscriberCount.
Trạng thái subscriber dùng để đếm:
active— subscriber còn hiệu lực, tính vàoactiveSubscriberCount.expired— đã hết hạn, vẫn tính vàototalSubscriberCount.
Liên quan
- Phụ thuộc: package-view, package-purchase
- Ảnh hưởng: Chưa có.
- Cùng nhóm admin: admin-package-create, admin-package-update, admin-package-list, admin-package-subscribers