Index.cshtml.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using Domain.Entities.Store.ValueObject;
  2. using SharedKernel.Extensions;
  3. using SharedKernel.Helpers;
  4. using MediatR;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.AspNetCore.Mvc.RazorPages;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. namespace Admin.Pages.Store.Order;
  10. public class IndexModel(IMediator mediator) : PageModel
  11. {
  12. [BindProperty(SupportsGet = true)]
  13. public QueryParams Query { get; set; } = new();
  14. public sealed class QueryParams
  15. {
  16. [Range(1, int.MaxValue)]
  17. public int PageNum { get; set; } = 1;
  18. [Range(1, 100)]
  19. public ushort PerPage { get; set; } = 20;
  20. [DisplayName("검색 조건")]
  21. [Range(1, 2, ErrorMessage = "{0}이(가) 올바르지 않습니다.")]
  22. public int? Search { get; set; }
  23. [DisplayName("검색어")]
  24. [MaxLength(100)]
  25. public string? Keyword { get; set; }
  26. [DisplayName("시작일")]
  27. public string? StartAt { get; set; }
  28. [DisplayName("종료일")]
  29. public string? EndAt { get; set; }
  30. [DisplayName("주문 상태")]
  31. public OrderStatus? Status { get; set; }
  32. }
  33. public int Total { get; set; }
  34. public SearchOrders.Response.StatusCounts? Counts { get; set; }
  35. public List<(
  36. int Num,
  37. int ID,
  38. string OrderNumber,
  39. string MemberEmail,
  40. string? ChannelName,
  41. int TotalAmount,
  42. int PlatformFee,
  43. int GameRevenue,
  44. int ChannelReward,
  45. OrderStatus Status,
  46. string StatusText,
  47. string CreatedAt,
  48. string DetailURL
  49. )> List { get; set; } = [];
  50. public Pagination? Pagination { get; set; }
  51. public async Task OnGetAsync(CancellationToken ct)
  52. {
  53. if (!ModelState.IsValid)
  54. {
  55. return;
  56. }
  57. var result = await mediator.Send(new SearchOrders.Query(
  58. Query.Search,
  59. Query.Keyword,
  60. Query.StartAt,
  61. Query.EndAt,
  62. Query.Status,
  63. Query.PageNum,
  64. Query.PerPage
  65. ), ct);
  66. Total = result.Total;
  67. Counts = result.Counts;
  68. List = [.. result.List.Select(c => (
  69. c.Num,
  70. c.ID,
  71. c.OrderNumber,
  72. c.MemberEmail,
  73. c.ChannelName,
  74. c.TotalAmount,
  75. c.PlatformFeeAmount,
  76. c.GameRevenueAmount,
  77. c.ChannelRewardAmount,
  78. c.Status,
  79. StatusText: StatusToText(c.Status),
  80. c.CreatedAt.GetDateAt(),
  81. DetailURL: $"/Store/Order/Detail/{c.ID}{Request.QueryString}"
  82. ))];
  83. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  84. }
  85. public static string StatusToText(OrderStatus s) => s switch
  86. {
  87. OrderStatus.Pending => "결제 전",
  88. OrderStatus.Paid => "결제완료",
  89. OrderStatus.Preparing => "준비중",
  90. OrderStatus.Shipped => "배송중",
  91. OrderStatus.Delivered => "배송완료",
  92. OrderStatus.Cancelled => "취소",
  93. OrderStatus.Refunded => "환불",
  94. OrderStatus.Exchanged => "교환",
  95. _ => "?"
  96. };
  97. }