--- /dev/null
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TSubAccount;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.QueryHints;
+
+import javax.persistence.LockModeType;
+import javax.persistence.QueryHint;
+import java.util.List;
+
+public interface SubAccountDao extends JpaRepository<TSubAccount, String> {
+ List<TSubAccount> findAllByUserid(String userid);
+
+ TSubAccount readTSubAccountByUseridAndAccountName(String userid, String name);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
+ TSubAccount readLockTSubAccountByUseridAndAccountName(String userid, String name);
+
+ @Lock(LockModeType.OPTIMISTIC)
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
+ TSubAccount readLockTSubAccountById(String id);
+}
package com.supwisdom.dlpay.api
import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TSubAccount
import com.supwisdom.dlpay.api.domain.TTransactionMain
import com.supwisdom.dlpay.api.service.TransactionServiceProxy
import com.supwisdom.dlpay.exception.TransactionCheckException
import com.supwisdom.dlpay.framework.util.TradeDict
import com.supwisdom.dlpay.framework.util.TradeErrorCode
import org.apache.commons.lang3.StringUtils
+import java.time.temporal.TemporalAmount
import kotlin.math.abs
open class SubTransactionBuilder<T : SubTransactionBuilder<T>>(val parent: TransactionBuilder) {
}
+data class PersonSubAccountTrans(val userid: String, val subAccName: String,
+ val amount: Double)
+
class PersonTranactionBuilder(parent: TransactionBuilder, val person: TAccount?)
: SubTransactionBuilder<PersonTranactionBuilder>(parent) {
+ private val subAccountList = mutableListOf<PersonSubAccountTrans>()
fun isAnonymous(): Boolean {
return person == null
}
+
+ fun addSubAccount(subAccName: String, amount: Double): PersonTranactionBuilder {
+ if (isAnonymous()) {
+ throw TransactionCheckException(10001, "匿名用户不支持专款")
+ }
+ subAccountList.forEach {
+ if (it.subAccName == subAccName) {
+ throw TransactionCheckException(10001, "专款账户<$subAccName>已经消费")
+ }
+ }
+ subAccountList.add(PersonSubAccountTrans(person!!.userid, subAccName, amount))
+ return this
+ }
}
class ShopTransactionBuilder(parent: TransactionBuilder, val shopacc: TShopacc)
is TAccount -> (accountObj as TAccount).accno
is TShopacc -> (accountObj as TShopacc).shopaccno
is TSubject -> (accountObj as TSubject).subjno
+ is TSubAccount -> (accountObj as TSubAccount).subjno
else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
"不支持的账户类型, $accountObj")
}
is TAccount -> (accountObj as TAccount).subjno
is TShopacc -> (accountObj as TShopacc).subjno
is TSubject -> (accountObj as TSubject).subjno
+ is TSubAccount -> (accountObj as TSubAccount).subjno
else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
"不支持的账户类型, $accountObj")
}
is TAccount -> (accountObj as TAccount).accname
is TShopacc -> (accountObj as TShopacc).shopname
is TSubject -> (accountObj as TSubject).subjname
+ is TSubAccount -> (accountObj as TSubAccount).accountName
else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
"不支持的账户类型, $accountObj")
}
throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
"个人交易对方账户未设置")
}
-// if (it.payinfo.isEmpty()) {
-// throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-// "个人交易信息未设置")
-// }
}
}