优化账户余额处理机制
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 {