using Domain.Entities.Store.ValueObject; using SharedKernel.Extensions; using SharedKernel.Helpers; using Application.Abstractions.Messaging; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.Store.Order; public class IndexModel(IMediator mediator) : PageModel { [BindProperty(SupportsGet = true)] public QueryParams Query { get; set; } = new(); public sealed class QueryParams { [Range(1, int.MaxValue)] public int PageNum { get; set; } = 1; [Range(1, 100)] public ushort PerPage { get; set; } = 20; [DisplayName("검색 조건")] [Range(1, 2, ErrorMessage = "{0}이(가) 올바르지 않습니다.")] public int? Search { get; set; } [DisplayName("검색어")] [MaxLength(100)] public string? Keyword { get; set; } [DisplayName("시작일")] public string? StartAt { get; set; } [DisplayName("종료일")] public string? EndAt { get; set; } [DisplayName("주문 상태")] public OrderStatus? Status { get; set; } } public int Total { get; set; } public SearchOrders.Response.StatusCounts? Counts { get; set; } public List<( int Num, int ID, string OrderNumber, string MemberEmail, string? ChannelName, int TotalAmount, int PlatformFee, int GameRevenue, int ChannelReward, OrderStatus Status, string StatusText, string CreatedAt, string DetailURL )> List { get; set; } = []; public Pagination? Pagination { get; set; } public async Task OnGetAsync(CancellationToken ct) { if (!ModelState.IsValid) { return; } var result = await mediator.Send(new SearchOrders.Query( Query.Search, Query.Keyword, Query.StartAt, Query.EndAt, Query.Status, Query.PageNum, Query.PerPage ), ct); Total = result.Total; Counts = result.Counts; List = [.. result.List.Select(c => ( c.Num, c.ID, c.OrderNumber, c.MemberEmail, c.ChannelName, c.TotalAmount, c.PlatformFeeAmount, c.GameRevenueAmount, c.ChannelRewardAmount, c.Status, StatusText: StatusToText(c.Status), c.CreatedAt.GetDateAt(), DetailURL: $"/Store/Order/Detail/{c.ID}{Request.QueryString}" ))]; Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage); } public static string StatusToText(OrderStatus s) => s switch { OrderStatus.Pending => "결제 전", OrderStatus.Paid => "결제완료", OrderStatus.Preparing => "준비중", OrderStatus.Shipped => "배송중", OrderStatus.Delivered => "배송완료", OrderStatus.Cancelled => "취소", OrderStatus.Refunded => "환불", OrderStatus.Exchanged => "교환", _ => "?" }; }