From: Tang Cheng Date: Sun, 16 Jun 2019 12:56:35 +0000 (+0800) Subject: refactor: 重构记账业务,优化并发逻辑 X-Git-Tag: 1.0.0^2~178 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=0fd20e4272341d92a1eee22fc2903fbbaab4aec5;p=epayment%2Ffood_payapi.git refactor: 重构记账业务,优化并发逻辑 --- diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java index ee438525..91c7bacc 100644 --- a/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java +++ b/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java @@ -1,7 +1,6 @@ package com.supwisdom.dlpay.api.dao; import com.supwisdom.dlpay.api.domain.TAccount; -import com.supwisdom.dlpay.api.repositories.TAccountRepository; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java b/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java index dc976435..b7dac869 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java @@ -2,16 +2,19 @@ package com.supwisdom.dlpay.api.domain; import com.supwisdom.dlpay.framework.util.MD5; import com.supwisdom.dlpay.framework.util.MoneyUtil; +import com.supwisdom.dlpay.system.common.DictPool; import org.hibernate.annotations.GenericGenerator; +import org.springframework.beans.factory.annotation.Autowired; import javax.persistence.*; +import java.io.Serializable; @Entity @Table(name = "TB_ACCOUNT", indexes = {@Index(name = "acc_userid_idx", columnList = "userid"), @Index(name = "acc_status_idx", columnList = "status"), @Index(name = "acc_subjno_uk", unique = true, columnList = "subjno,userid")}) -public class TAccount { +public class TAccount implements Serializable { @Id @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator") @@ -69,8 +72,12 @@ public class TAccount { @Column(name = "CLOSEDATE", length = 8) private String closedate; + @Version + @Column(name = "optlock", columnDefinition = "integer DEFAULT 0", nullable = false) + private Long version; + @OneToOne - @JoinColumn(name = "USERID",insertable = false,updatable = false) + @JoinColumn(name = "USERID", insertable = false, updatable = false) private TPerson person; public TAccount() { @@ -289,4 +296,12 @@ public class TAccount { public void setPerson(TPerson person) { this.person = person; } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } } diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java b/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java new file mode 100644 index 00000000..f31adb3e --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java @@ -0,0 +1,101 @@ +package com.supwisdom.dlpay.api.domain; + +import javax.persistence.*; +import java.io.Serializable; +import java.sql.Timestamp; + +@Entity +@Table(name = "tb_accountdaybal") +@IdClass(TAccountDayBalPk.class) +public class TAccountDayBal implements Serializable { + @Id + @Column(name = "accno", length = 32, nullable = false) + private String accno; //账号 + + @Id + @Column(name = "accdate", length = 8, nullable = false) + private String accdate; //记账日期 + + @Column(name = "amount", precision = 15, scale = 2) + private Double amount; + + @Column(name = "update_time", nullable = false) + private Timestamp updateTime; + + @Column(name = "lastRefno", nullable = false, length = 32) + private String lastRefno; + + @Column(name = "remark", length = 250) + private String remark; + + @Column(name = "checked") + private Boolean checked; + + @Version + @Column(name = "optlock", columnDefinition = "integer DEFAULT 0", nullable = false) + private Long version; + + public String getAccno() { + return accno; + } + + public void setAccno(String accno) { + this.accno = accno; + } + + public String getAccdate() { + return accdate; + } + + public void setAccdate(String accdate) { + this.accdate = accdate; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public Timestamp getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Timestamp updateTime) { + this.updateTime = updateTime; + } + + public String getLastRefno() { + return lastRefno; + } + + public void setLastRefno(String lastRefno) { + this.lastRefno = lastRefno; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Boolean getChecked() { + return checked; + } + + public void setChecked(Boolean checked) { + this.checked = checked; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } +} diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBalPk.java b/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBalPk.java new file mode 100644 index 00000000..d8114718 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBalPk.java @@ -0,0 +1,46 @@ +package com.supwisdom.dlpay.api.domain; + +import javax.persistence.Column; +import javax.persistence.Id; +import java.io.Serializable; +import java.util.Objects; + +public class TAccountDayBalPk implements Serializable { + @Id + @Column(name = "accno", length = 32, nullable = false) + private String accno; //账号 + + @Id + @Column(name = "accdate", length = 8, nullable = false) + private String accdate; //记账日期 + + public String getAccno() { + return accno; + } + + public void setAccno(String accno) { + this.accno = accno; + } + + public String getAccdate() { + return accdate; + } + + public void setAccdate(String accdate) { + this.accdate = accdate; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TAccountDayBalPk that = (TAccountDayBalPk) o; + return Objects.equals(accno, that.accno) && + Objects.equals(accdate, that.accdate); + } + + @Override + public int hashCode() { + return Objects.hash(accno, accdate); + } +} diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtlPK.java b/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtlPK.java index b8d7973b..5a0a48b5 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtlPK.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtlPK.java @@ -10,7 +10,7 @@ public class TDebitCreditDtlPK implements Serializable { private String refno; @Id - @Column(name = "SEQNO", nullable = false, precision = 1) + @Column(name = "SEQNO", nullable = false, precision = 2) private Integer seqno; public String getRefno() { diff --git a/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java b/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java new file mode 100644 index 00000000..5e976e8f --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java @@ -0,0 +1,11 @@ +package com.supwisdom.dlpay.api.repositories; + +import com.supwisdom.dlpay.api.domain.TPersondtl; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; + +public interface AccountService { + + @Transactional(isolation = Isolation.SERIALIZABLE) + void recalcAccountBalance(TPersondtl dtl, Double amount, boolean overdraft); +} diff --git a/src/main/java/com/supwisdom/dlpay/api/repositories/ShopaccService.java b/src/main/java/com/supwisdom/dlpay/api/repositories/ShopaccService.java new file mode 100644 index 00000000..cea6e084 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/api/repositories/ShopaccService.java @@ -0,0 +1,10 @@ +package com.supwisdom.dlpay.api.repositories; + +import com.supwisdom.dlpay.api.domain.TShopdtl; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; + +public interface ShopaccService { + @Transactional(isolation = Isolation.READ_COMMITTED) + void recalcShopBalance(TShopdtl dtl, Double amount, boolean overdraft); +} diff --git a/src/main/java/com/supwisdom/dlpay/api/repositories/TAccountRepository.java b/src/main/java/com/supwisdom/dlpay/api/repositories/TAccountRepository.java deleted file mode 100644 index 222391f5..00000000 --- a/src/main/java/com/supwisdom/dlpay/api/repositories/TAccountRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.supwisdom.dlpay.api.repositories; - -import com.supwisdom.dlpay.api.domain.TAccount; -import com.supwisdom.dlpay.api.domain.TPersondtl; - -public interface TAccountRepository { - int recalcAccountBalance(String accno, Double avaibal, Double amount, boolean overdraft); - - int recalcAccountBalance(TAccount account, Double amount, boolean overdraft); - - int recalcAccountBalance(TPersondtl dtl, Double amount, boolean overdraft); -} diff --git a/src/main/java/com/supwisdom/dlpay/api/repositories/TShopaccRepository.java b/src/main/java/com/supwisdom/dlpay/api/repositories/TShopaccRepository.java deleted file mode 100644 index 291bd1c0..00000000 --- a/src/main/java/com/supwisdom/dlpay/api/repositories/TShopaccRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.supwisdom.dlpay.api.repositories; - -import com.supwisdom.dlpay.api.domain.TShopdtl; - -public interface TShopaccRepository { - int recalcShopBalance(TShopdtl dtl, Double amount, boolean overdraft); -} diff --git a/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java b/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java index baaa274b..0ba82740 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java +++ b/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java @@ -1,5 +1,6 @@ package com.supwisdom.dlpay.framework.data; +import java.sql.Timestamp; import java.util.Date; public interface SystemDateTime { @@ -10,4 +11,6 @@ public interface SystemDateTime { String getHostdatetime(); Date getSysdate(); + + Timestamp getCurrentTimestamp(); } diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java index eee9e5aa..ff86a295 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java +++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java @@ -13,6 +13,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Date; @@ -61,6 +62,11 @@ public class SystemUtilServiceImpl implements SystemUtilService { public Date getSysdate() { return this.now; } + + @Override + public Timestamp getCurrentTimestamp() { + return new Timestamp(this.now.getTime()); + } } /** diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java index 336239e0..71df1391 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java +++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java @@ -12,7 +12,7 @@ public class TradeErrorCode { /** * 账户不存在 - * */ + */ public static final int ACCOUNT_NOT_EXISTS = 10001; /** @@ -41,78 +41,78 @@ public class TradeErrorCode { public static final int TRANSACTION_HAS_CANCELED = 10006; /** * 商户不存在 - * */ + */ public static final int SHOP_NOT_EXISTS = 10007; /** * 科目不存在 - * */ + */ public static final int SUBJECT_NOT_EXISTS = 10008; /** * 外部流水号重复 - * */ + */ public static final int OUTTRADENO_ALREADY_EXISTS = 10009; /** * 账户TAC校验异常 - * */ + */ public static final int ACCOUNT_TAC_ERROR = 10010; /** * 账户余额超上限 - * */ + */ public static final int OVERFLOW_BALANCE_ERROR = 10011; /** * 未指定明确的交易结束状态 - * */ + */ public static final int TRANSDTL_STATUS_ERROR = 10012; /** * 非初始化流水 - * */ + */ public static final int TRANSDTL_STATUS_NOT_INIT = 10013; /** * 账户交易繁忙 - * */ + */ public static final int ACCOUNT_TRADE_BUSY = 10014; /** * 非等待锁查询超时异常 - * */ + */ public static final int LOCK_READ_TIMEOUT = 10015; /** - * 卡已挂失 - * */ + * 卡已挂失 + */ public static final int ACCOUNT_IS_LOSS = 10016; /** - * 卡已锁定 - * */ + * 卡已锁定 + */ public static final int ACCOUNT_IS_LOCKED = 10017; /** * 费用类别未定义 - * */ + */ public static final int FEETYPE_NOT_EXISTS = 10018; /** * 费用类别不支持 - * */ + */ public static final int FEETYPE_NOT_NOSUPPORT = 10019; /** * 请求参数错误 - * */ + */ public static final int REQUEST_PARAM_ERROR = 20000; /** * 请求参数错误签名错误 - * */ + */ public static final int REQUEST_SIGN_ERROR = 20001; /** @@ -131,4 +131,6 @@ public class TradeErrorCode { public static final int BUSINESS_PAYTYPE_NOSUPPORT = 30003; //支付方式不支持 + public static final int UNHANLDED_EXCEPTION = 300004; // 未处理异常 + } diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt b/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt index f47651df..e3e2cb5a 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt @@ -23,7 +23,7 @@ class RestControllerAdvice { fun handleException(ex: Exception, request: HttpServletRequest): ResponseEntity { logger.error { "Request unhandler exception, url<${request.requestURI}>, ex<${ex.cause}>" } return ResponseEntity.ok().body(ResponseBodyBuilder.create() - .exception(TradeErrorCode.BUSINESS_DEAL_ERROR, ex.cause)) + .exception(TradeErrorCode.UNHANLDED_EXCEPTION, ex.cause)) } } 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 deleted file mode 100644 index e14f9473..00000000 --- a/src/main/kotlin/com/supwisdom/dlpay/api/repositories/repository_impl.kt +++ /dev/null @@ -1,74 +0,0 @@ -package com.supwisdom.dlpay.api.repositories - -import com.supwisdom.dlpay.api.domain.TAccount -import com.supwisdom.dlpay.api.domain.TPersondtl -import com.supwisdom.dlpay.api.domain.TShopdtl -import com.supwisdom.dlpay.exception.TransactionProcessException -import com.supwisdom.dlpay.framework.domain.TShopacc -import com.supwisdom.dlpay.framework.util.TradeErrorCode -import org.springframework.stereotype.Repository -import org.springframework.transaction.annotation.Transactional -import javax.persistence.EntityManager -import javax.persistence.PersistenceContext - -@Repository -@Transactional -class TAccountRepositoryImpl : TAccountRepository { - - @PersistenceContext - private lateinit var entityManager: EntityManager - - override fun recalcAccountBalance(accno: String, avaibal: Double, amount: Double, overdraft: Boolean): Int { - val account = entityManager.find(TAccount::class.java, accno) ?: return 0 - if (avaibal.compareTo(account.availbal!!) != 0) { - throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, - "账户余额已被更新") - } - - 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 { - return recalcAccountBalance(account.accno, account.availbal, amount, overdraft) - } - - override fun recalcAccountBalance(dtl: TPersondtl, amount: Double, overdraft: Boolean): Int { - return entityManager.find(TAccount::class.java, dtl.accountNo)?.let { - recalcAccountBalance(it, amount, overdraft).also { count -> - if (count == 1) { - dtl.befbal = it.availbal - } - } - } ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, - "交易流水<${dtl.refno}>未找到指定个人账户") - } -} - -@Repository -@Transactional -class ShopaccRepositoryImpl : TShopaccRepository { - - @PersistenceContext - private lateinit var entityManager: EntityManager - - override fun recalcShopBalance(dtl: TShopdtl, amount: Double, overdraft: Boolean): Int { - val shopacc = entityManager.find(TShopacc::class.java, dtl.shopaccno) - ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, - "交易流水<${dtl.refno}>商户账户不存在") - - 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/account_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt new file mode 100644 index 00000000..9622f619 --- /dev/null +++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt @@ -0,0 +1,93 @@ +package com.supwisdom.dlpay.api.service.impl + +import com.supwisdom.dlpay.api.domain.* +import com.supwisdom.dlpay.api.repositories.AccountService +import com.supwisdom.dlpay.api.repositories.ShopaccService +import com.supwisdom.dlpay.exception.TransactionProcessException +import com.supwisdom.dlpay.framework.domain.TShopacc +import com.supwisdom.dlpay.framework.service.SystemUtilService +import com.supwisdom.dlpay.framework.util.TradeErrorCode +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Repository +import javax.persistence.EntityManager +import javax.persistence.LockModeType +import javax.persistence.OptimisticLockException +import javax.persistence.PersistenceContext + +@Repository +class AccountServiceImpl : AccountService { + + @PersistenceContext + private lateinit var entityManager: EntityManager + + @Autowired + lateinit var systemUtilServcie: SystemUtilService + + private fun newAccounDayBal(dtl: TPersondtl, account: TAccount) = TAccountDayBal().apply { + accno = account.accno + accdate = dtl.accdate + amount = 0.0 + checked = false + } + + private fun doRecalcAccountBalance(dtl: TPersondtl, account: TAccount): TAccountDayBal { + val accountDayBal = entityManager.find(TAccountDayBal::class.java, + TAccountDayBalPk().also { + it.accno = account.accno + it.accdate = dtl.accdate + }, LockModeType.OPTIMISTIC) ?: newAccounDayBal(dtl, account) + + accountDayBal.also { + it.lastRefno = dtl.refno + it.amount += dtl.amount + it.updateTime = systemUtilServcie.sysdatetime.currentTimestamp + }.also { + entityManager.persist(it) + } + + return accountDayBal + } + + override fun recalcAccountBalance(dtl: TPersondtl, amount: Double, overdraft: Boolean) { + entityManager.find(TAccount::class.java, dtl.accountNo, LockModeType.OPTIMISTIC) + ?.let { account -> + if (!overdraft && account.availbal + dtl.amount < 0) { + throw TransactionProcessException(TradeErrorCode.SHORT_BALANCE_ERROR, "个人账户余额不足") + } + dtl.befbal = account.availbal + doRecalcAccountBalance(dtl, account) + account.availbal += dtl.amount + account.balance += dtl.amount + account.lasttransdate = dtl.accdate + try { + entityManager.persist(account) + } catch (ex: OptimisticLockException) { + throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, + "个人账户被被更新") + } + + } ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, + "交易流水<${dtl.refno}>未找到指定个人账户") + } +} + +@Repository +class ShopaccServiceImpl : ShopaccService { + + @PersistenceContext + private lateinit var entityManager: EntityManager + + override fun recalcShopBalance(dtl: TShopdtl, amount: Double, overdraft: Boolean) { + val shopacc = entityManager.find(TShopacc::class.java, dtl.shopaccno, LockModeType.OPTIMISTIC) + ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, + "交易流水<${dtl.refno}>商户账户不存在") + + shopacc.balance += amount + if (shopacc.balance < 0.0 && !overdraft) { + throw TransactionProcessException(TradeErrorCode.SHORT_BALANCE_ERROR, + "商户账户余额不足") + } + + entityManager.persist(shopacc) + } +} \ 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 d7e8895a..ab253c01 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 @@ -1,10 +1,11 @@ package com.supwisdom.dlpay.api.service.impl import com.supwisdom.dlpay.api.TransactionBuilder -import com.supwisdom.dlpay.api.dao.* +import com.supwisdom.dlpay.api.dao.PersondtlDao +import com.supwisdom.dlpay.api.dao.TransactionMainDao import com.supwisdom.dlpay.api.domain.* -import com.supwisdom.dlpay.api.repositories.ShopaccRepositoryImpl -import com.supwisdom.dlpay.api.repositories.TAccountRepositoryImpl +import com.supwisdom.dlpay.api.repositories.AccountService +import com.supwisdom.dlpay.api.repositories.ShopaccService import com.supwisdom.dlpay.api.service.SourceTypeService import com.supwisdom.dlpay.api.service.TransactionService import com.supwisdom.dlpay.exception.TransactionCheckException @@ -28,22 +29,22 @@ class TransactionServiceImpl : TransactionService { } @Autowired - lateinit var transactionMainDao: TransactionMainDao + private lateinit var transactionMainDao: TransactionMainDao @Autowired - lateinit var persondtlDao: PersondtlDao + private lateinit var persondtlDao: PersondtlDao @Autowired - lateinit var accountRepository: TAccountRepositoryImpl + private lateinit var accountService: AccountService @Autowired - lateinit var shopaccRepository: ShopaccRepositoryImpl + private lateinit var shopaccService: ShopaccService @Autowired - lateinit var systemUtilService: SystemUtilService + private lateinit var systemUtilService: SystemUtilService @Autowired - lateinit var sourceTypeService: SourceTypeService + private lateinit var sourceTypeService: SourceTypeService private fun preCheck(builder: TransactionBuilder) { builder.preCheck() @@ -369,10 +370,7 @@ class TransactionServiceImpl : TransactionService { PERSON_BALANCE_FLAG, "both") if (amount.compareTo(0.0) != 0) { transaction.personDtl?.let { - if (accountRepository.recalcAccountBalance(it, amount, overdraft) != 1) { - throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, - "个人账户交易冲突") - } + accountService.recalcAccountBalance(it, amount, overdraft) transaction.personDtl.accdate = transaction.accdate } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "个人流水<${transaction.refno}>不存在") @@ -387,10 +385,7 @@ class TransactionServiceImpl : TransactionService { SHOP_BALANCE_FLAG, "both") if (amount.compareTo(0.0) != 0) { transaction.shopDtl?.let { - if (shopaccRepository.recalcShopBalance(it, it.amount, overdraft) != 1) { - throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, - "商户账户交易冲突") - } + shopaccService.recalcShopBalance(it, it.amount, overdraft) } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "商户流水<${transaction.refno}>不存在") }