diff --git a/GameFrameX.Hotfix/Logic/ServerRole/Trade/TradeComponentAgent.cs b/GameFrameX.Hotfix/Logic/ServerRole/Trade/TradeComponentAgent.cs index 67cfc8bc..df15823c 100644 --- a/GameFrameX.Hotfix/Logic/ServerRole/Trade/TradeComponentAgent.cs +++ b/GameFrameX.Hotfix/Logic/ServerRole/Trade/TradeComponentAgent.cs @@ -90,10 +90,35 @@ public Task OnPlaceAsync(long playerId, ReqTradePlace request, RespTradePlace re var opposite = request.Side == TradeSide.Buy ? book.Sells : book.Buys; var (remaining, deals) = TradeRules.ExecuteMatch(order, opposite); + RecordDeals(order, response, deals, now); + + if (remaining > 0) + { + order.Remaining = (int)remaining; + var ownSide = request.Side == TradeSide.Buy ? book.Buys : book.Sells; + ownSide.Add(order); + ownSide.Sort(request.Side == TradeSide.Buy ? TradeRules.CompareBuy : TradeRules.CompareSell); + State.Orders[order.OrderId] = order; + response.OrderId = order.OrderId; + } + + response.Remaining = (int)remaining; + return Task.CompletedTask; + } + + /// + /// 逐笔成交落账:响应追加成交流水、状态记录 TradeDealState、对手挂单全额成交时从订单簿摘除。 + /// + /// 吃单(携带 PlayerId / Side / ItemId)。 + /// 挂单响应。 + /// 撮合成交明细。 + /// 当前 Unix 时间戳(秒)。 + private void RecordDeals(TradeOrderState taker, RespTradePlace response, List deals, long now) + { foreach (var deal in deals) { - var buyerPlayerId = request.Side == TradeSide.Buy ? playerId : deal.CounterpartyPlayerId; - var sellerPlayerId = request.Side == TradeSide.Buy ? deal.CounterpartyPlayerId : playerId; + var buyerPlayerId = taker.Side == TradeSide.Buy ? taker.PlayerId : deal.CounterpartyPlayerId; + var sellerPlayerId = taker.Side == TradeSide.Buy ? deal.CounterpartyPlayerId : taker.PlayerId; var tradeId = State.NextTradeId++; response.Trades.Add(new TradeDealInfo { @@ -105,7 +130,7 @@ public Task OnPlaceAsync(long playerId, ReqTradePlace request, RespTradePlace re TradeRules.AppendTrade(State, new TradeDealState { TradeId = tradeId, - ItemId = request.ItemId, + ItemId = taker.ItemId, BuyerPlayerId = buyerPlayerId, SellerPlayerId = sellerPlayerId, Quantity = deal.Quantity, @@ -117,19 +142,6 @@ public Task OnPlaceAsync(long playerId, ReqTradePlace request, RespTradePlace re State.Orders.Remove(deal.OrderId); } } - - if (remaining > 0) - { - order.Remaining = (int)remaining; - var ownSide = request.Side == TradeSide.Buy ? book.Buys : book.Sells; - ownSide.Add(order); - ownSide.Sort(request.Side == TradeSide.Buy ? TradeRules.CompareBuy : TradeRules.CompareSell); - State.Orders[order.OrderId] = order; - response.OrderId = order.OrderId; - } - - response.Remaining = (int)remaining; - return Task.CompletedTask; } ///