Index.cshtml.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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 Microsoft.AspNetCore.Mvc.Rendering;
  8. using System.ComponentModel;
  9. using System.ComponentModel.DataAnnotations;
  10. namespace Admin.Pages.Store.Settlement;
  11. public class IndexModel(IMediator mediator) : PageModel
  12. {
  13. [BindProperty(SupportsGet = true)]
  14. public QueryParams Query { get; set; } = new();
  15. public sealed class QueryParams
  16. {
  17. [Range(1, int.MaxValue)]
  18. public int PageNum { get; set; } = 1;
  19. [Range(1, 100)]
  20. public ushort PerPage { get; set; } = 20;
  21. [DisplayName("게임")]
  22. public int? GameID { get; set; }
  23. [DisplayName("연도")]
  24. [Range(2000, 9999)]
  25. public int? Year { get; set; }
  26. [DisplayName("월")]
  27. [Range(1, 12)]
  28. public int? Month { get; set; }
  29. [DisplayName("정산 상태")]
  30. public GameSettlementStatus? Status { get; set; }
  31. }
  32. public int Total { get; set; }
  33. public SearchGameSettlements.Response.StatusCounts? Counts { get; set; }
  34. public SearchGameSettlements.Response.Summary? Totals { get; set; }
  35. public List<SelectListItem> Games { get; set; } = [];
  36. public List<(
  37. int Num,
  38. int ID,
  39. int GameID,
  40. string GameName,
  41. string GamePublisher,
  42. int Year,
  43. int Month,
  44. int TotalRevenueAmount,
  45. int OrderCount,
  46. GameSettlementStatus Status,
  47. string StatusText,
  48. string CreatedAt,
  49. string? SettledAt,
  50. string? SettledByAdminEmail,
  51. string DetailURL
  52. )> List { get; set; } = [];
  53. public Pagination? Pagination { get; set; }
  54. public async Task OnGetAsync(CancellationToken ct)
  55. {
  56. if (!ModelState.IsValid)
  57. {
  58. return;
  59. }
  60. await LoadGamesAsync(ct);
  61. var result = await mediator.Send(new SearchGameSettlements.Query(
  62. Query.GameID,
  63. Query.Year,
  64. Query.Month,
  65. Query.Status,
  66. Query.PageNum,
  67. Query.PerPage
  68. ), ct);
  69. Total = result.Total;
  70. Counts = result.Counts;
  71. Totals = result.Totals;
  72. var qs = Request.QueryString.ToString();
  73. List = [.. result.List.Select(c => (
  74. c.Num,
  75. c.ID,
  76. c.GameID,
  77. c.GameName,
  78. c.GamePublisher,
  79. c.Year,
  80. c.Month,
  81. c.TotalRevenueAmount,
  82. c.OrderCount,
  83. c.Status,
  84. StatusText: StatusToText(c.Status),
  85. c.CreatedAt.GetDateAt(),
  86. c.SettledAt?.ToString("yyyy-MM-dd HH:mm"),
  87. c.SettledByAdminEmail,
  88. DetailURL: $"/Store/Settlement/Detail/{c.ID}{qs}"
  89. ))];
  90. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  91. }
  92. private async Task LoadGamesAsync(CancellationToken ct)
  93. {
  94. var result = await mediator.Send(new GetGames.Query(false), ct);
  95. Games = [.. result.List.Select(g => new SelectListItem
  96. {
  97. Value = g.ID.ToString(),
  98. Text = $"{g.KorName} ({g.Publisher})"
  99. })];
  100. }
  101. public static string StatusToText(GameSettlementStatus s) => s switch
  102. {
  103. GameSettlementStatus.Pending => "정산 대기",
  104. GameSettlementStatus.Settled => "정산 완료",
  105. _ => "?"
  106. };
  107. }