using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using TakeoutSaaS.Application.App.Deliveries.Commands; using TakeoutSaaS.Application.App.Deliveries.Dto; using TakeoutSaaS.Application.App.Deliveries.Queries; using TakeoutSaaS.Domain.Deliveries.Enums; using TakeoutSaaS.Module.Authorization.Attributes; using TakeoutSaaS.Shared.Abstractions.Constants; using TakeoutSaaS.Shared.Abstractions.Results; using TakeoutSaaS.Shared.Web.Api; namespace TakeoutSaaS.AdminApi.Controllers; /// /// 配送单管理。 /// [ApiVersion("1.0")] [Authorize] [Route("api/admin/v{version:apiVersion}/deliveries")] public sealed class DeliveriesController(IMediator mediator) : BaseApiController { /// /// 创建配送单。 /// /// 创建命令。 /// 取消标记。 /// 创建后的配送单。 [HttpPost] [PermissionAuthorize("delivery:create")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] public async Task> Create([FromBody] CreateDeliveryOrderCommand command, CancellationToken cancellationToken) { // 1. 创建配送单 var result = await mediator.Send(command, cancellationToken); // 2. 返回创建结果 return ApiResponse.Ok(result); } /// /// 查询配送单列表。 /// /// 订单 ID。 /// 配送状态。 /// 页码。 /// 每页大小。 /// 排序字段。 /// 是否倒序。 /// 取消标记。 /// 配送单分页列表。 [HttpGet] [PermissionAuthorize("delivery:read")] [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] public async Task>> List( [FromQuery] long? orderId, [FromQuery] DeliveryStatus? status, [FromQuery] int page = 1, [FromQuery] int pageSize = 20, [FromQuery] string? sortBy = null, [FromQuery] bool sortDesc = true, CancellationToken cancellationToken = default) { // 1. 组装查询参数 var result = await mediator.Send(new SearchDeliveryOrdersQuery { OrderId = orderId, Status = status, Page = page, PageSize = pageSize, SortBy = sortBy, SortDescending = sortDesc }, cancellationToken); // 2. 返回分页结果 return ApiResponse>.Ok(result); } /// /// 获取配送单详情。 /// /// 配送单 ID。 /// 取消标记。 /// 配送单详情或未找到。 [HttpGet("{deliveryOrderId:long}")] [PermissionAuthorize("delivery:read")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status404NotFound)] public async Task> Detail(long deliveryOrderId, CancellationToken cancellationToken) { // 1. 查询配送单详情 var result = await mediator.Send(new GetDeliveryOrderByIdQuery { DeliveryOrderId = deliveryOrderId }, cancellationToken); // 2. 返回详情或 404 return result == null ? ApiResponse.Error(ErrorCodes.NotFound, "配送单不存在") : ApiResponse.Ok(result); } /// /// 更新配送单。 /// /// 配送单 ID。 /// 更新命令。 /// 取消标记。 /// 更新后的配送单或未找到。 [HttpPut("{deliveryOrderId:long}")] [PermissionAuthorize("delivery:update")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status404NotFound)] public async Task> Update(long deliveryOrderId, [FromBody] UpdateDeliveryOrderCommand command, CancellationToken cancellationToken) { // 1. 确保命令携带配送单标识 if (command.DeliveryOrderId == 0) { command = command with { DeliveryOrderId = deliveryOrderId }; } // 2. 执行更新 var result = await mediator.Send(command, cancellationToken); // 3. 返回更新结果或 404 return result == null ? ApiResponse.Error(ErrorCodes.NotFound, "配送单不存在") : ApiResponse.Ok(result); } /// /// 删除配送单。 /// /// 配送单 ID。 /// 取消标记。 /// 删除结果,未找到则返回错误。 [HttpDelete("{deliveryOrderId:long}")] [PermissionAuthorize("delivery:delete")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status404NotFound)] public async Task> Delete(long deliveryOrderId, CancellationToken cancellationToken) { // 1. 执行删除 var success = await mediator.Send(new DeleteDeliveryOrderCommand { DeliveryOrderId = deliveryOrderId }, cancellationToken); // 2. 返回结果或 404 return success ? ApiResponse.Ok(null) : ApiResponse.Error(ErrorCodes.NotFound, "配送单不存在"); } }