diff --git a/backend/services/trading-service/src/application/services/order.service.ts b/backend/services/trading-service/src/application/services/order.service.ts index debffd1b..4fac6d9b 100644 --- a/backend/services/trading-service/src/application/services/order.service.ts +++ b/backend/services/trading-service/src/application/services/order.service.ts @@ -254,15 +254,22 @@ export class OrderService { }, }); - // 4. 更新买方账户(扣除冻结现金) - // 做市商吃单时:积分股不进做市商账户,只进流通池(事务外处理) - // 普通用户买入时:积分股直接进入买方账户 + // 4. 更新买方账户 + // 做市商吃单时: + // - 支付 sellerGrossAmount(含销毁倍数的交易总额),不是仅原始数量×价格 + // - 积分股不进做市商账户,只进流通池 + // 普通用户买入时: + // - 支付 buyerPayAmount(原始数量×价格) + // - 积分股直接进入买方账户 const buyerAccountRecord = await tx.tradingAccount.findUnique({ where: { accountSequence: match.buyOrder.accountSequence }, }); if (buyerAccountRecord) { + // 做市商实际支付 = 交易总额(含销毁倍数);普通用户支付 = 原始数量×价格 + const actualBuyerCost = isBuyerMarketMaker ? sellerGrossAmount : buyerPayAmount; + // frozenCash 释放的是下单时冻结的原始金额 const newFrozenCash = Number(buyerAccountRecord.frozenCash) - buyerPayAmount.value.toNumber(); - const newCashBalance = Number(buyerAccountRecord.cashBalance) - buyerPayAmount.value.toNumber(); + const newCashBalance = Number(buyerAccountRecord.cashBalance) - actualBuyerCost.value.toNumber(); const newShareBalance = isBuyerMarketMaker ? Number(buyerAccountRecord.shareBalance) : Number(buyerAccountRecord.shareBalance) + tradeQuantity.value.toNumber(); @@ -279,21 +286,37 @@ export class OrderService { }); // 记录买方交易流水 - await tx.tradingTransaction.create({ - data: { - accountSequence: match.buyOrder.accountSequence, - type: 'BUY', - assetType: 'SHARE', - amount: tradeQuantity.value, - balanceBefore: buyerAccountRecord.shareBalance, - balanceAfter: newShareBalance, - referenceId: match.trade.tradeNo, - referenceType: 'TRADE', - description: isBuyerMarketMaker - ? '做市商吃单(积分股→流通池)' - : '买入成交', - }, - }); + if (isBuyerMarketMaker) { + // 做市商:记录现金支出(交易总额) + await tx.tradingTransaction.create({ + data: { + accountSequence: match.buyOrder.accountSequence, + type: 'BUY', + assetType: 'CASH', + amount: actualBuyerCost.value, + balanceBefore: buyerAccountRecord.cashBalance, + balanceAfter: newCashBalance, + referenceId: match.trade.tradeNo, + referenceType: 'TRADE', + description: `做市商吃单(积分股→流通池), 交易总额${sellerGrossAmount.toFixed(4)}`, + }, + }); + } else { + // 普通用户:记录积分股收入 + await tx.tradingTransaction.create({ + data: { + accountSequence: match.buyOrder.accountSequence, + type: 'BUY', + assetType: 'SHARE', + amount: tradeQuantity.value, + balanceBefore: buyerAccountRecord.shareBalance, + balanceAfter: newShareBalance, + referenceId: match.trade.tradeNo, + referenceType: 'TRADE', + description: '买入成交', + }, + }); + } } // 5. 更新卖方账户(扣除冻结积分股,增加现金)