From b2b6a8994abea24f51a18b0edaf6b7b31679aa4e Mon Sep 17 00:00:00 2001 From: Tang Cheng Date: Mon, 15 Apr 2019 14:09:57 +0800 Subject: [PATCH] =?utf8?q?=E4=B8=B4=E6=97=B6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/framework/dao/ShopaccDao.java | 6 + .../dlpay/framework/dao/TranstypeDao.java | 8 ++ .../dlpay/framework/util/TranstypeCode.java | 6 + .../dlpay/consume/comsume_builder.kt | 106 ++++++++++++------ .../consume/controller/consume_service.kt | 4 +- .../consume/service/impl/pay_service_impl.kt | 19 ++-- .../dlpay/framework/framework_util.kt | 4 + 7 files changed, 108 insertions(+), 45 deletions(-) create mode 100644 src/main/java/com/supwisdom/dlpay/framework/dao/TranstypeDao.java create mode 100644 src/main/java/com/supwisdom/dlpay/framework/util/TranstypeCode.java diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java index 89cf5927..1b351b2b 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java +++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java @@ -4,9 +4,11 @@ import com.supwisdom.dlpay.framework.data.ExistBean; import com.supwisdom.dlpay.framework.domain.TShopacc; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.QueryHints; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import javax.persistence.QueryHint; import java.util.List; @Repository @@ -25,4 +27,8 @@ public interface ShopaccDao extends JpaRepository { List getNewAddShopacc(@Param("settday") String settday); TShopacc findByShopid(Integer shopid); + + @Query(value = "select s from TShopacc s where s.shopid = ?1") + @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")}) + TShopacc getShopAccForUpdate(Integer shopid); } diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/TranstypeDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/TranstypeDao.java new file mode 100644 index 00000000..89d1da49 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/framework/dao/TranstypeDao.java @@ -0,0 +1,8 @@ +package com.supwisdom.dlpay.framework.dao; + +import com.supwisdom.dlpay.framework.domain.TTranstype; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TranstypeDao extends JpaRepository { + +} diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TranstypeCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TranstypeCode.java new file mode 100644 index 00000000..83b16e85 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/framework/util/TranstypeCode.java @@ -0,0 +1,6 @@ +package com.supwisdom.dlpay.framework.util; + +public class TranstypeCode { + + public static final int TT_CONSUUME_MANAGE_FEE = 301; +} 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 a0467534..ec7222f1 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt @@ -1,11 +1,13 @@ package com.supwisdom.dlpay.consume +import com.fasterxml.jackson.module.kotlin.jacksonTypeRef import com.supwisdom.dlpay.consume.domain.TAccount import com.supwisdom.dlpay.consume.domain.TPerson import com.supwisdom.dlpay.consume.domain.TUserdtl import com.supwisdom.dlpay.consume.service.AccountUtilServcie import com.supwisdom.dlpay.consume.service.PersonBalancePayService import com.supwisdom.dlpay.exception.TransactionCheckException +import com.supwisdom.dlpay.framework.domain.TShop import com.supwisdom.dlpay.framework.domain.TShopacc import com.supwisdom.dlpay.framework.domain.TSubject import com.supwisdom.dlpay.framework.domain.TTranstype @@ -19,11 +21,11 @@ class AccountHolder private constructor(val accountId: String, val idType: In const val IDTYPE_TRANSTYPE = 4 fun person(userid: String): AccountHolder { - return AccountHolder(userid, IDTYPE_PERSON) + return AccountHolder(userid, IDTYPE_PERSON) } fun shop(shopid: String): AccountHolder { - return AccountHolder(shopid, IDTYPE_SHOP) + return AccountHolder(shopid, IDTYPE_SHOP) } fun subject(subjNo: String): AccountHolder { @@ -37,6 +39,15 @@ class AccountHolder private constructor(val accountId: String, val idType: In internal lateinit var builder: PersonTransBuilder + internal val childrenHolder = mutableListOf>() + + + fun with(holder: AccountHolder): AccountHolder { + holder.builder = this.builder + childrenHolder.add(holder) + return this + } + @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY") fun get(): T { return when (idType) { @@ -48,8 +59,15 @@ class AccountHolder private constructor(val accountId: String, val idType: In } as T } - fun withLock(nowait: Boolean): T { - TODO("not implement") + @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY") + fun withLock(nowait: Boolean): T { + return when (idType) { + IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdate(accountId, true) + IDTYPE_SHOP -> builder.accountUtil.readShopAccForUpdate(accountId.toInt(), true) + IDTYPE_SUBJECT -> builder.accountUtil.readSubjectForUpdate(accountId, true) + IDTYPE_TRANSTYPE -> builder.accountUtil.readTranstype(accountId.toInt()) + else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>") + } as T } } @@ -200,6 +218,22 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { } } + @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY") + fun getAccountAndSubjNo(holder: AccountHolder): Pair { + return when (holder.idType) { + AccountHolder.IDTYPE_PERSON -> holder.get().let { + it.accno to it.subjno + } + AccountHolder.IDTYPE_SHOP -> holder.get().let { + it.shopaccno to it.subjno + } + AccountHolder.IDTYPE_SUBJECT -> holder.get().let { + it.subjno to it.subjno + } + else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "不支持的账户类型") + } + } + fun addDetail(debit: AccountHolder, credit: AccountHolder, amount: Double, summary: String): PersonTransBuilder { debit.builder = this @@ -207,42 +241,48 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { var debitAccNo = "" var debitSubjNo = "" - when (debit.idType) { - AccountHolder.IDTYPE_PERSON -> debit.get().also { - debitAccNo = it.accno - debitSubjNo = it.subjno - } - AccountHolder.IDTYPE_SHOP -> debit.get().also { - debitAccNo = it.shopaccno - debitSubjNo = it.subjno - } - AccountHolder.IDTYPE_SUBJECT -> debit.get().also { - debitAccNo = it.subjno - debitSubjNo = it.subjno - } - AccountHolder.IDTYPE_TRANSTYPE -> TODO("not implements") + getAccountAndSubjNo(debit).apply { + debitAccNo = first + debitSubjNo = second + } + var creditAccNo = "" + var creditSubjNo = "" + getAccountAndSubjNo(credit).apply { + creditAccNo = first + creditSubjNo = second + } + this.details.add(TransDetail(debitAccNo, debitSubjNo, creditAccNo, creditSubjNo, + amount, summary, this.details.size + 1)) + return this + } + + fun addDetail(accountHolder: AccountHolder, + amount: Double, summary: String): PersonTransBuilder { + accountHolder.builder = this + val transtype = accountHolder.get() + + var debitAccNo = "" + var debitSubjNo = "" + + if (transtype.drsubjno == "200") { + } var creditAccNo = "" var creditSubjNo = "" - when (credit.idType) { - AccountHolder.IDTYPE_PERSON -> credit.get().also { - creditAccNo = it.accno - creditSubjNo = it.subjno + if (transtype.crsubjno == "220201") { + accountHolder.childrenHolder.firstOrNull { + (it.get() as TAccount).subjno == transtype.crsubjno + }?.let { + creditAccNo = (it.get() as TAccount).accno + creditSubjNo = (it.get() as TAccount).subjno } - AccountHolder.IDTYPE_SHOP -> credit.get().also { - creditAccNo = it.shopaccno - creditSubjNo = it.subjno - } - AccountHolder.IDTYPE_SUBJECT -> credit.get().also { - creditAccNo = it.subjno - creditSubjNo = it.subjno - } - AccountHolder.IDTYPE_TRANSTYPE -> TODO("not implements") + } else if (transtype.crsubjno == "2002") { + } else { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "transtype<${accountHolder.accountId}> 不支持") } - this.details.add(TransDetail(debitAccNo, debitSubjNo, creditAccNo, creditSubjNo, - amount, summary, this.details.size + 1)) return this } diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt index de02e7b8..1d3b3122 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt @@ -86,8 +86,8 @@ class ConsumeController { it.addDetail(AccountHolder.subject(Subject.SUBJ_PAY_YKT), AccountHolder.shop(shopid), amount / 100.0, "一卡通支付") - .addDetail(AccountHolder.subject(Subject.SUBJ_PAY_YKT), - AccountHolder.subject(Subject.SUBJ_MACHANT_INCOME), + .addDetail(AccountHolder.transType(TranstypeCode.TT_CONSUUME_MANAGE_FEE) + .with(AccountHolder.shop(shopid)), manageFee / 100.0, "收搭伙费") } TradeDict.FEETYPE_CONSUME_DISCOUNT -> { 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 c85139d7..c58e41c7 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 @@ -12,6 +12,7 @@ import com.supwisdom.dlpay.consume.service.PersonBalancePayService import com.supwisdom.dlpay.exception.TransactionProcessException import com.supwisdom.dlpay.framework.dao.ShopaccDao import com.supwisdom.dlpay.framework.dao.SubjectDao +import com.supwisdom.dlpay.framework.dao.TranstypeDao import com.supwisdom.dlpay.framework.domain.TShopacc import com.supwisdom.dlpay.framework.domain.TSubject import com.supwisdom.dlpay.framework.domain.TTranstype @@ -37,10 +38,12 @@ class AccountUtilServcieImpl : AccountUtilServcie { @Autowired lateinit var subjectDao: SubjectDao + @Autowired + lateinit var transtypeDao: TranstypeDao + override fun readAccountForUpdate(userid: String, nowait: Boolean): TAccount { - //TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - return accountDao.findByUserid(userid); + return accountDao.getByAccnoForUpdateNowait(userid) } override fun readAccount(userid: String): TAccount { @@ -53,8 +56,7 @@ class AccountUtilServcieImpl : AccountUtilServcie { } override fun readShopAccForUpdate(shopId: Int, nowait: Boolean): TShopacc { - // TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - return shopaccDao.findByShopid(shopId) + return shopaccDao.getShopAccForUpdate(shopId) } override fun readShopAcc(shopId: Int): TShopacc { @@ -67,18 +69,15 @@ class AccountUtilServcieImpl : AccountUtilServcie { } override fun readSubjectForUpdate(subjno: String, nowait: Boolean): TSubject { - //TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - return subjectDao.getOne(subjno); + return subjectDao.getOne(subjno) } override fun readSubject(subjno: String): TSubject { return subjectDao.getOne(subjno) -// throw TransactionProcessException(TradeErrorCode.SUBJECT_NOT_EXISTS, "科目<$subjno>不存在") } override fun readTranstype(transtype: Int): TTranstype { - //TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - return TTranstype(); + return transtypeDao.getOne(transtype) } } @@ -130,7 +129,7 @@ class PersonBalancePayServiceImpl : PersonBalancePayService { } private fun doDealAccount(accno: String, amount: Double, overdraft: Boolean): TAccount { - var account = getlockAccount(accno) + val account = getlockAccount(accno) if (account.tacCheck()) throw TransactionProcessException(TradeErrorCode.ACCOUNT_TAC_ERROR, "账户<$accno>tac校验异常") diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt index 67e22d69..eae962ce 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt @@ -6,6 +6,7 @@ import com.supwisdom.dlpay.framework.util.TradeErrorCode class ResponseBodyBuilder private constructor() { companion object { private const val INVALIDE_RETCODE = -0x7FFFFFFF + private val RESERVED_KEY = setOf("retcode", "retmsg", "exception") fun create() = ResponseBodyBuilder() } @@ -35,6 +36,9 @@ class ResponseBodyBuilder private constructor() { } fun data(name: String, value: Any): ResponseBodyBuilder { + if(name in RESERVED_KEY) { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "返回值 <$name> 为保留值,不能使用") + } this.respData[name] = value return this } -- 2.17.1