优化代码
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubAccountDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubAccountDao.java
new file mode 100644
index 0000000..ac193ab
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubAccountDao.java
@@ -0,0 +1,24 @@
+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);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubAccountMetadataDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubAccountMetadataDao.java
new file mode 100644
index 0000000..0e84845
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubAccountMetadataDao.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TSubAccountMetadata;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface SubAccountMetadataDao extends JpaRepository<TSubAccountMetadata, Integer> {
+  TSubAccountMetadata readByNameAndTenantid(String name, String tenantid);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java
index 1c7f5d1..b77332f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java
@@ -28,9 +28,6 @@
   @Column(name = "ACCNO", length = 32)
   private String accountNo;
 
-  @Column(name = "accname", length = 32)
-  private String accountName; // 账户名
-
   @Column(name = "USERNAME", length = 200)
   private String userName;
 
@@ -325,11 +322,4 @@
     this.aftbal = aftbal;
   }
 
-  public String getAccountName() {
-    return accountName;
-  }
-
-  public void setAccountName(String accountName) {
-    this.accountName = accountName;
-  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubAccount.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubAccount.java
index b1878e3..6c048b9 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubAccount.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubAccount.java
@@ -141,4 +141,12 @@
   public void setTenantid(String tenantid) {
     this.tenantid = tenantid;
   }
+
+  public String getSubjno() {
+    return subjno;
+  }
+
+  public void setSubjno(String subjno) {
+    this.subjno = subjno;
+  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubAccountMetadata.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubAccountMetadata.java
index bb3e9d4..75229ea 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubAccountMetadata.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubAccountMetadata.java
@@ -23,6 +23,9 @@
   @Column(name = "title", length = 100)
   private String title;
 
+  @Column(name = "subjno", length = 16)
+  private String subjno;
+
   @Column(name = "description", length = 200)
   private String description;
 
@@ -69,4 +72,12 @@
   public void setTenantid(String tenantid) {
     this.tenantid = tenantid;
   }
+
+  public String getSubjno() {
+    return subjno;
+  }
+
+  public void setSubjno(String subjno) {
+    this.subjno = subjno;
+  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
index f81af48..7a80390 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
@@ -2,7 +2,6 @@
 
 import com.supwisdom.dlpay.framework.util.Subject;
 import com.supwisdom.dlpay.framework.util.TradeDict;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 
 import javax.persistence.*;
 import javax.validation.constraints.Digits;
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index 2061144..82ae2cc 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -111,6 +111,7 @@
                     this.reverseFlag = TradeDict.REVERSE_FLAG_NONE
                     remark = builder.person().remark
                     tenantid = transaction.tenantid
+                    this.accountName = "main"
                     this.dtltype = builder.dtltype
                     this.status = status
                     this.anonymous = builder.person().isAnonymous()
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
index 85ed71a..80682b9 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
@@ -1,6 +1,7 @@
 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
@@ -9,6 +10,7 @@
 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) {
@@ -84,11 +86,28 @@
 
 }
 
+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)
@@ -105,6 +124,7 @@
             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")
         }
@@ -115,6 +135,7 @@
             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")
         }
@@ -125,6 +146,7 @@
             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")
         }
@@ -374,10 +396,6 @@
                     throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
                             "个人交易对方账户未设置")
                 }
-//                if (it.payinfo.isEmpty()) {
-//                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-//                            "个人交易信息未设置")
-//                }
             }
         }