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