Index.cshtml.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using Domain.Entities.Store.ValueObject;
  2. using SharedKernel.Extensions;
  3. using SharedKernel.Helpers;
  4. using Application.Abstractions.Messaging;
  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.Shipment;
  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, 3, 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 ShipmentStatus? Status { get; set; }
  32. }
  33. public int Total { get; set; }
  34. public SearchShipments.Response.StatusCounts? Counts { get; set; }
  35. public List<(
  36. int Num,
  37. int ID,
  38. int OrderID,
  39. string OrderNumber,
  40. string BuyerEmail,
  41. ShipmentStatus Status,
  42. string StatusText,
  43. string? Carrier,
  44. string? TrackingNumber,
  45. string CreatedAt,
  46. string? ShippedAt,
  47. string? DeliveredAt,
  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 SearchShipments.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. var qs = Request.QueryString.ToString();
  69. List = [.. result.List.Select(c => (
  70. c.Num,
  71. c.ID,
  72. c.OrderID,
  73. c.OrderNumber,
  74. c.BuyerEmail,
  75. c.Status,
  76. StatusText: StatusToText(c.Status),
  77. c.Carrier,
  78. c.TrackingNumber,
  79. c.CreatedAt.GetDateAt(),
  80. c.ShippedAt?.ToString("yyyy-MM-dd HH:mm"),
  81. c.DeliveredAt?.ToString("yyyy-MM-dd HH:mm"),
  82. DetailURL: $"/Store/Shipment/Detail/{c.ID}{qs}"
  83. ))];
  84. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  85. }
  86. public static string StatusToText(ShipmentStatus s) => s switch
  87. {
  88. ShipmentStatus.Preparing => "준비중",
  89. ShipmentStatus.Pickup => "집화",
  90. ShipmentStatus.InTransit => "배송중",
  91. ShipmentStatus.Delivered => "배송완료",
  92. ShipmentStatus.Failed => "실패",
  93. _ => "?"
  94. };
  95. }