Index.cshtml.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using SharedKernel.Helpers;
  2. using SharedKernel.Extensions;
  3. using Domain.Entities.Wallets.ValueObject;
  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.Member.Wallet.Transactions;
  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. [DisplayName("페이지 번호")]
  18. public int PageNum { get; set; } = 1;
  19. [Range(1, 100)]
  20. [DisplayName("페이지 목록 수")]
  21. public ushort PerPage { get; set; } = 10;
  22. [DisplayName("검색 조건")]
  23. [Range(1, 5, ErrorMessage = "{0}이(가) 올바르지 않습니다.")]
  24. public int? Search { get; set; }
  25. [DisplayName("검색어")]
  26. [MaxLength(255, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
  27. public string? Keyword { get; set; }
  28. [DisplayName("시작일")]
  29. public string? StartAt { get; set; }
  30. [DisplayName("종료일")]
  31. public string? EndAt { get; set; }
  32. [DisplayName("거래 유형")]
  33. public WalletTransactionType? Type { get; set; }
  34. }
  35. public int Total { get; set; }
  36. public int TotalCharge { get; set; }
  37. public int TotalDonationIn { get; set; }
  38. public int TotalDonationOut { get; set; }
  39. public int TotalRewardEarned { get; set; }
  40. public int TotalSpend { get; set; }
  41. public int TotalRefund { get; set; }
  42. public int TotalLock { get; set; }
  43. public int TotalUnlock { get; set; }
  44. public int TotalAdjusted { get; set; }
  45. public List<(
  46. int Num,
  47. int ID,
  48. Guid WalletKey,
  49. int MemberID,
  50. string MemberEmail,
  51. string MemberName,
  52. string TxType,
  53. string BalanceType,
  54. string Amount,
  55. string BalanceAfter,
  56. string CreatedAt,
  57. string ViewURL
  58. )> List { get; set; } = [];
  59. public Pagination? Pagination { get; set; }
  60. public async Task OnGetAsync(CancellationToken ct)
  61. {
  62. if (!ModelState.IsValid)
  63. {
  64. return;
  65. }
  66. var result = await mediator.Send(new SearchWalletTransactions.Query(
  67. Query.PageNum,
  68. Query.PerPage,
  69. Query.Search,
  70. Query.Keyword,
  71. Query.StartAt,
  72. Query.EndAt,
  73. Query.Type
  74. ), ct);
  75. Total = result.Total;
  76. TotalCharge = result.TotalCharge;
  77. TotalDonationIn = result.TotalDonationIn;
  78. TotalDonationOut = result.TotalDonationOut;
  79. TotalRewardEarned = result.TotalRewardEarned;
  80. TotalSpend = result.TotalSpend;
  81. TotalRefund = result.TotalRefund;
  82. TotalLock = result.TotalLock;
  83. TotalUnlock = result.TotalUnlock;
  84. TotalAdjusted = result.TotalAdjusted;
  85. var qs = Request.QueryString.ToString();
  86. List = [..result.List.Select(c => (
  87. c.Num,
  88. c.ID,
  89. c.WalletKey,
  90. c.MemberID,
  91. c.MemberEmail,
  92. MemberName: c.MemberName ?? "-",
  93. TxType: GetTxTypeName(c.TxType),
  94. BalanceType: GetBalanceTypeName(c.BalanceType),
  95. Amount: c.Amount.ToString("N0"),
  96. BalanceAfter: c.BalanceAfter.ToString("N0"),
  97. CreatedAt: c.CreatedAt.GetDateAt(),
  98. ViewURL: $"/Member/Wallet/Transactions/View/{c.ID}{qs}"
  99. ))];
  100. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  101. }
  102. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  103. {
  104. try
  105. {
  106. if (ids.Length == 0)
  107. {
  108. throw new Exception("삭제할 항목을 선택해주세요.");
  109. }
  110. await mediator.Send(new DeleteWalletTransaction.Command(ids), ct);
  111. TempData["SuccessMessage"] = $"{ids.Length}건이 삭제되었습니다.";
  112. }
  113. catch (Exception e)
  114. {
  115. TempData["ErrorMessages"] = e.Message;
  116. }
  117. return RedirectToPage(Query);
  118. }
  119. private static string GetTxTypeName(WalletTransactionType type) => type switch
  120. {
  121. WalletTransactionType.Charge => "충전",
  122. WalletTransactionType.DonationIn => "후원 받음",
  123. WalletTransactionType.DonationOut => "후원 보냄",
  124. WalletTransactionType.RewardEarned => "보상 적립",
  125. WalletTransactionType.Spend => "사용",
  126. WalletTransactionType.Refund => "환불",
  127. WalletTransactionType.Lock => "잠금",
  128. WalletTransactionType.Unlock => "잠금 해제",
  129. WalletTransactionType.Adjusted => "조정",
  130. _ => type.ToString()
  131. };
  132. private static string GetBalanceTypeName(WalletBalanceType type) => type switch
  133. {
  134. WalletBalanceType.PgCharged => "PG 충전",
  135. WalletBalanceType.Deposit => "직접 입금",
  136. WalletBalanceType.Donation => "후원",
  137. WalletBalanceType.Reward => "보상",
  138. WalletBalanceType.Airdrop => "에어드랍",
  139. WalletBalanceType.Locked => "잠금",
  140. WalletBalanceType.Adjusted => "조정",
  141. _ => type.ToString()
  142. };
  143. }