Files
Kayori_MedusaPluginChargeMa…/MedusaPluginChargeMachine/Handlers/LA9/GetLastLogEaChargeHandler.cs
T
Kayori e5bdb3eb95 Fix multi-bill display, charge amount parsing, and charge log responses
- chargeoptions is the real field gating 2000/5000/10000 yen display
- chargeid (not chargenum) carries the actual denomination on charge
- getrecentcharge/getlastlog: fixed num mismatch, added missing result
  section, and added placeholder items for empty result sets
2026-09-07 02:14:14 +02:00

111 lines
3.5 KiB
C#

using Abstractions.Handlers;
using Abstractions.SerializationTypes;
using MedusaPluginChargeMachine.Models.Request;
using MedusaPluginChargeMachine.Models.Response;
using MedusaPluginChargeMachine.Services;
using Microsoft.EntityFrameworkCore;
namespace MedusaPluginChargeMachine.Handlers.LA9;
public class GetLastLogEaChargeHandler(ISessionService sessionService, ChargeMachineDbContext db)
: Handler<GetLastLogRequest, GetLastLogEaChargeResponse>
{
public override void Configure()
{
Module("eacharge");
Method("getlastlog");
}
public override async Task<GetLastLogEaChargeResponse> HandleAsync(GetLastLogRequest req, GameModel model)
{
var today = DateTime.UtcNow.Date;
var cardId = (string?)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 todayRows = await query
.Where(h => h.OrderDate.Date == today)
.ToListAsync();
var todayTotal = todayRows.Sum(h => h.ChargeAmount);
var headerItems = todayRows
.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 recentItems = await query
.OrderByDescending(h => h.OrderDate)
.Take(10)
.ToListAsync();
var resultItems = recentItems
.Select(h => new GetLastLogResultItem
{
OrderDate = new XrpcString(h.OrderDate.ToString("yyyyMMddHHmmss")),
ChargeId = new XrpcString($"N{Denomination(h)}P"),
ChargeNum = new XrpcInt(h.ChargeNum),
CardType = new XrpcInt(1),
CardNo = new XrpcString(MaskCardId(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 XrpcInt(1),
CardNo = new XrpcString("")
});
}
return new GetLastLogEaChargeResponse
{
Status = 0,
Header = new GetLastLogEaChargeHeader
{
Chargedaily = new XrpcInt(todayTotal),
Items = headerItems
},
Result = new GetLastLogEaChargeResult
{
Items = resultItems
}
};
}
private static int Denomination(Entities.ChargeHistory h) =>
h.ChargeAmount / Math.Max(h.ChargeNum, 1);
private static string MaskCardId(string cardId) =>
cardId.Length <= 4
? new string('*', cardId.Length)
: new string('*', cardId.Length - 4) + cardId[^4..];
}