Files

112 lines
3.7 KiB
C#

using Abstractions.Handlers;
using Abstractions.SerializationTypes;
using Abstractions.Services;
using MedusaPluginChargeMachine.Models.Request;
using MedusaPluginChargeMachine.Models.Response;
using MedusaPluginChargeMachine.Services;
using Microsoft.EntityFrameworkCore;
namespace MedusaPluginChargeMachine.Handlers.LA9;
public class GetLastLogEaChargeHandler(ISessionService sessionService, ICardService cardService, ChargeMachineDbContext db)
: Handler<GetLastLogRequest, GetLastLogEaChargeResponse>
{
public override void Configure()
{
Module("eacharge");
Method("getlastlog");
}
public override async Task<GetLastLogEaChargeResponse> HandleAsync(GetLastLogRequest req, GameModel model)
{
var targetDate = DateTime.TryParse(req.TargetDate, out var td) ? td.Date : DateTime.Now.Date;
var utcDayStart = targetDate.ToUniversalTime();
var utcDayEnd = utcDayStart.AddDays(1);
var page = int.TryParse(req.Page, out var p) ? Math.Max(0, p) : 0;
var perPage = int.TryParse(req.PerPage, out var pp) ? Math.Max(1, pp) : 8;
string? cardId = null;
if (req.SessionId is not null)
{
var session = sessionService.GetSession(req.SessionId);
cardId = session.refId;
}
var query = db.ChargeHistories.AsQueryable();
if (cardId is not null)
query = query.Where(h => h.CardId == cardId);
var dayRows = await query
.Where(h => h.OrderDate >= utcDayStart && h.OrderDate < utcDayEnd)
.ToListAsync();
var dayTotal = dayRows.Sum(h => h.ChargeAmount);
var headerItems = dayRows
.GroupBy(Denomination)
.Select(g => new GetLastLogChargeItem
{
ChargeId = new XrpcString($"N{g.Key}P"),
ChargeNum = new XrpcInt(g.Sum(h => h.ChargeNum)),
ChargeAmount = new XrpcInt(g.Sum(h => h.ChargeAmount))
})
.ToList();
var resultItems = dayRows
.OrderByDescending(h => h.OrderDate)
.Skip(page * perPage)
.Take(perPage)
.Select(h => new GetLastLogResultItem
{
OrderDate = new XrpcString(h.OrderDate.ToLocalTime().ToString("yyyy-MM-dd HH:mm")),
ChargeId = new XrpcString($"N{Denomination(h)}P"),
ChargeNum = new XrpcInt(h.ChargeNum),
CardType = new XrpcString("1"),
CardNo = new XrpcString(cardService.ConvertUidToKonamiId(h.CardId))
})
.ToList();
if (headerItems.Count == 0)
{
headerItems.Add(new GetLastLogChargeItem
{
ChargeId = new XrpcString("N1000P"),
ChargeNum = new XrpcInt(0),
ChargeAmount = new XrpcInt(0)
});
}
if (resultItems.Count == 0)
{
resultItems.Add(new GetLastLogResultItem
{
OrderDate = new XrpcString("-"),
ChargeId = new XrpcString("N1000P"),
ChargeNum = new XrpcInt(0),
CardType = new XrpcString("1"),
CardNo = new XrpcString("-")
});
}
return new GetLastLogEaChargeResponse
{
Status = 0,
Header = new GetLastLogEaChargeHeader
{
Chargedaily = new XrpcInt(dayTotal),
Items = headerItems
},
Result = new GetLastLogEaChargeResult
{
Items = resultItems
}
};
}
private static int Denomination(Entities.ChargeHistory h) =>
h.ChargeAmount / Math.Max(h.ChargeNum, 1);
}