Index.cshtml.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using Application.Abstractions.Data;
  2. using Domain.Entities.Paper.ValueObject;
  3. using SharedKernel.Helpers;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using Microsoft.EntityFrameworkCore;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. namespace Admin.Pages.Paper.Orders;
  10. // 모의투자 주문 모니터 (읽기 전용) — d4 §⑤ /Paper/Orders
  11. public class IndexModel(IAppDbContext db) : 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 PaperOrderStatus? Status { get; set; }
  23. }
  24. public int Total { get; set; }
  25. public List<(
  26. int Num,
  27. int ID,
  28. string SID,
  29. string? Nickname,
  30. string StockCode,
  31. PaperOrderSide Side,
  32. PaperFillRule FillRule,
  33. int Quantity,
  34. decimal ReservedAmount,
  35. string TargetDate,
  36. PaperOrderStatus Status,
  37. string StatusText,
  38. string? RejectReason,
  39. string CreatedAt
  40. )> List { get; set; } = [];
  41. public Pagination? Pagination { get; set; }
  42. public async Task OnGetAsync(CancellationToken ct)
  43. {
  44. if (!ModelState.IsValid)
  45. {
  46. return;
  47. }
  48. var query = from o in db.PaperOrder.AsNoTracking()
  49. join a in db.PaperAccount.AsNoTracking() on o.AccountID equals a.ID
  50. join m in db.Member.AsNoTracking() on a.MemberID equals m.ID
  51. select new
  52. {
  53. o.ID,
  54. m.SID,
  55. Nickname = m.Name,
  56. o.StockCode,
  57. o.Side,
  58. o.FillRule,
  59. o.Quantity,
  60. o.ReservedAmount,
  61. o.TargetDate,
  62. o.Status,
  63. o.RejectReason,
  64. o.CreatedAt
  65. };
  66. if (Query.Status.HasValue)
  67. {
  68. query = query.Where(c => c.Status == Query.Status.Value);
  69. }
  70. Total = await query.CountAsync(ct);
  71. var skip = (Query.PageNum - 1) * Query.PerPage;
  72. var rows = await query.OrderByDescending(c => c.ID).Skip(skip).Take(Query.PerPage).ToListAsync(ct);
  73. var num = skip + 1;
  74. List = [.. rows.Select(c => (
  75. Num: num++,
  76. c.ID,
  77. c.SID,
  78. c.Nickname,
  79. c.StockCode,
  80. c.Side,
  81. c.FillRule,
  82. c.Quantity,
  83. c.ReservedAmount,
  84. TargetDate: c.TargetDate.ToString("yyyy-MM-dd"),
  85. c.Status,
  86. StatusText: StatusToText(c.Status),
  87. c.RejectReason,
  88. CreatedAt: c.CreatedAt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")
  89. ))];
  90. Pagination = new Pagination(Total, Query.PageNum, Query.PerPage);
  91. }
  92. public static string StatusToText(PaperOrderStatus s) => s switch
  93. {
  94. PaperOrderStatus.Pending => "접수",
  95. PaperOrderStatus.Filled => "체결",
  96. PaperOrderStatus.Cancelled => "취소",
  97. PaperOrderStatus.Rejected => "거부",
  98. _ => "?"
  99. };
  100. public static string SideToText(PaperOrderSide s) => s switch
  101. {
  102. PaperOrderSide.Buy => "매수",
  103. PaperOrderSide.Sell => "매도",
  104. _ => "?"
  105. };
  106. public static string FillRuleToText(PaperFillRule r) => r switch
  107. {
  108. PaperFillRule.Open => "시가",
  109. PaperFillRule.Close => "종가",
  110. _ => "?"
  111. };
  112. }