diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
index 08bf26f..d48c602 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
@@ -136,6 +136,8 @@
 
   public static final int BUSINESS_PAYTYPE_NOSUPPORT = 30003; //支付方式不支持
 
-  public static final int UNHANLDED_EXCEPTION = 300004; // 未处理异常
+  public static final int SQL_EXCEPTION = 30004; // SQL处理异常
+
+  public static final int REQUEST_PARAM_EEROR = 30005; // 请求参数实体位置错误
 
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt b/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
index 0a893ea..d19f656 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
@@ -1,8 +1,10 @@
 package com.supwisdom.dlpay.api
 
 import com.supwisdom.dlpay.exception.RequestParamCheckException
+import com.supwisdom.dlpay.exception.TransactionCheckException
 import com.supwisdom.dlpay.exception.TransactionException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.service.CommonService
 import com.supwisdom.dlpay.framework.util.APIRequestParam
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import mu.KotlinLogging
@@ -10,7 +12,9 @@
 import org.aspectj.lang.annotation.Around
 import org.aspectj.lang.annotation.Aspect
 import org.aspectj.lang.annotation.Pointcut
+import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
+import org.springframework.security.core.Authentication
 import org.springframework.stereotype.Component
 import org.springframework.web.bind.annotation.ExceptionHandler
 import org.springframework.web.bind.annotation.RestControllerAdvice
@@ -31,7 +35,7 @@
                     .requestException(undeclared, "请求参数错误"))
         } else if (undeclared is TransactionException) {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(undeclared, "业务处理错误"))
+                    .exception(undeclared.code(), undeclared, "业务处理错误"))
         }
 
         return ResponseEntity.ok().body(ResponseBodyBuilder.create()
@@ -42,6 +46,8 @@
 @Component
 @Aspect
 class RestControllerAspect {
+    @Autowired
+    lateinit var commonService: CommonService
 
     private val logger = KotlinLogging.logger { }
 
@@ -53,13 +59,19 @@
     fun postmapping() {
     }
 
-    @Around("restcontroller() && postmapping() && args(.., @RequestBody body)")
+    @Around("restcontroller() && postmapping() && args(@RequestBody body, auth, ..)")
     @Throws(Throwable::class)
-    fun logPostMethods(joinPoint: ProceedingJoinPoint, body: Any): Any {
+    fun logPostMethods(joinPoint: ProceedingJoinPoint, body: Any, auth: Authentication): Any {
         return try {
             if (body is APIRequestParam) {
                 body.checkParam()
+                if (!body.checkSign(commonService.getSecretByAppid(auth.name))) {
+                    throw RequestParamCheckException(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")
+                }
+            } else {
+                throw TransactionCheckException(TradeErrorCode.REQUEST_PARAM_EEROR, "请求参数实体位置错误")
             }
+
             val result = joinPoint.proceed()
             logger.debug(result.toString())
             result
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 7a15077..d2cc60b 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
@@ -140,13 +140,13 @@
      * */
     @PostMapping("/balance/pay")
     fun balancePay(@RequestBody param: CitizenCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
-        if(!param.checkSign(commonService.getSecretByAppid(authentication.name))){
+        if (!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)) {
+        if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
             val account = accountUtilServcie.readAccount(person.userid)
             val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
 
@@ -166,30 +166,33 @@
                 opposite = AccountProxy(account)
             }.and().addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
                     param.amount / 100.0, "账户余额消费")
-                    .also { builder ->
-                        param.feelist?.forEach {
-                            val feeamt = it.amount / 100.0
-                            when (it.feetype) {
-                                TradeDict.FEETYPE_CONSUME_MEALER -> {
-                                    //搭伙费
-                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE)
-                                    val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目
-                                    when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) {
-                                        true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收
-                                        false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目
-                                    }
-                                }
-                                TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
-                                    //优惠折扣
-                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE)
-                                    val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目
-                                    builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary)
-
-                                }
-                                else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                        "账户余额支付费用清单不支持feetype<${it.feetype}>")
-                            }
+                    .also {
+                        param.feelist?.also {
+                            TODO("feelist 费用清单未实现！")
                         }
+//                        param.feelist?.forEach {
+//                            val feeamt = it.amount / 100.0
+//                            when (it.feetype) {
+//                                TradeDict.FEETYPE_CONSUME_MEALER -> {
+//                                    //搭伙费
+//                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE)
+//                                    val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目
+//                                    when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) {
+//                                        true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收
+//                                        false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目
+//                                    }
+//                                }
+//                                TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+//                                    //优惠折扣
+//                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE)
+//                                    val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目
+//                                    builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary)
+//
+//                                }
+//                                else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+//                                        "账户余额支付费用清单不支持feetype<${it.feetype}>")
+//                            }
+//                        }
                     }.init(transactionService)
 
             transactionService.success(dtl.refno)
@@ -213,64 +216,74 @@
      * */
     @PostMapping("/citizencard/payinit")
     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 account = accountUtilServcie.readAccount(person.userid)
-                val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
-                val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD)
-                val transaction = TransactionBuilder().apply {
-                    setTransInfo(param.transdate, param.transtime,
-                            TradeCode.TRANSCODE_CITIZENCARD_PAY,
-                            TradeDict.PAYTYPE_CITIZEN_CARD)
-                    setOutTransInfo(shopacc.shopaccno, param.billno)
-                    operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
-                    payinfo = "市民卡代扣消费"
-                    description = "市民卡代扣消费"
-                }.person(account).apply {
-                    setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
-                    opposite = AccountProxy(shopacc)
-                }.and().shop(shopacc).apply {
-                    setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
-                    opposite = AccountProxy(account)
-                }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account),
-                        param.amount / 100.0, "市民卡代扣消费")
-                        .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
-                                param.amount / 100.0, "市民卡代扣消费")
-                        .also { builder ->
-                            param.feelist?.forEach {
-                                //fixme: 科目 -> 商户 与个人无关
-                                val feeconfig = accountUtilServcie.readFeetype(it.feetype,
-                                        TradeDict.PAYTYPE_CITIZEN_CARD)
-                                val subj = accountUtilServcie.readSubject(feeconfig.drsubjno)
-                                builder.addDebitCreditRecord(AccountProxy(subj), AccountProxy(shopacc),
-                                        it.amount / 100.0, feeconfig.summary)
-
-                            }
-                        }.init(transactionService)
-
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", transaction.refno)
-                        .data("amount", transaction.shopDtl.amount)
-                        .success("交易初始化成功"))
-            }
-
+        if (!param.checkSign(commonService.getSecretByAppid(authenticateAction.name))) {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
-
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
+                    .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
         }
+
+        val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
+        if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_CITIZEN_CARD)) {
+
+            val account = accountUtilServcie.readAccount(person.userid)
+            val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
+            val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD)
+            val transaction = TransactionBuilder().apply {
+                setTransInfo(param.transdate, param.transtime,
+                        TradeCode.TRANSCODE_CITIZENCARD_PAY,
+                        TradeDict.PAYTYPE_CITIZEN_CARD)
+                setOutTransInfo(shopacc.shopaccno, param.billno)
+                operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
+                payinfo = param.cardNo
+                description = "市民卡代扣消费"
+            }.person(account).apply {
+                setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
+                opposite = AccountProxy(shopacc)
+            }.and().shop(shopacc).apply {
+                setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
+                opposite = AccountProxy(account)
+            }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account),
+                    param.amount / 100.0, "市民卡代扣消费")
+                    .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
+                            param.amount / 100.0, "市民卡代扣消费")
+                    .also {
+                        param.feelist?.also {
+                            TODO("feelist 费用清单未实现！")
+                        }
+//                        param.feelist?.forEach {
+//                            val feeamt = it.amount / 100.0
+//                            when (it.feetype) {
+//                                TradeDict.FEETYPE_CONSUME_MEALER -> {
+//                                    //搭伙费
+//                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE)
+//                                    val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目
+//                                    when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) {
+//                                        true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收
+//                                        false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目
+//                                    }
+//                                }
+//                                TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+//                                    //优惠折扣
+//                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE)
+//                                    val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目
+//                                    builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary)
+//
+//                                }
+//                                else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+//                                        "账户余额支付费用清单不支持feetype<${it.feetype}>")
+//                            }
+//
+//                        }
+                    }.init(transactionService)
+
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .data("refno", transaction.refno)
+                    .data("billno", transaction.outTradeNo)
+                    .data("amount", transaction.shopDtl.amount)
+                    .success("交易初始化成功"))
+        }
+
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
     }
 
     /**
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 48e9e29..e12d3cd 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
@@ -3,6 +3,8 @@
 import com.supwisdom.dlpay.api.ShopAccBalanceAsyncTask
 import com.supwisdom.dlpay.api.TransactionBuilder
 import com.supwisdom.dlpay.api.domain.TTransactionMain
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Component
 import org.springframework.stereotype.Service
@@ -75,7 +77,16 @@
 
 
     fun init(builder: TransactionBuilder): TTransactionMain {
-        return transactionService.init(builder)
+        try{
+            return transactionService.init(builder)
+        }catch (ex:Exception){
+            ex.javaClass.name.let {
+                val name = it.substringAfterLast('.')
+
+                throw TransactionProcessException(TradeErrorCode.SQL_EXCEPTION,
+                        "SQL错误 $name - ${ex.message}")
+            }
+        }
     }
 
     fun wip(refno: String): TTransactionMain {
