mirror of
https://gitea.tendokyu.moe/Kayori/MedusaPluginChargeMachine.git
synced 2026-10-04 04:57:56 +03:00
- 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
111 lines
3.5 KiB
C#
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..];
|
|
}
|