增加 AccountHolder 处理逻辑
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 cb10e5f..27b72ff 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
@@ -5,19 +5,21 @@
 import com.supwisdom.dlpay.consume.domain.TPerson
 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.TShopacc
 import com.supwisdom.dlpay.framework.domain.TSubject
 import com.supwisdom.dlpay.framework.domain.TTranstype
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
 
-class AccountHolder<out T> private constructor(val accountId: String, val idType: Int) {
+class AccountHolder<T> private constructor(val accountId: String, val idType: Int) {
     companion object {
-        const val IDTYPE_ACCOUNT = 1
+        const val IDTYPE_PERSON = 1
         const val IDTYPE_SHOP = 2
         const val IDTYPE_SUBJECT = 3
         const val IDTYPE_TRANSTYPE = 4
 
         fun person(userid: String): AccountHolder<TAccount> {
-            return AccountHolder<TAccount>(userid, IDTYPE_ACCOUNT)
+            return AccountHolder<TAccount>(userid, IDTYPE_PERSON)
         }
 
         fun shop(shopid: String): AccountHolder<TShopacc> {
@@ -33,10 +35,17 @@
         }
     }
 
-    internal lateinit var build: PersonTransBuilder
+    private lateinit var builder: PersonTransBuilder
 
-    fun get(): T {
-        TODO("add rule")
+    @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
+    fun <T> get(): T {
+        return when (idType) {
+            IDTYPE_PERSON -> builder.accountUtil.readAccount(accountId)
+            IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId)
+            IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId)
+            IDTYPE_TRANSTYPE -> builder.accountUtil.readTranstype(accountId.toInt())
+            else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>")
+        } as T
     }
 
     fun withLock(nowait: Boolean): T {
@@ -49,7 +58,8 @@
         fun newBuilder(accUitl: AccountUtilServcie) = PersonTransBuilder(accUitl)
     }
 
-    inner class TransDetail(val debitAccNo: String, val creditAccNo: String,
+    inner class TransDetail(val debitAccNo: String, val debitSubjNo: String,
+                            val creditAccNo: String, val creditSubjNo: String,
                             val amount: Double, val summary: String,
                             val rowno: Int)
 
@@ -93,15 +103,47 @@
     private fun preCheckAccount() {
     }
 
-    fun addDetail(debitAccNo: String, creditAccNo: String,
-                  amount: Double, summary: String): PersonTransBuilder {
-        this.details.add(TransDetail(debitAccNo, creditAccNo, amount,
-                summary, this.details.size + 1))
-        return this
-    }
-
     fun <T, U> addDetail(debit: AccountHolder<T>, credit: AccountHolder<U>,
                          amount: Double, summary: String): PersonTransBuilder {
+        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")
+        }
+
+
+        var creditAccNo = ""
+        var creditSubjNo = ""
+        when (credit.idType) {
+            AccountHolder.IDTYPE_PERSON -> credit.get<TAccount>().also {
+                creditAccNo = it.accno
+                creditSubjNo = it.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")
+        }
+
+        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 01a143a..7276c02 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
@@ -8,6 +8,7 @@
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.PostMapping
 import org.springframework.web.bind.annotation.RestController
 
 @RestController
@@ -18,7 +19,7 @@
     @Autowired
     lateinit var personBalancePayService: PersonBalancePayService
 
-    @GetMapping("/account/pay")
+    @PostMapping("/account/pay")
     fun accountPay(userid: String, amount: Int, manageFee: Int): ResponseEntity<Any> {
         val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
                 .setTransDatetime("20190411", "112311")
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 155f9fd..c77c2d5 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
@@ -9,6 +9,8 @@
 import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.dao.PaydtlDao
 import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.domain.TSubject
+import com.supwisdom.dlpay.framework.domain.TTranstype
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
@@ -34,6 +36,18 @@
     override fun readShopAcc(shopId: String): TShopacc {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
+
+    override fun readSubjectForUpdate(subjno: String, nowait: Boolean): TSubject {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun readSubject(subjno: String): TSubject {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun readTranstype(transtype: Int): TTranstype {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
 }
 
 @Service
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
index 66d3b37..8897569 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
@@ -4,6 +4,8 @@
 import com.supwisdom.dlpay.consume.domain.TAccount
 import com.supwisdom.dlpay.consume.domain.TPaydtl
 import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.domain.TSubject
+import com.supwisdom.dlpay.framework.domain.TTranstype
 
 interface AccountUtilServcie {
 
@@ -12,6 +14,11 @@
 
     fun readShopAccForUpdate(shopId: String, nowait: Boolean): TShopacc
     fun readShopAcc(shopId: String): TShopacc
+
+    fun readSubjectForUpdate(subjno: String, nowait: Boolean): TSubject
+    fun readSubject(subjno: String): TSubject
+
+    fun readTranstype(transtype: Int) : TTranstype
 }
 
 interface PersonBalancePayService {