临时修改
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
     }