diff --git a/src/Api/TakeoutSaaS.TenantApi/Controllers/StoreController.cs b/src/Api/TakeoutSaaS.TenantApi/Controllers/StoreController.cs
new file mode 100644
index 0000000..976fb52
--- /dev/null
+++ b/src/Api/TakeoutSaaS.TenantApi/Controllers/StoreController.cs
@@ -0,0 +1,112 @@
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using TakeoutSaaS.Application.App.Stores.Commands;
+using TakeoutSaaS.Application.App.Stores.Dto;
+using TakeoutSaaS.Application.App.Stores.Queries;
+using TakeoutSaaS.Shared.Abstractions.Results;
+using TakeoutSaaS.Shared.Web.Api;
+
+namespace TakeoutSaaS.TenantApi.Controllers;
+
+///
+/// 租户端门店管理。
+///
+[ApiVersion("1.0")]
+[Authorize]
+[Route("api/tenant/v{version:apiVersion}/store")]
+public sealed class StoreController(IMediator mediator) : BaseApiController
+{
+ ///
+ /// 查询门店列表。
+ ///
+ /// 查询参数。
+ /// 取消标记。
+ /// 分页列表。
+ [HttpGet("list")]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)]
+ public async Task> List([FromQuery] SearchStoresQuery query, CancellationToken cancellationToken)
+ {
+ // 1. 查询门店分页
+ var result = await mediator.Send(query, cancellationToken);
+
+ // 2. 返回分页数据
+ return ApiResponse.Ok(result);
+ }
+
+ ///
+ /// 查询门店统计。
+ ///
+ /// 取消标记。
+ /// 统计结果。
+ [HttpGet("stats")]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)]
+ public async Task> Stats(CancellationToken cancellationToken)
+ {
+ // 1. 查询门店统计
+ var result = await mediator.Send(new GetStoreStatsQuery(), cancellationToken);
+
+ // 2. 返回统计结果
+ return ApiResponse.Ok(result);
+ }
+
+ ///
+ /// 创建门店。
+ ///
+ /// 创建命令。
+ /// 取消标记。
+ /// 创建结果。
+ [HttpPost("create")]
+ [ProducesResponseType(typeof(ApiResponse