diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
index dba7948..f733e98 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
@@ -4,6 +4,8 @@
 
 import javax.persistence.*;
 
+import java.util.List;
+
 import static javax.persistence.FetchType.LAZY;
 
 @Entity
@@ -49,6 +51,9 @@
   @OneToOne(targetEntity = TSubjectdtl.class, mappedBy = "refno", fetch = LAZY)
   private TSubjectdtl subjectDtl;
 
+  @OneToMany(targetEntity = TDebitCreditDtl.class, mappedBy = "refno", fetch = LAZY)
+  private List<TDebitCreditDtl> details;
+
   public String getRefno() {
     return refno;
   }
@@ -133,4 +138,24 @@
   public TSubjectdtl getSubjectDtl() {
     return subjectDtl;
   }
+
+  public List<TDebitCreditDtl> getDetails() {
+    return details;
+  }
+
+  public void setPersonDtl(TPersondtl personDtl) {
+    this.personDtl = personDtl;
+  }
+
+  public void setShopDtl(TShopdtl shopDtl) {
+    this.shopDtl = shopDtl;
+  }
+
+  public void setSubjectDtl(TSubjectdtl subjectDtl) {
+    this.subjectDtl = subjectDtl;
+  }
+
+  public void setDetails(List<TDebitCreditDtl> details) {
+    this.details = details;
+  }
 }
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 73f6bdc..98effbe 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
@@ -31,7 +31,7 @@
   TShopacc findByShopid(Integer shopid);
 
   @Lock(LockModeType.PESSIMISTIC_WRITE)
-  @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")})
+  @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
   @Query("select a from TShopacc a where a.shopid=?1")
   TShopacc getShopaccWithLockNowait(Integer shopid);
 
@@ -46,4 +46,6 @@
   @Query("update TShopacc set shopname=?1 where shopaccno=?2")
   void updateShopnameByShopaccno(String shopname, String shopaccno);
 
+
+  TShopacc findByShopacc(String acc);
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
index 4902e84..4f06db8 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -7,6 +7,7 @@
 import com.supwisdom.dlpay.api.bean.SupStatusRevResp
 import com.supwisdom.dlpay.api.bean.SupYktResp
 import com.supwisdom.dlpay.api.bean.WechatReqResp
+import com.supwisdom.dlpay.api.domain.TShopdtl
 import com.supwisdom.dlpay.api.domain.TUserdtl
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.Code
@@ -234,7 +235,7 @@
             }
         }
 
-        fun CallCitizenCardPay(config: Map<String, String?>, paydtl: TUserdtl): CallBackResp {
+        fun CallCitizenCardPay(config: Map<String, String?>, paydtl: TShopdtl): CallBackResp {
             val resp = CallBackResp()
             // TODO: 代扣逻辑
             return resp
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 1d5953c..af1eefe 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -1,24 +1,25 @@
 package com.supwisdom.dlpay.api.controller
 
-import com.supwisdom.dlpay.api.AccountHolder
-import com.supwisdom.dlpay.api.CallService
-import com.supwisdom.dlpay.api.PersonTransBuilder
-import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam
-import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam
-import com.supwisdom.dlpay.api.bean.QueryDtlResultParam
-import com.supwisdom.dlpay.api.bean.YktCardPayinitParam
+import com.supwisdom.dlpay.api.*
+import com.supwisdom.dlpay.api.bean.*
+import com.supwisdom.dlpay.api.domain.TAccount
 import com.supwisdom.dlpay.api.service.*
 import com.supwisdom.dlpay.exception.RequestParamCheckException
+import com.supwisdom.dlpay.exception.TransactionCheckException
 import com.supwisdom.dlpay.exception.TransactionException
 import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.domain.TShopacc
 import com.supwisdom.dlpay.framework.service.CommonService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.ConstantUtil
 import com.supwisdom.dlpay.util.PaytypeUtil
+import org.apache.catalina.authenticator.SpnegoAuthenticator
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
+import org.springframework.security.core.Authentication
+import org.springframework.security.core.context.SecurityContextHolder
 import org.springframework.web.bind.annotation.*
 import javax.servlet.http.HttpServletRequest
 import javax.servlet.http.HttpServletResponse
@@ -41,11 +42,14 @@
     @Autowired
     lateinit var commonService: CommonService
 
+    @Autowired
+    lateinit var transactionService: TransactionService
+
     /**
      * 流水结果查询统一接口
      * */
     fun queryDtlResult(@RequestBody param: QueryDtlResultParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-         try {
+        try {
             if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
@@ -57,7 +61,7 @@
                 personBalancePayService.getUserdtlByBillnoForUpdateNowait(param.billno!!, param.shopaccno!!)
             }
             val person = dtl.userid?.let { userService.findPersonByUserid(dtl.userid) }
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .data("refno", dtl.refno)
                     .data("amount", dtl.amount)
                     .data("paytype", dtl.paytype)
@@ -70,130 +74,185 @@
                     .success("查询成功"))
 
         } catch (ex: RequestParamCheckException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .requestException(ex, "请求参数错误"))
         } catch (et: TransactionException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .transException(et, "查询错误"))
         }
 
     }
 
+    private fun consumeMealer(param: CitizenCardPayinitParam, builder: TransactionBuilder,
+                              feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
+        val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
+                TradeDict.PAYTYPE_BALANCE)
+        val amount = feetype.amount / 100.0
+        when (feetypeConfig.crsubjno) {
+            shop.subjno -> {
+                builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(shop),
+                        amount, feetypeConfig.summary)
+                        .shop().also {
+                            it.amount += amount
+                        }
+            }
+            else -> {
+                val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno)
+                builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(subject),
+                        amount, feetypeConfig.summary)
+            }
+        }
+
+    }
+
+    private fun consumeDiscount(param: CitizenCardPayinitParam, builder: TransactionBuilder,
+                                feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
+        val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
+                TradeDict.PAYTYPE_BALANCE)
+        val amount = feetype.amount / 100.0
+        when (feetypeConfig.drsubjno) {
+            shop.subjno -> {
+                builder.addDebitCreditRecord(AccountProxy(shop), AccountProxy(person),
+                        amount, feetypeConfig.summary)
+            }
+            else -> {
+                val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno)
+                builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shop),
+                        amount, feetypeConfig.summary)
+            }
+        }
+    }
+
     /**
      * ============================================================================
      *                           账户【余额支付】
      * ============================================================================
      * */
     @PostMapping("/balance/pay")
-    fun balancePay(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-         try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
+    fun balancePay(@RequestBody param: CitizenCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
+        try {
+            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
 
             val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
             if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
-                val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .chooseTradetype(Tradetype.CONSUME) //消费
-                        .setOwner(person) //记名
-                        .setTransinfo(TradeCode.TRANSCODE_BALANCE_PAY, "账户余额支付")
-                        .setTransDatetime(param.transdate, param.transtime) //交易时间
-                        .selectPaytype(TradeDict.PAYTYPE_BALANCE, param.cardNo)
-                        .addDetail(AccountHolder.person(person.userid),
-                                AccountHolder.shop(param.shopaccno),
-                                param.amount / 100.0, "账户余额消费")
-                        .also { builder ->
-                            param.feelist?.forEach {
-                                when(it.feetype){
-                                    TradeDict.FEETYPE_CONSUME_MEALER -> {
-                                        if (it.amount <= 0) {
-                                            throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "费用类别<${it.feetype}>的金额不能为负")
-                                        }
-                                        builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_BALANCE)
-                                                .with(AccountHolder.shop(param.shopaccno))
-                                                .with(AccountHolder.person(person.userid))
-                                                , it.amount / 100.0)
-                                    }
-                                    TradeDict.FEETYPE_CONSUME_DISCOUNT->{
-                                        TODO("折扣逻辑暂缺")
-                                    }
-                                    else -> throw TransactionProcessException(TradeErrorCode.FEETYPE_NOT_NOSUPPORT, "费用类别<${it.feetype}>不支持")
-                                }
+                val account = accountUtilServcie.readAccount(person.userid)
+                val shopacc = accountUtilServcie.readShopbyAccno(param.shopaccno)
 
-                            }
+                val builder = TransactionBuilder().apply {
+                    transDate = param.transdate
+                    transTime = param.transtime
+                    paytype = TradeDict.PAYTYPE_BALANCE
+                    transCode = TradeCode.TRANSCODE_BALANCE_PAY
+                }.person(account).apply {
+                    description = "账户余额支付"
+                    summary = "账户余额消费"
+                    amount = param.amount / 100.0
+                    opposite = AccountProxy(shopacc)
+                }.and().shop(shopacc).apply {
+                    summary = "账户余额消费"
+                    amount = param.amount / 100.0
+                    opposite = AccountProxy(account)
+                }.and()
+
+                param.feelist?.forEach {
+                    when (it.feetype) {
+                        TradeDict.FEETYPE_CONSUME_MEALER -> {
+                            consumeMealer(param, builder, it, account, shopacc)
                         }
-                        .done(personBalancePayService)
+                        TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+                            consumeDiscount(param, builder, it, account, shopacc)
+                        }
+                        else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                "支付费率清单不支持feetype<${it.feetype}>")
+                    }
+                }
+
+                val dtl = builder.init(transactionService)
+                transactionService.success(dtl.refno)
 
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .data("refno", dtl.refno)
-                        .data("amount", dtl.amount)
+                        .data("amount", dtl.personDtl.amount)
                         .success("交易成功"))
             }
 
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
 
         } catch (ex: RequestParamCheckException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .requestException(ex, "请求参数错误"))
         } catch (et: TransactionException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .transException(et, "业务处理错误"))
         }
     }
 
 
-
     /**
      * ============================================================================
      *                           市民卡【交易初始化】
      * ============================================================================
      * */
     @PostMapping("/citizencard/payinit")
-    fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-         try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
+    fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam, authenticateAction: Authentication): ResponseEntity<Any> {
+        try {
+            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authenticateAction.name))) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
 
             val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
             if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_CITIZEN_CARD)) {
-                val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .chooseTradetype(Tradetype.CONSUME) //消费
-                        .setOwner(person) //记名
-                        .setTransinfo(TradeCode.TRANSCODE_CITIZENCARD_PAY, "市民卡代扣消费")
-                        .setTransDatetime(param.transdate, param.transtime) //交易时间
-                        .selectPaytype(TradeDict.PAYTYPE_CITIZEN_CARD, param.cardNo)
-                        .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_CITIZEN_CARD),
-                                AccountHolder.shop(param.shopaccno),
-                                param.amount / 100.0, "市民卡代扣消费")
+
+                val account = accountUtilServcie.readAccount(person.userid)
+                val shopacc = accountUtilServcie.readShopbyAccno(param.shopaccno)
+                val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD)
+                val transaction = TransactionBuilder().apply {
+                    transCode = TradeCode.TRANSCODE_CITIZENCARD_PAY
+                    transDate = param.transdate
+                    transTime = param.transtime
+                    paytype = TradeDict.PAYTYPE_CITIZEN_CARD
+                    payinfo = "市民卡代扣消费"
+                }.person(account).apply {
+                    amount = param.amount / 100.0
+                    opposite = AccountProxy(shopacc)
+                    summary = "市民卡代扣消费"
+                }.and().shop(shopacc).apply {
+                    amount = param.amount / 100.0
+                    opposite = AccountProxy(account)
+                    summary = "市民卡代扣消费"
+                }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc),
+                        param.amount / 100.0, "市民卡代扣消费")
                         .also { builder ->
                             param.feelist?.forEach {
                                 //fixme: 科目 -> 商户 与个人无关
-                                builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_CITIZEN_CARD)
-                                        .with(AccountHolder.shop(param.shopaccno))
-                                        .with(AccountHolder.subject(Subject.SUBJNO_PAY_CITIZEN_CARD))
-                                        , it.amount / 100.0)
+                                val feeconfig = accountUtilServcie.readFeetype(it.feetype,
+                                        TradeDict.PAYTYPE_CITIZEN_CARD)
+                                val subject = accountUtilServcie.readSubject(feeconfig.drsubjno)
+                                builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc),
+                                        it.amount / 100.0, feeconfig.summary)
+
                             }
-                        }
-                        .init(personBalancePayService)
+                        }.init(transactionService)
 
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("amount", dtl.amount)
+                        .data("refno", transaction.refno)
+                        .data("amount", transaction.shopDtl.amount)
                         .success("交易初始化成功"))
             }
 
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
 
         } catch (ex: RequestParamCheckException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .requestException(ex, "请求参数错误"))
         } catch (et: TransactionException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .transException(et, "业务处理错误"))
         }
     }
@@ -204,48 +263,41 @@
      * ============================================================================
      * */
     @PostMapping("/citizencard/payfinish")
-    fun citizencardPayinit(@RequestBody param: CitizenCardPayfinishParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-         try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
+    fun citizencardPayinit(@RequestBody param: CitizenCardPayfinishParam, authentication: Authentication): ResponseEntity<Any> {
+        try {
+            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
 
-            var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                    .setRefno(param.refno)
-                    .wip(personBalancePayService)
-            val code = CallService.CallCitizenCardPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, dtl.shopaccno), dtl)
-            if (code.retcode == "0") {
-                dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .setRefno(param.refno)
-                        .addResult(code.data)
-                        .success(personBalancePayService) //流水置成功
-
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("billno", dtl.outtradeno)
-                        .success())
-            } else {
-                PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .setRefno(param.refno)
-                        .addResult("errmsg", code.retmsg!!)
-                        .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
-
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
+            val code = transactionService.wip(param.refno).let {
+                CallService.CallCitizenCardPay(
+                        consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, it.shopDtl.shopaccno),
+                        it.shopDtl)
             }
-
+            if (code.retcode == "0") {
+                transactionService.success(param.refno).let {
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .data("refno", it.refno)
+                            .data("billno", it.outTradeNo)
+                            .success("交易确认成功"))
+                }
+            } else {
+                transactionService.fail(param.refno).let {
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
+                }
+            }
         } catch (ex: RequestParamCheckException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .requestException(ex, "请求参数错误"))
         } catch (et: TransactionException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .transException(et, "业务处理错误"))
         }
     }
 
 
-
     /**
      * ============================================================================
      *                           一卡通支付【交易初始化】
@@ -253,14 +305,14 @@
      * */
     @PostMapping("/ykt/payinit")
     fun yktPayInit(@RequestBody param: YktCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-         try {
+        try {
             if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
 
             val person = param.uid?.let { userService.findByThirdUniqueIdenty(it) } //没注册，可能匿名?
-            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person==null)) {
+            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person == null)) {
                 val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
                         .chooseTradetype(Tradetype.CONSUME) //消费
                         .also {
@@ -294,13 +346,13 @@
 
             }
 
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
         } catch (ex: RequestParamCheckException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .requestException(ex, "请求参数错误"))
         } catch (et: TransactionException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .transException(et, "业务处理错误"))
         }
     }
@@ -312,8 +364,8 @@
      * ============================================================================
      * */
     @PostMapping("/ykt/payfinish")
-    fun yktPayFinish(@RequestBody param:CitizenCardPayfinishParam,request: HttpServletRequest,response: HttpServletResponse): ResponseEntity<Any> {
-         try {
+    fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+        try {
             if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
@@ -323,7 +375,7 @@
                     .setRefno(param.refno)
                     .wip(personBalancePayService)
             val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
-            val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid==null),
+            val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
                     dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
             if (code.retcode == "0") {
                 dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
@@ -345,11 +397,11 @@
                         .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
             }
 
-        }catch (ex: RequestParamCheckException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+        } catch (ex: RequestParamCheckException) {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .requestException(ex, "请求参数错误"))
         } catch (et: TransactionException) {
-             return ResponseEntity.ok(ResponseBodyBuilder.create()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .transException(et, "业务处理错误"))
         }
     }
@@ -379,7 +431,6 @@
 //    }
 
 
-
 //
 //    /**
 //     * 微信支付
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
index a322f11..ad6f053 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
@@ -64,6 +64,11 @@
                 ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<$shopId>不存在")
     }
 
+    override fun readShopbyAccno(shopacc: String): TShopacc {
+        return shopaccDao.findByShopacc(shopacc)
+                ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<$shopacc>不存在")
+    }
+
     override fun readSubject(subjno: String): TSubject {
         return subjectDao.findBySubjno(subjno)
                 ?: throw TransactionProcessException(TradeErrorCode.SUBJECT_NOT_EXISTS, "科目<$subjno>不存在")
@@ -160,9 +165,9 @@
                 throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复") //非初始化状态，直接报错
             }
             //fixme: 判断是同一笔交易重发（标准？？）  是->已初始化直接返回；否 -> 报错：外部流水号重复
-            if(builder.amount == userdtl.amount && builder.paytype == userdtl.paytype && builder.transDate == userdtl.transdate && builder.transTime==userdtl.transtime){
+            if (builder.amount == userdtl.amount && builder.paytype == userdtl.paytype && builder.transDate == userdtl.transdate && builder.transTime == userdtl.transtime) {
                 return userdtl // 交易日期，时间重发时是否会变？？
-            }else{
+            } else {
                 throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复")
             }
         }
@@ -216,7 +221,7 @@
             }
         }
 
-        if(builder.extendMap.isNotEmpty()){
+        if (builder.extendMap.isNotEmpty()) {
             userdtlBusinessDao.save(TUserdtlBusiness(userdtl.refno, builder.extendMap)) //保存参数
         }
 
@@ -305,11 +310,11 @@
         return wip(builder.refno)
     }
 
-    override fun finish(builder: PersonTransBuilder): TUserdtl{
+    override fun finish(builder: PersonTransBuilder): TUserdtl {
         return finish(builder.refno, builder.status, builder.resultMap)
     }
 
-    override fun getUserdtlForUpdateNowait(refno: String): TUserdtl{
+    override fun getUserdtlForUpdateNowait(refno: String): TUserdtl {
         return try {
             userdtlDao.findByRefnoForUpdateNowait(refno)
                     ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "交易参考号<$refno>流水不存在")
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index ebf7118..3d799c2 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -1,7 +1,6 @@
 package com.supwisdom.dlpay.api.service.impl
 
 import com.supwisdom.dlpay.api.TransactionBuilder
-import com.supwisdom.dlpay.api.TransactionResult
 import com.supwisdom.dlpay.api.dao.*
 import com.supwisdom.dlpay.api.domain.*
 import com.supwisdom.dlpay.api.repositories.ShopaccRepositoryImpl
@@ -56,19 +55,19 @@
     @Autowired
     lateinit var shopaccRepository: ShopaccRepositoryImpl
 
-    private fun builderRecords(builder: TransactionBuilder, status: String): TransactionResult {
+    private fun builderRecords(builder: TransactionBuilder, status: String): TTransactionMain {
         // 记录三方的交易流水（个人，商户，科目)
         try {
-            val result = TransactionResult("20000000000001", "20190520")
             val transaction = TTransactionMain().apply {
-                this.refno = result.refno
-                this.accdate = result.accdate
+                refno = "20000000000001"
+                accdate = "20190520"
             }
 
+
             if (builder.hasPerson()) {
                 TPersondtl().apply {
-                    this.refno = result.refno
-                    this.accdate = result.accdate
+                    this.refno = transaction.refno
+                    this.accdate = transaction.accdate
                     userid = builder.person().person.userid
                     userName = builder.person().person.accname
                     transdate = builder.transDate
@@ -84,14 +83,14 @@
                 }.also {
                     // save persondtl
                     persondtlDao.save(it)
-                    result.persondtl = it
+                    transaction.personDtl = it
                     transaction.person = true
                 }
             }
             if (builder.hasShop()) {
                 TShopdtl().apply {
-                    this.refno = result.refno
-                    this.accdate = result.accdate
+                    this.refno = transaction.refno
+                    this.accdate = transaction.accdate
                     this.amount = builder.shop().amount
                     this.payInfo = builder.shop().payinfo
                     this.payType = builder.shop().paytype
@@ -106,15 +105,15 @@
                 }.also {
                     // save shopdtl
                     shopdtlDao.save(it)
-                    result.shopdtl = it
+                    transaction.shopDtl = it
                     transaction.shop = true
                 }
             }
             if (builder.hasSubject()) {
                 // save subjectdtl
                 TSubjectdtl().apply {
-                    this.refno = result.refno
-                    this.accdate = result.accdate
+                    this.refno = transaction.refno
+                    this.accdate = transaction.accdate
                     this.amount = builder.subject().amount
                     this.payInfo = builder.subject().payinfo
                     this.payType = builder.subject().paytype
@@ -126,15 +125,15 @@
                     this.status = status
                 }.also {
                     subjectdtlDao.save(it)
-                    result.subjectdtl = it
+                    transaction.subjectDtl = it
                     transaction.subject = true
                 }
             }
 
-            builder.getAllDetails().forEach { line ->
+            builder.getAllDetails().map { line ->
                 TDebitCreditDtl().apply {
-                    this.refno = result.refno
-                    this.accdate = result.accdate
+                    this.refno = transaction.refno
+                    this.accdate = transaction.accdate
                     this.seqno = line.seqno
                     this.draccno = line.debit.getAccountNo()
                     this.drsubjno = line.debit.getSubjectNo()
@@ -144,18 +143,19 @@
                     this.summary = line.summary
                 }.also {
                     debitCreditDtlDao.save(it)
-                    result.debitCreditLines.add(it)
                 }
+            }.apply {
+                transaction.details = this
             }
 
-            val details = debitCreditDtlDao.findByRefno(result.refno)
+            val details = debitCreditDtlDao.findByRefno(transaction.refno)
 
             if (builder.hasPerson()) {
                 sumBalanceFromDetails(details, builder.person().person.accno,
                         Subject.SUBJNO_PERSONAL_DEPOSIT).also {
-                    if (result.persondtl.amount != it) {
+                    if (transaction.personDtl.amount != it) {
                         throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
-                                "输入金额错误，个人余额不符<${result.persondtl.amount}>")
+                                "输入金额错误，个人余额不符<${transaction.personDtl.amount}>")
                     }
                 }
             }
@@ -163,35 +163,35 @@
             if (builder.hasShop()) {
                 sumBalanceFromDetails(details, builder.shop().shopacc.shopaccno,
                         Subject.SUBJNO_MACHANT_INCOME).also {
-                    if (result.shopdtl.amount != it) {
+                    if (transaction.shopDtl.amount != it) {
                         throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
-                                "输入金额错误，商户余额不符<${result.shopdtl.amount}>")
+                                "输入金额错误，商户余额不符<${transaction.shopDtl.amount}>")
                     }
                 }
             }
 
             if (builder.hasSubject()) {
                 sumBalanceFromDetails(details, builder.subject().subject.subjno,
-                        result.subjectdtl.subjectno).also {
-                    if (result.subjectdtl.amount != it) {
+                        transaction.subjectDtl.subjectno).also {
+                    if (transaction.subjectDtl.amount != it) {
                         throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
-                                "输入金额错误，科目余额不符<${result.subjectdtl.amount}>")
+                                "输入金额错误，科目余额不符<${transaction.subjectDtl.amount}>")
                     }
                 }
             }
 
             transactionMainDao.save(transaction)
-            return result
+            return transaction
         } catch (ex: SQLException) {
             throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, ex.message)
         }
     }
 
-    override fun init(builder: TransactionBuilder): TransactionResult {
+    override fun init(builder: TransactionBuilder): TTransactionMain {
         return builderRecords(builder, TradeDict.DTL_STATUS_INIT)
     }
 
-    override fun wip(builder: TransactionBuilder): TransactionResult {
+    override fun wip(builder: TransactionBuilder): TTransactionMain {
         return builderRecords(builder, TradeDict.DTL_STATUS_WIP)
     }
 
@@ -208,7 +208,7 @@
         }
     }
 
-    override fun wip(refno: String) {
+    override fun wip(refno: String): TTransactionMain {
         val transaction = transactionMainDao.findById(refno).let {
             if (it.isPresent) it.get() else null
         } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误")
@@ -252,9 +252,10 @@
             } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "科目流水<$refno>不存在")
         }
         transactionMainDao.save(transaction)
+        return transaction
     }
 
-    override fun fail(refno: String) {
+    override fun fail(refno: String): TTransactionMain {
         val transaction = transactionMainDao.findByRefnoForUpdate(refno)
                 ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误")
 
@@ -265,10 +266,11 @@
 
         transaction.status = TradeDict.DTL_STATUS_FAIL
         transactionMainDao.save(transaction)
+        return transaction
     }
 
 
-    override fun success(refno: String) {
+    override fun success(refno: String): TTransactionMain {
         val transaction = transactionMainDao.findByRefnoForUpdate(refno)
                 ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误")
 
@@ -296,5 +298,6 @@
             // update subject balance
         }
         transactionMainDao.save(transaction)
+        return transaction
     }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
index 568d9bb..ba07cda 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
@@ -20,6 +20,8 @@
 
     fun readShopAcc(shopId: Int): TShopacc
 
+    fun readShopbyAccno(shpoacc: String): TShopacc
+
     fun readSubject(subjno: String): TSubject
 
     fun readFeetype(feetype: String, paytype: String): TFeetypeConfig
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
index 8872f33..e8cdd79 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -1,26 +1,26 @@
 package com.supwisdom.dlpay.api.service
 
 import com.supwisdom.dlpay.api.TransactionBuilder
-import com.supwisdom.dlpay.api.TransactionResult
 import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TTransactionMain
 import org.springframework.transaction.annotation.Propagation
 import org.springframework.transaction.annotation.Transactional
 
 interface TransactionService {
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
-    fun init(builder: TransactionBuilder): TransactionResult
+    fun init(builder: TransactionBuilder): TTransactionMain
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
-    fun wip(refno: String)
+    fun wip(refno: String): TTransactionMain
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
-    fun wip(builder: TransactionBuilder): TransactionResult
+    fun wip(builder: TransactionBuilder): TTransactionMain
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
-    fun fail(refno: String)
+    fun fail(refno: String): TTransactionMain
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
-    fun success(refno: String)
+    fun success(refno: String): TTransactionMain
 }
 
 interface PersonAccountService {
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
index 68c639a..20d93f8 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
+++ b/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.*
+import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TTransactionMain
 import com.supwisdom.dlpay.api.service.AccountUtilServcie
 import com.supwisdom.dlpay.api.service.TransactionService
 import com.supwisdom.dlpay.exception.TransactionCheckException
@@ -29,6 +30,7 @@
     : SubTransactionBuilder(parent) {
     var amount: Double = 0.0
     var summary: String = ""
+    var description: String = ""
     lateinit var opposite: AccountProxy<*>
 
 }
@@ -171,26 +173,15 @@
         return debitCreditLines.toList()
     }
 
-    fun init(transactionService: TransactionService): TransactionResult {
+    fun init(transactionService: TransactionService): TTransactionMain {
         return transactionService.init(this)
     }
 
-    fun wip(transactionService: TransactionService): TransactionResult {
+    fun wip(transactionService: TransactionService): TTransactionMain {
         return transactionService.wip(this)
     }
 }
 
-class TransactionResult(val refno: String, val accdate: String) {
-
-    lateinit var persondtl: TPersondtl
-
-    lateinit var shopdtl: TShopdtl
-
-    lateinit var subjectdtl: TSubjectdtl
-
-    var debitCreditLines = mutableListOf<TDebitCreditDtl>()
-}
-
 class TransactionExample {
     companion object {
         fun exampleInit(accountUtilServcie: AccountUtilServcie,
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
index 99161e3..d400aaa 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
@@ -1,13 +1,14 @@
 package com.supwisdom.dlpay.framework.service
 
-import com.supwisdom.dlpay.api.bean.ConsumeFeetype
 import javax.servlet.http.HttpServletRequest
 
-interface CommonService{
+interface CommonService {
     fun getSystemVersion(): String
 
     fun getRequestAppid(request: HttpServletRequest): String
 
     fun getAppidSecretByRequest(request: HttpServletRequest): String
 
+    fun getSecretByAppid(appid: String): String
+
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
index 56f2586..32c6d92 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
@@ -33,11 +33,11 @@
     }
 
     override fun getSystemVersion(): String {
-        try {
-            return Manifests.read("Payapi-Version") ?: "version 1.0"
+        return try {
+            Manifests.read("Payapi-Version") ?: "version 1.0"
         } catch (ex: Exception) {
 //            ex.printStackTrace()
-            return "unknown"
+            "unknown"
         }
     }
 
@@ -56,7 +56,11 @@
     }
 
     override fun getAppidSecretByRequest(request: HttpServletRequest): String {
-        return apiClientDao.findByAppid(getRequestAppid(request)).let {
+        return getSecretByAppid(getRequestAppid(request))
+    }
+
+    override fun getSecretByAppid(appid: String): String {
+        return apiClientDao.findByAppid(appid).let {
             if (null != it)
                 it.secret
             else
