Handler.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Paper.GetOrders;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var accountID = await db.PaperAccount.AsNoTracking().Where(c => c.MemberID == request.MemberID).Select(c => (int?)c.ID).FirstOrDefaultAsync(ct);
  10. if (accountID is null)
  11. {
  12. return new Response(0, []);
  13. }
  14. var query = db.PaperOrder.AsNoTracking().Where(c => c.AccountID == accountID.Value);
  15. if (request.Status.HasValue)
  16. {
  17. query = query.Where(c => c.Status == request.Status.Value);
  18. }
  19. var total = await query.CountAsync(ct);
  20. var orders = await query
  21. .OrderByDescending(c => c.ID)
  22. .Skip((request.Page - 1) * request.PerPage)
  23. .Take(request.PerPage)
  24. .Select(c => new
  25. {
  26. c.ID,
  27. c.StockCode,
  28. c.Side,
  29. c.FillRule,
  30. c.Quantity,
  31. c.ReservedAmount,
  32. c.TargetDate,
  33. c.CancelableUntil,
  34. c.Status,
  35. c.RejectReason,
  36. c.CreatedAt,
  37. Fill = db.PaperFill.Where(f => f.OrderID == c.ID).Select(f => new Response.FillInfo(
  38. f.Price,
  39. f.Quantity,
  40. f.Fee,
  41. f.Tax,
  42. f.Amount,
  43. f.RealizedPnL,
  44. f.PriceDate,
  45. f.FilledAt
  46. )).FirstOrDefault()
  47. })
  48. .ToListAsync(ct);
  49. var codes = orders.Select(c => c.StockCode).Distinct().ToList();
  50. var names = await db.Stock.AsNoTracking()
  51. .Where(c => codes.Contains(c.Code))
  52. .Select(c => new { c.Code, c.Name })
  53. .ToDictionaryAsync(c => c.Code, c => c.Name, ct);
  54. var list = orders.Select(c => new Response.Row(
  55. c.ID,
  56. c.StockCode,
  57. names.GetValueOrDefault(c.StockCode, c.StockCode),
  58. c.Side,
  59. c.FillRule,
  60. c.Quantity,
  61. c.ReservedAmount,
  62. c.TargetDate,
  63. c.CancelableUntil,
  64. c.Status,
  65. c.RejectReason,
  66. c.CreatedAt,
  67. c.Fill
  68. )).ToList();
  69. return new Response(total, list);
  70. }
  71. }