| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.Paper.GetOrders;
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- public async Task<Response> Handle(Query request, CancellationToken ct)
- {
- var accountID = await db.PaperAccount.AsNoTracking().Where(c => c.MemberID == request.MemberID).Select(c => (int?)c.ID).FirstOrDefaultAsync(ct);
- if (accountID is null)
- {
- return new Response(0, []);
- }
- var query = db.PaperOrder.AsNoTracking().Where(c => c.AccountID == accountID.Value);
- if (request.Status.HasValue)
- {
- query = query.Where(c => c.Status == request.Status.Value);
- }
- var total = await query.CountAsync(ct);
- var orders = await query
- .OrderByDescending(c => c.ID)
- .Skip((request.Page - 1) * request.PerPage)
- .Take(request.PerPage)
- .Select(c => new
- {
- c.ID,
- c.StockCode,
- c.Side,
- c.FillRule,
- c.Quantity,
- c.ReservedAmount,
- c.TargetDate,
- c.CancelableUntil,
- c.Status,
- c.RejectReason,
- c.CreatedAt,
- Fill = db.PaperFill.Where(f => f.OrderID == c.ID).Select(f => new Response.FillInfo(
- f.Price,
- f.Quantity,
- f.Fee,
- f.Tax,
- f.Amount,
- f.RealizedPnL,
- f.PriceDate,
- f.FilledAt
- )).FirstOrDefault()
- })
- .ToListAsync(ct);
- var codes = orders.Select(c => c.StockCode).Distinct().ToList();
- var names = await db.Stock.AsNoTracking()
- .Where(c => codes.Contains(c.Code))
- .Select(c => new { c.Code, c.Name })
- .ToDictionaryAsync(c => c.Code, c => c.Name, ct);
- var list = orders.Select(c => new Response.Row(
- c.ID,
- c.StockCode,
- names.GetValueOrDefault(c.StockCode, c.StockCode),
- c.Side.ToString(),
- c.FillRule.ToString(),
- c.Quantity,
- c.ReservedAmount,
- c.TargetDate,
- c.CancelableUntil,
- c.Status.ToString(),
- c.RejectReason,
- c.CreatedAt,
- c.Fill
- )).ToList();
- return new Response(total, list);
- }
- }
|