交易细节优化
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 {