From: Tang Cheng Date: Wed, 10 Apr 2019 08:26:55 +0000 (+0800) Subject: 重构代码 X-Git-Tag: 1.0.0^2~316 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=650eace4779bed71d0eb2b77b0d6214d154a7fff;p=epayment%2Ffood_payapi.git 重构代码 --- diff --git a/src/main/java/com/supwisdom/dlpay/consume/PayDtlBuilder.java b/src/main/java/com/supwisdom/dlpay/consume/PayDtlBuilder.java deleted file mode 100644 index 8c0498ac..00000000 --- a/src/main/java/com/supwisdom/dlpay/consume/PayDtlBuilder.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.supwisdom.dlpay.consume; - -import com.supwisdom.dlpay.consume.domain.TAccount; -import com.supwisdom.dlpay.consume.domain.TPerson; -import com.supwisdom.dlpay.framework.service.PersonPayService; -import com.supwisdom.dlpay.framework.util.TradeDict; - -import java.util.ArrayList; -import java.util.List; - -public class PayDtlBuilder { - public static class PayDetail { - private String accNo; - private String accName; - private Double amount; - private String direction; - private String summary; - } - - private TPerson person; - private TAccount account; - private String direction; - - private Double payAmount; - - private String summary; - - private List detail; - - public static PayDtlBuilder newBuilder() { - return new PayDtlBuilder(); - } - - private PayDtlBuilder() { - this.detail = new ArrayList<>(); - } - - public PayDtlBuilder person(TPerson per, TAccount acc, String direction) { - this.person = per; - this.account = acc; - this.direction = direction; - return this; - } - - public PayDtlBuilder setSummary(String s) { - this.summary = s; - return this; - } - - public PayDtlBuilder setTransDatetime(String transDate ,String transTime) { - - return this; - } - - public Boolean done(PersonPayService service) { - if (this.detail.size() == 0) { - return false; - } - this.payAmount = 0.0; - - for (PayDetail d : detail) { - this.payAmount += d.amount; - } - if (this.payAmount > this.account.getBalance()) { - return false; - } - service.process(this); - return true; - } - - - public PayDtlBuilder addSubDtl(String accNo, Double amount, String summary) { - PayDetail dtl = new PayDetail(); - dtl.accNo = accNo; - dtl.accName = ""; - dtl.amount = amount; - if (this.direction.equals(TradeDict.TRANS_DIRECTION_CREDIT)) { - dtl.direction = TradeDict.TRANS_DIRECTION_DEBIT; - } else { - dtl.direction = TradeDict.TRANS_DIRECTION_CREDIT; - } - dtl.summary = summary; - this.detail.add(dtl); - return this; - } -} diff --git a/src/main/java/com/supwisdom/dlpay/consume/dao/AccountDao.java b/src/main/java/com/supwisdom/dlpay/consume/dao/AccountDao.java new file mode 100644 index 00000000..6efee29a --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/consume/dao/AccountDao.java @@ -0,0 +1,15 @@ +package com.supwisdom.dlpay.consume.dao; + +import com.supwisdom.dlpay.consume.domain.TAccount; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Lock; +import org.springframework.data.jpa.repository.Query; + +import javax.persistence.LockModeType; + +public interface AccountDao extends JpaRepository { + + @Lock(LockModeType.PESSIMISTIC_WRITE) + @Query("select a from taccount a where a.accno = ?1") + TAccount getByAccnoForUpdate(String accno); +} diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckError.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckError.java new file mode 100644 index 00000000..e834318b --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckError.java @@ -0,0 +1,7 @@ +package com.supwisdom.dlpay.exception; + +public class TransactionCheckError extends TransactionError { + public TransactionCheckError(int code, String message) { + super(code, String.format("C - %d, %s", code, message)); + } +} diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionDataError.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionDataError.java deleted file mode 100644 index 747f6137..00000000 --- a/src/main/java/com/supwisdom/dlpay/exception/TransactionDataError.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.supwisdom.dlpay.exception; - -public class TransactionDataError extends Error { - public TransactionDataError(int errCode, String message) { - super(String.format("E-%d : %s", errCode, message)); - } -} diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionError.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionError.java new file mode 100644 index 00000000..fb247c57 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/exception/TransactionError.java @@ -0,0 +1,14 @@ +package com.supwisdom.dlpay.exception; + +public class TransactionError extends Error { + private int errCode; + + public TransactionError(int code, String message) { + super(message); + errCode = code; + } + + public int code() { + return this.errCode; + } +} diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessError.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessError.java new file mode 100644 index 00000000..44b9d808 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessError.java @@ -0,0 +1,7 @@ +package com.supwisdom.dlpay.exception; + +public class TransactionProcessError extends TransactionError { + public TransactionProcessError(int errCode, String message) { + super(errCode, String.format("E-%d : %s", errCode, message)); + } +} diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/PersonPayService.java b/src/main/java/com/supwisdom/dlpay/framework/service/PersonPayService.java index 5e7ace62..3174c2bc 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/service/PersonPayService.java +++ b/src/main/java/com/supwisdom/dlpay/framework/service/PersonPayService.java @@ -1,6 +1,5 @@ package com.supwisdom.dlpay.framework.service; -import com.supwisdom.dlpay.consume.PayDtlBuilder; import com.supwisdom.dlpay.consume.domain.TPaydtl; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeSummary.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeSummary.java new file mode 100644 index 00000000..c0053f70 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeSummary.java @@ -0,0 +1,6 @@ +package com.supwisdom.dlpay.framework.util; + +public class TradeSummary { + public static final String POS_PAY = "刷卡消费"; + public static final String WX_PAYCODE = "微信付款码消费"; +} diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt index 517a6d6b..b5c73a4c 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt @@ -4,31 +4,64 @@ import com.supwisdom.dlpay.consume.domain.TAccount import com.supwisdom.dlpay.consume.domain.TPaydtl import com.supwisdom.dlpay.consume.domain.TPerson import com.supwisdom.dlpay.consume.service.PersonBalancePayService +import com.supwisdom.dlpay.exception.TransactionCheckError +import com.supwisdom.dlpay.exception.TransactionProcessError +import com.supwisdom.dlpay.framework.util.TradeErrorCode -class PersonBalancePayBuilder private constructor() { +class PersonTransBuilder private constructor() { companion object { - fun newBuilder() = PersonBalancePayBuilder() + fun newBuilder() = PersonTransBuilder() } + inner class TransDetail(val accNo: String, val amount: Double, + val summary: String, val rowno: Int) + lateinit var person: TPerson lateinit var account: TAccount var transDate = "" var transTime = "" var description = "" - val details = mutableListOf() + var amount: Double = 0.0 + val details = mutableListOf() + /** + * 是否允许透支 + */ + var overdraft = false fun setUserAndAcc(per: TPerson, acc: TAccount) { this.person = per this.account = acc } - private fun prepareData() { + fun enableOverdraft(b: Boolean = false): PersonTransBuilder { + this.overdraft = b + return this + } + fun setTransDatetime(date: String, time: String): PersonTransBuilder { + this.transDate = date + this.transTime = time + return this + } + + private fun prepareData() { + amount = 0.0 + amount = this.details.sumByDouble { it.amount } } private fun preCheckAccount() { + // 判断个人账户 + if (this.account.subjno == "2001") { + if(amount > this.account.balance) { + throw TransactionCheckError(TradeErrorCode.SHORT_BALANCE_ERROR, "个人账户余额不足") + } + } + } + fun addDetail(accNo: String, amount: Double, summary: String): PersonTransBuilder { + this.details.add(TransDetail(accNo, amount, summary, this.details.size + 1)) + return this } /** diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt index 217ed471..eaec2293 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt @@ -1,45 +1,61 @@ package com.supwisdom.dlpay.consume.service.impl -import com.supwisdom.dlpay.consume.PersonBalancePayBuilder +import com.supwisdom.dlpay.consume.PersonTransBuilder +import com.supwisdom.dlpay.consume.dao.AccountDao +import com.supwisdom.dlpay.consume.domain.TAccount import com.supwisdom.dlpay.consume.domain.TPaydtl import com.supwisdom.dlpay.consume.service.PersonBalancePayService -import com.supwisdom.dlpay.exception.TransactionDataError +import com.supwisdom.dlpay.exception.TransactionProcessError import com.supwisdom.dlpay.framework.dao.PaydtlDao import com.supwisdom.dlpay.framework.util.TradeErrorCode import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service +import javax.persistence.EntityManager +import javax.persistence.PersistenceContext @Service class PersonBalancePayServiceImpl : PersonBalancePayService { @Autowired lateinit var paydtlDao: PaydtlDao - override fun init(builder: PersonBalancePayBuilder): TPaydtl { + @Autowired + lateinit var accountDao: AccountDao + + @PersistenceContext + lateinit var em : EntityManager + + private fun lockAccount(builder: PersonTransBuilder): TAccount { + return accountDao.getByAccnoForUpdate(builder.account.accno) + } + + override fun process(builder: PersonTransBuilder): TPaydtl { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun wip(paydtl: TPaydtl, builder: PersonBalancePayBuilder): TPaydtl { + override fun init(builder: PersonTransBuilder): TPaydtl { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun wip(refno: String, builder: PersonBalancePayBuilder): TPaydtl { + override fun wip(paydtl: TPaydtl, builder: PersonTransBuilder): TPaydtl { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun finish(paydtl: TPaydtl, status: String, builder: PersonBalancePayBuilder): TPaydtl { + override fun wip(refno: String, builder: PersonTransBuilder): TPaydtl { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun finish(refno: String, status: String, builder: PersonBalancePayBuilder): TPaydtl { + override fun finish(paydtl: TPaydtl, status: String, builder: PersonTransBuilder): TPaydtl { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun finish(refno: String, status: String, builder: PersonTransBuilder): TPaydtl { paydtlDao.findById(refno).let { if (it.isPresent) { return finish(it.get(), status, builder) } - throw TransactionDataError(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在") + throw TransactionProcessError(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在") } } - override fun process(builder: PersonBalancePayBuilder): TPaydtl { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } + } \ No newline at end of file diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt index 2d559ea2..8d631aaf 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt @@ -1,6 +1,6 @@ package com.supwisdom.dlpay.consume.service -import com.supwisdom.dlpay.consume.PersonBalancePayBuilder +import com.supwisdom.dlpay.consume.PersonTransBuilder import com.supwisdom.dlpay.consume.domain.TPaydtl interface PersonBalancePayService { @@ -8,24 +8,24 @@ interface PersonBalancePayService { /** * 一步完成交易 */ - fun process(builder: PersonBalancePayBuilder): TPaydtl + fun process(builder: PersonTransBuilder): TPaydtl /** * 两步交易,交易初始化方法,检查交易参数,记录交易流水 */ - fun init(builder: PersonBalancePayBuilder): TPaydtl + fun init(builder: PersonTransBuilder): TPaydtl /** * 两步交易,交易过程中判断交易状态,并更新交易状态为 wip */ - fun wip(paydtl: TPaydtl, builder: PersonBalancePayBuilder): TPaydtl + fun wip(paydtl: TPaydtl, builder: PersonTransBuilder): TPaydtl - fun wip(refno: String, builder: PersonBalancePayBuilder): TPaydtl + fun wip(refno: String, builder: PersonTransBuilder): TPaydtl /** * 两步交易,完成交易过程,包括更新交易状态(成功、失败),更新借贷双方余额 */ - fun finish(paydtl: TPaydtl, status: String, builder: PersonBalancePayBuilder): TPaydtl + fun finish(paydtl: TPaydtl, status: String, builder: PersonTransBuilder): TPaydtl - fun finish(refno: String, status: String, builder: PersonBalancePayBuilder): TPaydtl + fun finish(refno: String, status: String, builder: PersonTransBuilder): TPaydtl } \ No newline at end of file