【发布时间】:2019-08-02 21:15:15
【问题描述】:
在会计系统中,资金可以在账户之间转移。
为了避免重复预订交易时出现僵局(账户之间的转账)从账户到账户的转账是基于id order:
@Transactional
override fun doubleBookPrepaid(eventId: Long, srcPurposefulAccountId: PurposefulAccountId, trgPurposefulAccountId: PurposefulAccountId, amount: Money): Pair<Money, Money>? =
if (srcPurposefulAccountId.accountId < trgPurposefulAccountId.accountId) { // Locking minimal account ID first, to prevent deadlocks.
val srcBooking = bookPrepaid(eventId, srcPurposefulAccountId, -amount)
val trgBooking = bookPrepaid(eventId, trgPurposefulAccountId, amount)
T(srcBooking, trgBooking)
}
else {
val trgBooking = bookPrepaid(eventId, trgPurposefulAccountId, amount)
val srcBooking = bookPrepaid(eventId, srcPurposefulAccountId, -amount)
T(srcBooking, trgBooking)
}
我怎样才能为 三边 交易实现相同的结果? 在这种交易中,一个账户会在同一笔交易中向两个账户转账:
data class PurposefulAccountTransfer(val trgPurposefulAccountId: PurposefulAccountId, val amount: Money)
@Transactional
fun threeLegBookPrepaid(eventId: Long, srcPurposefulAccountId: PurposefulAccountId, purposefulAccountTransfer: PurposefulAccountTransfer, secondPurposefulAccountTransfer: PurposefulAccountTransfer) {
val srcBooking = bookPrepaid(eventId, srcPurposefulAccountId, -(purposefulAccountTransfer.amount + secondPurposefulAccountTransfer.amount))
val trgFirstBooking = bookPrepaid(eventId, purposefulAccountTransfer.trgPurposefulAccountId, purposefulAccountTransfer.amount)
val trgSecondBooking = bookPrepaid(eventId, secondPurposefulAccountTransfer.trgPurposefulAccountId, secondPurposefulAccountTransfer.amount)
}
【问题讨论】:
标签: spring kotlin accounting