diff --git a/services/wallet-service-net/src/WalletService.API/Application/Commands/AdminCommands.cs b/services/wallet-service-net/src/WalletService.API/Application/Commands/AdminCommands.cs
new file mode 100644
index 00000000..f1c84673
--- /dev/null
+++ b/services/wallet-service-net/src/WalletService.API/Application/Commands/AdminCommands.cs
@@ -0,0 +1,99 @@
+namespace WalletService.API.Application.Commands;
+
+using MediatR;
+
+#region Admin Wallet Commands
+
+///
+/// EN: Command to freeze a wallet (Admin only).
+/// VI: Command để đóng băng ví (Chỉ Admin).
+///
+public record AdminFreezeWalletCommand(
+ Guid WalletId,
+ string Reason,
+ Guid AdminId) : IRequest;
+
+///
+/// EN: Command to unfreeze a wallet (Admin only).
+/// VI: Command để mở băng ví (Chỉ Admin).
+///
+public record AdminUnfreezeWalletCommand(
+ Guid WalletId,
+ string Reason,
+ Guid AdminId) : IRequest;
+
+///
+/// EN: Command to adjust wallet balance (Admin only).
+/// VI: Command để điều chỉnh số dư ví (Chỉ Admin).
+///
+public record AdminAdjustBalanceCommand(
+ Guid WalletId,
+ decimal Amount,
+ int CurrencyTypeId,
+ string Reason,
+ Guid AdminId) : IRequest;
+
+#endregion
+
+#region Admin Wallet Command Results
+
+public record AdminWalletActionResult(
+ Guid WalletId,
+ string Status,
+ string ActionBy,
+ DateTime ActionAt);
+
+public record AdminAdjustBalanceResult(
+ Guid WalletId,
+ decimal PreviousBalance,
+ decimal AdjustmentAmount,
+ decimal NewBalance,
+ string Currency,
+ string Reason,
+ DateTime AdjustedAt);
+
+#endregion
+
+#region Admin Points Commands
+
+///
+/// EN: Command to adjust points (Admin only).
+/// VI: Command để điều chỉnh điểm (Chỉ Admin).
+///
+public record AdminAdjustPointsCommand(
+ Guid AccountId,
+ long Points,
+ string Reason,
+ Guid AdminId) : IRequest;
+
+///
+/// EN: Command to grant bonus points (Admin only).
+/// VI: Command để tặng điểm thưởng (Chỉ Admin).
+///
+public record AdminGrantBonusCommand(
+ Guid AccountId,
+ long Points,
+ string Reason,
+ int? ExpiryMonths,
+ Guid AdminId) : IRequest;
+
+#endregion
+
+#region Admin Points Command Results
+
+public record AdminAdjustPointsResult(
+ Guid AccountId,
+ long PreviousPoints,
+ long AdjustmentPoints,
+ long NewPoints,
+ string Reason,
+ DateTime AdjustedAt);
+
+public record AdminGrantBonusResult(
+ Guid AccountId,
+ long BonusPoints,
+ long NewTotalPoints,
+ DateTime? ExpiresAt,
+ DateTime GrantedAt);
+
+#endregion
diff --git a/services/wallet-service-net/src/WalletService.API/Application/Queries/AdminQueries.cs b/services/wallet-service-net/src/WalletService.API/Application/Queries/AdminQueries.cs
new file mode 100644
index 00000000..0e18586e
--- /dev/null
+++ b/services/wallet-service-net/src/WalletService.API/Application/Queries/AdminQueries.cs
@@ -0,0 +1,158 @@
+namespace WalletService.API.Application.Queries;
+
+using MediatR;
+
+#region Admin Wallet Queries
+
+///
+/// EN: Query to get all wallets with pagination (Admin only).
+/// VI: Query lấy tất cả ví với phân trang (Chỉ Admin).
+///
+public record GetAllWalletsQuery(
+ int Page,
+ int PageSize,
+ string? Status = null,
+ string? Currency = null) : IRequest;
+
+///
+/// EN: Query to get wallet by ID (Admin only).
+/// VI: Query lấy ví theo ID (Chỉ Admin).
+///
+public record GetWalletByIdQuery(Guid WalletId) : IRequest;
+
+///
+/// EN: Query to search wallets (Admin only).
+/// VI: Query tìm kiếm ví (Chỉ Admin).
+///
+public record SearchWalletsQuery(
+ Guid? UserId = null,
+ Guid? WalletId = null,
+ string? Status = null) : IRequest>;
+
+///
+/// EN: Query to get wallet statistics (Admin only).
+/// VI: Query lấy thống kê ví (Chỉ Admin).
+///
+public record GetWalletStatisticsQuery() : IRequest;
+
+#endregion
+
+#region Admin Points Queries
+
+///
+/// EN: Query to get all point accounts with pagination (Admin only).
+/// VI: Query lấy tất cả tài khoản điểm với phân trang (Chỉ Admin).
+///
+public record GetAllPointAccountsQuery(
+ int Page,
+ int PageSize,
+ long? MinPoints = null,
+ long? MaxPoints = null) : IRequest;
+
+///
+/// EN: Query to get point account by ID (Admin only).
+/// VI: Query lấy tài khoản điểm theo ID (Chỉ Admin).
+///
+public record GetPointAccountByIdQuery(Guid AccountId) : IRequest;
+
+///
+/// EN: Query to search point accounts (Admin only).
+/// VI: Query tìm kiếm tài khoản điểm (Chỉ Admin).
+///
+public record SearchPointAccountsQuery(Guid? UserId = null) : IRequest>;
+
+///
+/// EN: Query to get points statistics (Admin only).
+/// VI: Query lấy thống kê điểm (Chỉ Admin).
+///
+public record GetPointsStatisticsQuery() : IRequest;
+
+#endregion
+
+#region Admin DTOs
+
+///
+/// EN: DTO for admin wallets list with pagination.
+/// VI: DTO cho danh sách ví Admin với phân trang.
+///
+public record AdminWalletsListDto(
+ List Wallets,
+ int TotalCount,
+ int Page,
+ int PageSize);
+
+public record AdminWalletSummaryDto(
+ Guid Id,
+ Guid UserId,
+ string Status,
+ List Balances,
+ DateTime CreatedAt,
+ DateTime UpdatedAt);
+
+public record BalanceItemDto(
+ string Currency,
+ decimal Balance);
+
+public record AdminWalletDetailDto(
+ Guid Id,
+ Guid UserId,
+ string Status,
+ List Balances,
+ int TransactionCount,
+ DateTime CreatedAt,
+ DateTime UpdatedAt);
+
+///
+/// EN: DTO for wallet statistics.
+/// VI: DTO cho thống kê ví.
+///
+public record WalletStatisticsDto(
+ int TotalWallets,
+ int ActiveWallets,
+ int FrozenWallets,
+ int ClosedWallets,
+ Dictionary TotalBalanceByCurrency,
+ decimal TotalTransactionsToday,
+ decimal TotalDepositsToday,
+ decimal TotalWithdrawalsToday);
+
+///
+/// EN: DTO for admin point accounts list with pagination.
+/// VI: DTO cho danh sách tài khoản điểm Admin với phân trang.
+///
+public record AdminPointAccountsListDto(
+ List Accounts,
+ int TotalCount,
+ int Page,
+ int PageSize);
+
+public record AdminPointAccountSummaryDto(
+ Guid Id,
+ Guid UserId,
+ long TotalPoints,
+ long AvailablePoints,
+ DateTime CreatedAt);
+
+public record AdminPointAccountDetailDto(
+ Guid Id,
+ Guid UserId,
+ long TotalPoints,
+ long AvailablePoints,
+ int TransactionCount,
+ DateTime CreatedAt,
+ DateTime UpdatedAt);
+
+///
+/// EN: DTO for points statistics.
+/// VI: DTO cho thống kê điểm.
+///
+public record PointsStatisticsDto(
+ int TotalAccounts,
+ long TotalPointsIssued,
+ long TotalPointsAvailable,
+ long TotalPointsSpent,
+ long TotalPointsExpired,
+ long PointsEarnedToday,
+ long PointsSpentToday);
+
+#endregion
diff --git a/services/wallet-service-net/src/WalletService.API/Controllers/Admin/AdminPointsController.cs b/services/wallet-service-net/src/WalletService.API/Controllers/Admin/AdminPointsController.cs
new file mode 100644
index 00000000..e3ef193a
--- /dev/null
+++ b/services/wallet-service-net/src/WalletService.API/Controllers/Admin/AdminPointsController.cs
@@ -0,0 +1,168 @@
+namespace WalletService.API.Controllers.Admin;
+
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Swashbuckle.AspNetCore.Annotations;
+using WalletService.API.Application.Commands;
+using WalletService.API.Application.Queries;
+using WalletService.API.Controllers;
+using WalletService.Domain.AggregatesModel.PointAccountAggregate;
+
+///
+/// EN: Admin controller for points management operations (Backoffice).
+/// VI: Controller Admin cho các thao tác quản lý điểm (Backoffice).
+///
+[ApiController]
+[Route("api/v1/admin/points")]
+[Authorize(Roles = "Admin,SuperAdmin")]
+[SwaggerTag("Admin Points Management / Quản lý điểm Admin")]
+public class AdminPointsController : ControllerBase
+{
+ private readonly IMediator _mediator;
+ private readonly IPointAccountRepository _pointAccountRepository;
+ private readonly ILogger _logger;
+
+ public AdminPointsController(
+ IMediator mediator,
+ IPointAccountRepository pointAccountRepository,
+ ILogger logger)
+ {
+ _mediator = mediator;
+ _pointAccountRepository = pointAccountRepository;
+ _logger = logger;
+ }
+
+ ///
+ /// EN: Get all point accounts with pagination.
+ /// VI: Lấy tất cả tài khoản điểm với phân trang.
+ ///
+ [HttpGet]
+ [SwaggerOperation(Summary = "Get all point accounts", Description = "Get all point accounts with pagination (Admin only)")]
+ [SwaggerResponse(200, "Success", typeof(ApiResponse))]
+ public async Task GetAllPointAccounts(
+ [FromQuery] int page = 1,
+ [FromQuery] int pageSize = 20,
+ [FromQuery] long? minPoints = null,
+ [FromQuery] long? maxPoints = null)
+ {
+ var query = new GetAllPointAccountsQuery(page, pageSize, minPoints, maxPoints);
+ var result = await _mediator.Send(query);
+
+ return Ok(new ApiResponse(true, "Success", result));
+ }
+
+ ///
+ /// EN: Get point account details by ID.
+ /// VI: Lấy chi tiết tài khoản điểm theo ID.
+ ///
+ [HttpGet("{accountId:guid}")]
+ [SwaggerOperation(Summary = "Get point account by ID", Description = "Get point account details by ID (Admin only)")]
+ [SwaggerResponse(200, "Success", typeof(ApiResponse))]
+ [SwaggerResponse(404, "Point account not found")]
+ public async Task GetPointAccountById(Guid accountId)
+ {
+ var query = new GetPointAccountByIdQuery(accountId);
+ var result = await _mediator.Send(query);
+
+ if (result == null)
+ return NotFound(new ApiResponse