diff --git a/src/Api/TakeoutSaaS.AdminApi/Contracts/Requests/SearchTenantBillsRequest.cs b/src/Api/TakeoutSaaS.AdminApi/Contracts/Requests/SearchTenantBillsRequest.cs
new file mode 100644
index 0000000..d99fcad
--- /dev/null
+++ b/src/Api/TakeoutSaaS.AdminApi/Contracts/Requests/SearchTenantBillsRequest.cs
@@ -0,0 +1,34 @@
+using TakeoutSaaS.Domain.Tenants.Enums;
+
+namespace TakeoutSaaS.AdminApi.Contracts.Requests;
+
+///
+/// 租户账单分页查询请求(QueryString 参数)。
+///
+public sealed record SearchTenantBillsRequest
+{
+ ///
+ /// 账单状态筛选。
+ ///
+ public TenantBillingStatus? Status { get; init; }
+
+ ///
+ /// 账单起始时间(UTC)筛选。
+ ///
+ public DateTime? From { get; init; }
+
+ ///
+ /// 账单结束时间(UTC)筛选。
+ ///
+ public DateTime? To { get; init; }
+
+ ///
+ /// 页码(从 1 开始)。
+ ///
+ public int Page { get; init; } = 1;
+
+ ///
+ /// 每页条数。
+ ///
+ public int PageSize { get; init; } = 20;
+}
diff --git a/src/Api/TakeoutSaaS.AdminApi/Controllers/BillingsController.cs b/src/Api/TakeoutSaaS.AdminApi/Controllers/BillingsController.cs
index 97d43df..8ead5d2 100644
--- a/src/Api/TakeoutSaaS.AdminApi/Controllers/BillingsController.cs
+++ b/src/Api/TakeoutSaaS.AdminApi/Controllers/BillingsController.cs
@@ -1,6 +1,7 @@
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.Net.Http.Headers;
using System.ComponentModel.DataAnnotations;
using TakeoutSaaS.Application.App.Billings.Commands;
using TakeoutSaaS.Application.App.Billings.Dto;
@@ -16,7 +17,7 @@ namespace TakeoutSaaS.AdminApi.Controllers;
///
[ApiVersion("1.0")]
[Authorize]
-[Route("api/admin/v{version:apiVersion}/bills")]
+[Route("api/admin/v{version:apiVersion}/billings")]
public sealed class BillingsController(IMediator mediator) : BaseApiController
{
///
@@ -25,11 +26,14 @@ public sealed class BillingsController(IMediator mediator) : BaseApiController
/// 账单分页结果。
[HttpGet]
[PermissionAuthorize("bill:read")]
- [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)]
- public async Task>> GetList([FromQuery] GetBillListQuery query, CancellationToken cancellationToken)
+ [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)]
+ public async Task>> GetList([FromQuery] GetBillingListQuery query, CancellationToken cancellationToken)
{
+ // 1. 查询账单列表
var result = await mediator.Send(query, cancellationToken);
- return ApiResponse>.Ok(result);
+
+ // 2. 返回分页结果
+ return ApiResponse>.Ok(result);
}
///
@@ -40,15 +44,15 @@ public sealed class BillingsController(IMediator mediator) : BaseApiController
/// 账单详情。
[HttpGet("{id:long}")]
[PermissionAuthorize("bill:read")]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status404NotFound)]
- public async Task> GetDetail(long id, CancellationToken cancellationToken)
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(ApiResponse