From f78adeb83dea385a33c049c9c74fe312e9a6dfcf Mon Sep 17 00:00:00 2001 From: Tang Cheng Date: Sat, 25 May 2019 22:15:21 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E8=AE=B0=E8=B4=A6=E6=A8=A1?= =?utf8?q?=E5=9D=97=EF=BC=8C=E8=AE=BE=E8=AE=A1=E6=B8=85=E7=AE=97=E6=97=A5?= =?utf8?q?=E6=9C=9F=E3=80=81=E7=BB=93=E7=AE=97=E6=97=A5=E6=9C=9F=E3=80=81?= =?utf8?q?=E8=AE=B0=E8=B4=A6=E6=97=A5=E6=9C=9F=E4=B8=89=E4=B8=AA=E6=9D=A1?= =?utf8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/api/domain/TDebitCreditDtl.java | 12 +- .../supwisdom/dlpay/api/domain/TShopdtl.java | 13 ++ .../dlpay/api/domain/TTransactionMain.java | 24 ++- .../api/controller/consume_api_controller.kt | 34 ++-- .../service/impl/transaction_service_impl.kt | 77 +++++++- .../dlpay/api/service/transaction_service.kt | 36 +++- .../dlpay/api/transaction_builder.kt | 180 ++++++++++++------ 7 files changed, 270 insertions(+), 106 deletions(-) diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtl.java index 85bac09f..7c288bdc 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtl.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtl.java @@ -15,8 +15,8 @@ public class TDebitCreditDtl { @Column(name = "SEQNO", nullable = false, precision = 2) private Integer seqno; - @Column(name = "accdate", nullable = false, length = 8) - private String accdate; + @Column(name = "settledate", nullable = false, length = 8) + private String settleDate; @Column(name = "DRSUBJNO", length = 10) private String drsubjno; //借方科目 @@ -101,11 +101,11 @@ public class TDebitCreditDtl { this.summary = summary; } - public String getAccdate() { - return accdate; + public String getSettleDate() { + return settleDate; } - public void setAccdate(String accdate) { - this.accdate = accdate; + public void setSettleDate(String settleDate) { + this.settleDate = settleDate; } } diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java index d65da130..95a7b0fd 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java @@ -1,5 +1,7 @@ package com.supwisdom.dlpay.api.domain; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; + import javax.persistence.*; @Entity @@ -45,6 +47,9 @@ public class TShopdtl { @Column(name = "TRANSDESC", length = 240) private String transdesc; //交易描述 + @Column(name = "reverseflag", length = 10) + private String reverseFlag; + @Column(name = "status", length = 20) private String status; @@ -184,4 +189,12 @@ public class TShopdtl { public void setRemark(String remark) { this.remark = remark; } + + public String getReverseFlag() { + return reverseFlag; + } + + public void setReverseFlag(String reverseFlag) { + this.reverseFlag = reverseFlag; + } } diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java index a4969cb3..fa3fc8d4 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java @@ -20,6 +20,12 @@ public class TTransactionMain { @Column(name = "accdate", nullable = false, length = 8) private String accdate; + @Column(name = "checkable") + private Boolean checkable; // 是否需要清算的交易 + + @Column(name = "checkdate", length = 8) + private String checkDate; + @Column(name = "person") private Boolean person = false; @@ -51,7 +57,7 @@ public class TTransactionMain { private Timestamp endTime; @Column(name = "reverse_flag", nullable = false, length = 10) - private String reverseFlag = "none"; + private String reverseFlag = "none"; // 冲正标识, none - 未冲正, reverse - 被撤销, cancel - 被冲正 @OneToOne(targetEntity = TPersondtl.class, fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "refno", referencedColumnName = "refno") @@ -206,6 +212,22 @@ public class TTransactionMain { this.opertype = opertype; } + public String getCheckDate() { + return checkDate; + } + + public void setCheckDate(String checkDate) { + this.checkDate = checkDate; + } + + public Boolean getCheckable() { + return checkable; + } + + public void setCheckable(Boolean checkable) { + this.checkable = checkable; + } + public Double sumAmountByAccno(String accno, String subjno, int balanceFlag, String debitOrCredit) { Double debitSum = 0.0; diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt index 461f6dd4..1b687897 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt @@ -99,7 +99,7 @@ class ConsumeController { builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(shop), amount, feetypeConfig.summary) .shop().also { - it.amount += amount + it.addAmount(amount) } } else -> { @@ -149,23 +149,18 @@ class ConsumeController { val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno) val builder = TransactionBuilder().apply { - transDate = param.transdate - transTime = param.transtime + setTransInfo(param.transdate, param.transtime, TradeCode.TRANSCODE_BALANCE_PAY, false) + setOutTransInfo(shopacc.shopaccno, param.billno) + operator(param.shopaccno, TradeDict.OPERTYPE_SHOP) paytype = TradeDict.PAYTYPE_BALANCE - transCode = TradeCode.TRANSCODE_BALANCE_PAY payinfo = "账户余额消费" - outId = shopacc.shopaccno - outtradeno = param.billno - operator(param.shopaccno, TradeDict.OPERTYPE_SHOP) - }.person(account).apply { description = "账户余额消费" - amount = param.amount / 100.0 + }.person(account).apply { + setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT) opposite = AccountProxy(shopacc) - tradeOut() }.and().shop(shopacc).apply { - amount = param.amount / 100.0 + setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN) opposite = AccountProxy(account) - tradeIn() }.and() param.feelist?.forEach { @@ -223,23 +218,18 @@ class ConsumeController { val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno) val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD) val transaction = TransactionBuilder().apply { - transCode = TradeCode.TRANSCODE_CITIZENCARD_PAY - transDate = param.transdate - transTime = param.transtime + setTransInfo(param.transdate, param.transtime, TradeCode.TRANSCODE_CITIZENCARD_PAY, true) + setOutTransInfo(shopacc.shopaccno, param.billno) + operator(param.shopaccno, TradeDict.OPERTYPE_SHOP) paytype = TradeDict.PAYTYPE_CITIZEN_CARD payinfo = "市民卡代扣消费" description = "市民卡代扣消费" - outId = shopacc.shopaccno - outtradeno = param.billno - operator(param.shopaccno, TradeDict.OPERTYPE_SHOP) }.person(account).apply { - amount = param.amount / 100.0 + setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT) opposite = AccountProxy(shopacc) - tradeOut() }.and().shop(shopacc).apply { - amount = param.amount / 100.0 + setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN) opposite = AccountProxy(account) - tradeIn() }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account), param.amount / 100.0, "市民卡代扣消费") .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), 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 19481168..a972d3fc 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 @@ -57,6 +57,7 @@ class TransactionServiceImpl : TransactionService { createTime = Timestamp(systemUtilService.sysdatetime.sysdate.time) operid = builder.operId opertype = builder.operType + reverseFlag = builder.tradeType } if (builder.hasPerson()) { @@ -70,7 +71,7 @@ class TransactionServiceImpl : TransactionService { transdate = builder.transDate transtime = builder.transTime befbal = builder.person().person.availbal - amount = if (builder.person().tradeFlag() == TradeDict.TRADE_FLAG_IN) { + amount = if (builder.person().tradeFlag == TradeDict.TRADE_FLAG_IN) { builder.person().amount } else { -builder.person().amount @@ -78,11 +79,11 @@ class TransactionServiceImpl : TransactionService { paytype = builder.person().paytype payinfo = builder.person().payinfo transcode = builder.transCode - tradeflag = builder.person().tradeFlag() + tradeflag = builder.person().tradeFlag transdesc = builder.person().description oppositeAccNo = builder.person().opposite.getAccountNo() oppositeAccName = builder.person().opposite.getAccountName() - reverseFlag = builder.reverseFlag + this.reverseFlag = TradeDict.REVERSE_FLAG_NONE remark = builder.person().remark this.status = status }.also { @@ -102,18 +103,19 @@ class TransactionServiceImpl : TransactionService { this.transDate = builder.transDate this.transTime = builder.transTime this.tradeCode = builder.transCode - amount = if (builder.shop().tradeFlag() == TradeDict.TRADE_FLAG_IN) { + amount = if (builder.shop().tradeFlag == TradeDict.TRADE_FLAG_IN) { builder.shop().amount } else { -builder.shop().amount } - this.tradeflag = builder.shop().tradeFlag() + this.tradeflag = builder.shop().tradeFlag this.shopaccno = builder.shop().shopacc.shopaccno this.shopname = builder.shop().shopacc.shopname this.transdesc = builder.shop().description this.oppositeAccNo = builder.shop().opposite.getAccountNo() this.oppositeAccName = builder.shop().opposite.getAccountName() this.remark = builder.shop().remark + this.reverseFlag = TradeDict.REVERSE_FLAG_NONE this.status = status }.also { // save shopdtl @@ -144,7 +146,6 @@ class TransactionServiceImpl : TransactionService { builder.getAllDetails().map { line -> TDebitCreditDtl().apply { this.refno = transaction.refno - this.accdate = transaction.accdate this.seqno = line.seqno this.draccno = line.debit.getAccountNo() this.drsubjno = line.debit.getSubjectNo() @@ -159,7 +160,7 @@ class TransactionServiceImpl : TransactionService { if (builder.hasPerson()) { - val dc = getDebitOrCredit(builder.person().tradeFlag()) + val dc = getDebitOrCredit(builder.person().tradeFlag) transaction.sumAmountByAccno(builder.person().person.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, PERSON_BALANCE_FLAG, dc).also { @@ -171,7 +172,7 @@ class TransactionServiceImpl : TransactionService { } if (builder.hasShop()) { - val dc = getDebitOrCredit(builder.shop().tradeFlag()) + val dc = getDebitOrCredit(builder.shop().tradeFlag) transaction.sumAmountByAccno(builder.shop().shopacc.shopaccno, Subject.SUBJNO_MACHANT_INCOME, SHOP_BALANCE_FLAG, dc).also { @@ -308,6 +309,46 @@ class TransactionServiceImpl : TransactionService { } transaction.status = TradeDict.DTL_STATUS_SUCCESS transaction.accdate = systemUtilService.accdate + transactionOnSuccess(transaction, remark, false) + + transaction.endTime = Timestamp(systemUtilService.sysdatetime.sysdate.time) + transactionMainDao.save(transaction) + return transaction + } + + override fun reverse(originRefno: String): TTransactionMain { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun reverseInit(originRefno: String): TTransactionMain { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun reverseConfirm(refno: String): TTransactionMain { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun reverseFail(refno: String): TTransactionMain { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun cancel(originRefno: String): TTransactionMain { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun cancelInit(originRefno: String): TTransactionMain { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun cancelConfirm(refno: String): TTransactionMain { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun cancelFail(refno: String): TTransactionMain { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + private fun transactionOnSuccess(transaction: TTransactionMain, remark: String, overdraft: Boolean) { if (transaction.person) { // update account balance val amount = transaction.sumAmountByAccno( @@ -315,7 +356,7 @@ class TransactionServiceImpl : TransactionService { PERSON_BALANCE_FLAG, "both") if (amount.compareTo(0.0) != 0) { transaction.personDtl?.let { - if (accountRepository.recalcAccountBalance(it, amount, false) != 1) { + if (accountRepository.recalcAccountBalance(it, amount, overdraft) != 1) { throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "个人账户交易冲突") } @@ -333,7 +374,7 @@ class TransactionServiceImpl : TransactionService { SHOP_BALANCE_FLAG, "both") if (amount.compareTo(0.0) != 0) { transaction.shopDtl?.let { - if (shopaccRepository.recalcShopBalance(it, it.amount, false) != 1) { + if (shopaccRepository.recalcShopBalance(it, it.amount, overdraft) != 1) { throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "商户账户交易冲突") } @@ -348,8 +389,24 @@ class TransactionServiceImpl : TransactionService { if (transaction.subject) { // update subject balance } + } + override fun repair(refno: String, remark: String): TTransactionMain { + val transaction = transactionMainDao.findByRefnoForUpdate(refno) + ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, + "补帐交易流水<$refno>不存在") + val checkStatus = setOf(TradeDict.DTL_STATUS_FAIL, TradeDict.DTL_STATUS_CANCEL, + TradeDict.DTL_STATUS_WIP) + + if (transaction.status !in checkStatus) { + throw TransactionCheckException(TradeErrorCode.TRANSDTL_STATUS_ERROR, + "补帐交易<$refno>状态错误,status<${transaction.status}>") + } + + transactionOnSuccess(transaction, remark, true) + transaction.checkDate = systemUtilService.accdate transaction.endTime = Timestamp(systemUtilService.sysdatetime.sysdate.time) + transactionMainDao.save(transaction) return transaction } 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 41137407..f0acef4d 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 @@ -1,7 +1,6 @@ package com.supwisdom.dlpay.api.service import com.supwisdom.dlpay.api.TransactionBuilder -import com.supwisdom.dlpay.api.domain.TAccount import com.supwisdom.dlpay.api.domain.TTransactionMain import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional @@ -27,8 +26,35 @@ interface TransactionService { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) fun success(refno: String, remark: String): TTransactionMain -} -interface PersonAccountService { - fun recalcBalance(account: TAccount, amount: Double) -} \ No newline at end of file + // 撤销接口冲正类接口 + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) + fun reverse(originRefno: String): TTransactionMain + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) + fun reverseInit(originRefno: String): TTransactionMain + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) + fun reverseConfirm(refno: String): TTransactionMain + + fun reverseFail(refno: String): TTransactionMain + + // 冲正类接口 + /** + * 冲正业务 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) + fun cancel(originRefno: String): TTransactionMain + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) + fun cancelInit(originRefno: String): TTransactionMain + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) + fun cancelConfirm(refno: String): TTransactionMain + + fun cancelFail(refno: String): TTransactionMain + + // 补帐接口 + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) + fun repair(refno: String, remark: String): TTransactionMain +} diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt index 5d379fe8..15a23d43 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt @@ -2,16 +2,14 @@ package com.supwisdom.dlpay.api import com.supwisdom.dlpay.api.domain.TAccount import com.supwisdom.dlpay.api.domain.TTransactionMain -import com.supwisdom.dlpay.api.service.AccountUtilServcie import com.supwisdom.dlpay.api.service.TransactionService import com.supwisdom.dlpay.exception.TransactionCheckException import com.supwisdom.dlpay.framework.domain.TShopacc import com.supwisdom.dlpay.framework.domain.TSubject -import com.supwisdom.dlpay.framework.util.Subject import com.supwisdom.dlpay.framework.util.TradeDict import com.supwisdom.dlpay.framework.util.TradeErrorCode -open class SubTransactionBuilder(val parent: TransactionBuilder) { +open class SubTransactionBuilder>(val parent: TransactionBuilder) { var paytype: String = "" get() { return if (field.isEmpty()) parent.paytype else field @@ -42,38 +40,42 @@ open class SubTransactionBuilder(val parent: TransactionBuilder) { return parent } - private var balanceInOut: String = "" + // 收支方向, in / out + var tradeFlag: String = "" + private set - fun tradeIn(): SubTransactionBuilder { - this.balanceInOut = TradeDict.TRADE_FLAG_IN + var amount: Double = 0.0 + private set + + /** + * amount : 交易金额, 正向交易金额必须 >= 0, 冲正交易金额必须 <= 0 + */ + fun setAmount(amount: Double, inOut: String): SubTransactionBuilder { + this.amount = amount + this.tradeFlag = inOut return this } - fun tradeOut(): SubTransactionBuilder { - this.balanceInOut = TradeDict.TRADE_FLAG_OUT + /** + * amount : 交易金额, 正向交易金额必须 >= 0, 冲正交易金额必须 <= 0 + */ + fun addAmount(amount: Double): SubTransactionBuilder { + this.amount += amount return this } - fun tradeFlag(): String { - return this.balanceInOut - } - - } class PersonTranactionBuilder(parent: TransactionBuilder, val person: TAccount) - : SubTransactionBuilder(parent) { - var amount: Double = 0.0 + : SubTransactionBuilder(parent) { } class ShopTransactionBuilder(parent: TransactionBuilder, val shopacc: TShopacc) - : SubTransactionBuilder(parent) { - var amount: Double = 0.0 + : SubTransactionBuilder(parent) { } class SubjectTransactionBuilder(parent: TransactionBuilder, val subject: TSubject) - : SubTransactionBuilder(parent) { - var amount: Double = 0.0 + : SubTransactionBuilder(parent) { } class AccountProxy(private val accountObj: T) { @@ -118,26 +120,59 @@ data class DebitCreditLine(val debit: AccountProxy<*>, val credit: AccountProxy< // 在 constructor 中加入 service 接口 class TransactionBuilder { + companion object { + private val VALID_REVERSEFLAG = setOf(TradeDict.REVERSE_FLAG_CANCEL, + TradeDict.REVERSE_FLAG_REVERSE, + TradeDict.REVERSE_FLAG_NONE) + + private val VALID_OPERTYPE = setOf(TradeDict.OPERTYPE_OPER, + TradeDict.OPERTYPE_SHOP, TradeDict.OPERTYPE_PERSON) + + private val VALID_TRADEFLAG = setOf(TradeDict.TRADE_FLAG_IN, + TradeDict.TRADE_FLAG_OUT) + } + private lateinit var personBuilder: PersonTranactionBuilder private lateinit var shopBuilder: ShopTransactionBuilder private lateinit var subjectBuilder: SubjectTransactionBuilder private val debitCreditLines = mutableListOf() + // 以下是交易主表属性 var transDate: String = "" + private set var transTime: String = "" + private set var transCode: Int = 0 //交易码,各明细流水统一 - var refno: String = "" - var paytype: String = "" - var payinfo: String = "" + private set + + // 是否需要清算的交易 + var checkable: Boolean = false + private set + + fun setTransInfo(date: String, time: String, code: Int, checkable: Boolean = false): TransactionBuilder { + this.transDate = date + this.transTime = time + this.transCode = code + this.checkable = checkable + return this + } + var outtradeno: String = "" //第三方流水号 + private set var outId: String = "" - var reverseFlag: String = "none" - var description: String = "" - var remark: String = "" + private set + + fun setOutTransInfo(id: String, tradeno: String): TransactionBuilder { + this.outId = id + this.outtradeno = tradeno + return this + } var operId: String = "" + private set var operType: String = "" + private set fun operator(id: String, type: String): TransactionBuilder { this.operId = id @@ -145,6 +180,26 @@ class TransactionBuilder { return this } + var tradeType: String = "none" + private set + + fun reverse(): TransactionBuilder { + this.tradeType = TradeDict.REVERSE_FLAG_REVERSE + return this + } + + fun cancel(): TransactionBuilder { + this.tradeType = TradeDict.REVERSE_FLAG_CANCEL + return this + } + + + // 以下属性可以在子表中不同 + var paytype: String = "" + var payinfo: String = "" + var description: String = "" + var remark: String = "" + fun person(): PersonTranactionBuilder { return this.personBuilder } @@ -210,6 +265,14 @@ class TransactionBuilder { return debitCreditLines.toList() } + private fun checkAmount(amount: Double): Boolean { + return if (tradeType == TradeDict.REVERSE_FLAG_NONE) { + amount >= 0.0 + } else { + amount <= 0.0 + } + } + fun preCheck() { if (outId.isNotEmpty() && outtradeno.isEmpty()) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, @@ -226,14 +289,27 @@ class TransactionBuilder { "交易码错误") } + if (tradeType !in VALID_REVERSEFLAG) { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "冲正标志错误") + } + if ((operId.isNotEmpty() || operType.isNotEmpty()) - && operType !in setOf(TradeDict.OPERTYPE_OPER, TradeDict.OPERTYPE_PERSON, TradeDict.OPERTYPE_SHOP)) { + && operType !in VALID_OPERTYPE) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "操作员类型错误") } if (hasPerson()) { person().also { + if (it.tradeFlag !in VALID_TRADEFLAG) { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "个人交易收支方向错误") + } + if (!checkAmount(it.amount)) { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "个人交易金额不正确") + } if (!it.hasOpposite()) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "个人交易对方账户未设置") @@ -242,51 +318,23 @@ class TransactionBuilder { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "个人交易信息未设置") } - when (it.tradeFlag()) { - TradeDict.TRADE_FLAG_IN -> { - throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "不支持的交易") - } - TradeDict.TRADE_FLAG_OUT -> { - if (reverseFlag != TradeDict.REVERSE_FLAG_NONE && it.amount > 0) { - throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "消费冲正交易,余额不能大于0") - } else if (reverseFlag == TradeDict.REVERSE_FLAG_NONE && it.amount < 0) { - throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "消费交易,余额不能小于0") - } - } - else -> { - throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "个人交易方向未设置") - } - } - } } if (hasShop()) { shop().also { + if (it.tradeFlag !in VALID_TRADEFLAG) { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "商户交易收支方向错误") + } + if (!checkAmount(it.amount)) { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "商户交易金额不正确") + } if (!it.hasOpposite()) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "商户交易对方账户未设置") } - when (it.tradeFlag()) { - TradeDict.TRADE_FLAG_IN -> { - if (it.amount < 0) { - throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "商户收入交易金额不能小于0") - } - } - TradeDict.TRADE_FLAG_OUT -> { - if (it.amount > 0) { - throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "商户支出交易金额不能小于0") - } - } - else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "商户交易方向未设置") - } } } } @@ -298,4 +346,12 @@ class TransactionBuilder { fun wip(transactionService: TransactionService): TTransactionMain { return transactionService.wip(this) } + + fun cancel(transactionService: TransactionService, originRefno: String): TTransactionMain { + TODO("not implement") + } + + fun reverse(transactionService: TransactionService, originRefno: String, amount: Double): TTransactionMain { + TODO("not implement") + } } -- 2.17.1