临时修改
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 89cf592..1b351b2 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.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 @@
List<String> 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 0000000..89d1da4
--- /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<TTranstype, Integer> {
+
+}
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 0000000..83b16e8
--- /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 a046753..ec7222f 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 @@
const val IDTYPE_TRANSTYPE = 4
fun person(userid: String): AccountHolder<TAccount> {
- return AccountHolder<TAccount>(userid, IDTYPE_PERSON)
+ return AccountHolder(userid, IDTYPE_PERSON)
}
fun shop(shopid: String): AccountHolder<TShopacc> {
- return AccountHolder<TShopacc>(shopid, IDTYPE_SHOP)
+ return AccountHolder(shopid, IDTYPE_SHOP)
}
fun subject(subjNo: String): AccountHolder<TSubject> {
@@ -37,6 +39,15 @@
internal lateinit var builder: PersonTransBuilder
+ internal val childrenHolder = mutableListOf<AccountHolder<*>>()
+
+
+ fun <U> with(holder: AccountHolder<U>): AccountHolder<T> {
+ holder.builder = this.builder
+ childrenHolder.add(holder)
+ return this
+ }
+
@Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
fun <T> get(): T {
return when (idType) {
@@ -48,8 +59,15 @@
} as T
}
- fun withLock(nowait: Boolean): T {
- TODO("not implement")
+ @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
+ fun <T> 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 @@
}
}
+ @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
+ fun <U> getAccountAndSubjNo(holder: AccountHolder<U>): Pair<String, String> {
+ return when (holder.idType) {
+ AccountHolder.IDTYPE_PERSON -> holder.get<TAccount>().let {
+ it.accno to it.subjno
+ }
+ AccountHolder.IDTYPE_SHOP -> holder.get<TShopacc>().let {
+ it.shopaccno to it.subjno
+ }
+ AccountHolder.IDTYPE_SUBJECT -> holder.get<TSubject>().let {
+ it.subjno to it.subjno
+ }
+ else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "不支持的账户类型")
+ }
+ }
+
fun <T, U> addDetail(debit: AccountHolder<T>, credit: AccountHolder<U>,
amount: Double, summary: String): PersonTransBuilder {
debit.builder = this
@@ -207,42 +241,48 @@
var debitAccNo = ""
var debitSubjNo = ""
- when (debit.idType) {
- AccountHolder.IDTYPE_PERSON -> debit.get<TAccount>().also {
- debitAccNo = it.accno
- debitSubjNo = it.subjno
- }
- AccountHolder.IDTYPE_SHOP -> debit.get<TShopacc>().also {
- debitAccNo = it.shopaccno
- debitSubjNo = it.subjno
- }
- AccountHolder.IDTYPE_SUBJECT -> debit.get<TSubject>().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<TTranstype>,
+ amount: Double, summary: String): PersonTransBuilder {
+ accountHolder.builder = this
+ val transtype = accountHolder.get<TTranstype>()
+
+ var debitAccNo = ""
+ var debitSubjNo = ""
+
+ if (transtype.drsubjno == "200") {
+
}
var creditAccNo = ""
var creditSubjNo = ""
- when (credit.idType) {
- AccountHolder.IDTYPE_PERSON -> credit.get<TAccount>().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<TShopacc>().also {
- creditAccNo = it.shopaccno
- creditSubjNo = it.subjno
- }
- AccountHolder.IDTYPE_SUBJECT -> credit.get<TSubject>().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 de02e7b..1d3b312 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 @@
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 c85139d..c58e41c 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.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 @@
@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 @@
}
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 @@
}
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 @@
}
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 67e22d6..eae962c 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 @@
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 @@
}
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
}