优化账户余额处理机制
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/repositories/repository_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/repositories/repository_impl.kt
index 21d0324..e14f947 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/repositories/repository_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/repositories/repository_impl.kt
@@ -25,17 +25,13 @@
"账户余额已被更新")
}
- //1. 从 redis 读取账户余额
- //2. 没有记录时,读取数据库余额并存入 redis ,如果返回已存在,读取redis 余额
- //3. 扣除 redis 中余额
- val query = entityManager.createQuery("update TAccount a set a.availbal=a.availbal+?1, a.balance=a.balance+?1 " +
- "where a.accno=?2 and a.availbal=?3")
- ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "更新个人账户余额错误")
-
- query.setParameter(1, amount)
- .setParameter(2, accno)
- .setParameter(3, avaibal)
- return query.executeUpdate()
+ return entityManager.createQuery("update TAccount a set a.availbal=a.availbal+?1, a.balance=a.balance+?1 " +
+ "where a.accno=?2 and a.availbal=?3")?.run {
+ setParameter(1, amount)
+ setParameter(2, accno)
+ setParameter(3, avaibal)
+ executeUpdate()
+ } ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "更新个人账户余额错误")
}
override fun recalcAccountBalance(account: TAccount, amount: Double, overdraft: Boolean): Int {
@@ -44,7 +40,11 @@
override fun recalcAccountBalance(dtl: TPersondtl, amount: Double, overdraft: Boolean): Int {
return entityManager.find(TAccount::class.java, dtl.accountNo)?.let {
- recalcAccountBalance(it, amount, overdraft)
+ recalcAccountBalance(it, amount, overdraft).also { count ->
+ if (count == 1) {
+ dtl.befbal = it.availbal
+ }
+ }
} ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
"交易流水<${dtl.refno}>未找到指定个人账户")
}
@@ -62,11 +62,13 @@
?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS,
"交易流水<${dtl.refno}>商户账户不存在")
- val query = entityManager.createQuery("update TShopacc c set c.balance=c.balance+?1" +
- " where c.shopaccno=?2 and c.balance=?3")
- query.setParameter(1, amount)
- .setParameter(2, dtl.shopaccno)
- .setParameter(3, shopacc.balance)
- return query.executeUpdate()
+ return entityManager.createQuery("update TShopacc c set c.balance=c.balance+?1" +
+ " where c.shopaccno=?2 and c.balance=?3")?.run {
+ setParameter(1, amount)
+ setParameter(2, dtl.shopaccno)
+ setParameter(3, shopacc.balance)
+ executeUpdate()
+ } ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+ "交易流水<${dtl.refno}>未找到指定商户账户")
}
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index a077797..f581708 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -338,6 +338,15 @@
}
override fun fail(refno: String): TTransactionMain {
+ return fail(refno, "")
+ }
+
+
+ override fun success(refno: String): TTransactionMain {
+ return success(refno, "")
+ }
+
+ override fun fail(refno: String, remark: String): TTransactionMain {
val transaction = transactionMainDao.findByRefnoForUpdate(refno)
?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误")
@@ -347,13 +356,18 @@
}
updateRecordStatus(transaction, TradeDict.DTL_STATUS_FAIL)
+ if (transaction.person) {
+ transaction.personDtl.remark = remark
+ }
+ if (transaction.shop) {
+ transaction.shopDtl.remark = remark
+ }
transaction.endTime = Timestamp(systemUtilService.sysdatetime.sysdate.time)
transactionMainDao.save(transaction)
return transaction
}
-
- override fun success(refno: String): TTransactionMain {
+ override fun success(refno: String, remark: String): TTransactionMain {
val transaction = transactionMainDao.findByRefnoForUpdate(refno)
?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误")
@@ -379,6 +393,7 @@
"个人流水<${transaction.refno}>不存在")
}
transaction.personDtl.status = TradeDict.DTL_STATUS_SUCCESS
+ transaction.personDtl.remark = remark
}
if (transaction.shop) {
// update shop balance
@@ -396,6 +411,7 @@
}
transaction.shopDtl.status = TradeDict.DTL_STATUS_SUCCESS
transaction.shopDtl.accdate = transaction.accdate
+ transaction.shopDtl.remark = remark
}
if (transaction.subject) {
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
index e8cdd79..4113740 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -20,7 +20,13 @@
fun fail(refno: String): TTransactionMain
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+ fun fail(refno: String, remark: String): TTransactionMain
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
fun success(refno: String): TTransactionMain
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+ fun success(refno: String, remark: String): TTransactionMain
}
interface PersonAccountService {