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
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> {
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) {
} 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
}
}
}
}
+ @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
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
}
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
@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 {
}
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 {
}
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)
}
}
}
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校验异常")