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;
}
///