mirror of
https://gitea.tendokyu.moe/Kayori/MedusaPluginChargeMachine.git
synced 2026-10-03 20:47: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
89 lines
2.9 KiB
C#
89 lines
2.9 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 GetRecentChargeEaChargeHandler(ISessionService sessionService, ChargeMachineDbContext db)
|
|
: Handler<GetRecentChargeRequest, GetRecentChargeResponse>
|
|
{
|
|
public override void Configure()
|
|
{
|
|
Module("eacharge");
|
|
Method("getrecentcharge");
|
|
}
|
|
|
|
public override async Task<GetRecentChargeResponse> HandleAsync(GetRecentChargeRequest req, GameModel model)
|
|
{
|
|
var cardId = ResolveCardId(req);
|
|
|
|
var page = int.TryParse(req.Page, out var p) ? Math.Max(1, p) : 1;
|
|
|
|
var perPage = int.TryParse(req.Num, out var n) ? Math.Max(1, n)
|
|
: int.TryParse(req.PerPage, out var pp) ? Math.Max(1, pp)
|
|
: 10;
|
|
|
|
var query = db.ChargeHistories.AsQueryable();
|
|
|
|
if (cardId is not null)
|
|
query = query.Where(h => h.CardId == cardId);
|
|
|
|
if (req.TargetDate is not null && DateTime.TryParse(req.TargetDate, out var targetDate))
|
|
query = query.Where(h => h.OrderDate.Date == targetDate.Date);
|
|
|
|
var rows = await query
|
|
.OrderByDescending(h => h.OrderDate)
|
|
.Skip((page - 1) * perPage)
|
|
.Take(perPage)
|
|
.ToListAsync();
|
|
|
|
var items = rows.Select(h => new GetRecentChargeItem
|
|
{
|
|
RcvTime = new XrpcString(h.OrderDate.ToString("yyyyMMddHHmmss")),
|
|
ChrgPrice = new XrpcInt(h.ChargeAmount),
|
|
CardNo = new XrpcString(MaskCardId(h.CardId)),
|
|
AccCode = new XrpcString(""),
|
|
RcvStatus = new XrpcInt(0),
|
|
FontColor = new XrpcString("#FFFFFF")
|
|
}).ToList();
|
|
|
|
if (items.Count == 0)
|
|
{
|
|
items.Add(new GetRecentChargeItem
|
|
{
|
|
RcvTime = new XrpcString(""),
|
|
ChrgPrice = new XrpcInt(0),
|
|
CardNo = new XrpcString(""),
|
|
AccCode = new XrpcString(""),
|
|
RcvStatus = new XrpcInt(0),
|
|
FontColor = new XrpcString("#FFFFFF")
|
|
});
|
|
}
|
|
|
|
return new GetRecentChargeResponse
|
|
{
|
|
Status = 0,
|
|
Num = new XrpcInt(items.Count),
|
|
Items = items
|
|
};
|
|
}
|
|
|
|
private string? ResolveCardId(GetRecentChargeRequest req)
|
|
{
|
|
if (req.SessionId is not null)
|
|
{
|
|
try { return sessionService.GetSession(req.SessionId).refId; }
|
|
catch { /* fall through to cardid */ }
|
|
}
|
|
return req.CardId;
|
|
}
|
|
|
|
private static string MaskCardId(string cardId) =>
|
|
cardId.Length <= 4
|
|
? new string('*', cardId.Length)
|
|
: new string('*', cardId.Length - 4) + cardId[^4..];
|
|
}
|