定义agentservice 动态获取bean
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
index 79bd0be..0906293 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
@@ -1,14 +1,41 @@
 package com.supwisdom.dlpay.agent;
 
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
 public class AgentResponse {
   private AgentCode code;
   private String agentCode;
   private String agentMsg;
 
   private String agentRefno;
+
+  public AgentCode getCode() {
+    return code;
+  }
+
+  public void setCode(AgentCode code) {
+    this.code = code;
+  }
+
+  public String getAgentCode() {
+    return agentCode;
+  }
+
+  public void setAgentCode(String agentCode) {
+    this.agentCode = agentCode;
+  }
+
+  public String getAgentMsg() {
+    return agentMsg;
+  }
+
+  public void setAgentMsg(String agentMsg) {
+    this.agentMsg = agentMsg;
+  }
+
+  public String getAgentRefno() {
+    return agentRefno;
+  }
+
+  public void setAgentRefno(String agentRefno) {
+    this.agentRefno = agentRefno;
+  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccRespCode.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccRespCode.java
index b1512d5..6fdd230 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccRespCode.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccRespCode.java
@@ -1,13 +1,27 @@
 package com.supwisdom.dlpay.agent.citizencard;
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@AllArgsConstructor
 public class YnrccRespCode {
   private String code;
   private String msg;
+
+  public YnrccRespCode(String code, String msg) {
+    this.code = code;
+    this.msg = msg;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public String getMsg() {
+    return msg;
+  }
+
+  public void setMsg(String msg) {
+    this.msg = msg;
+  }
 }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
index 8e02f9d..93ec750 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
@@ -26,7 +26,7 @@
 
 }
 
-@Component
+@Component("citizenCardAgent")
 class CitizenCardPayAgent : AgentPayService {
     @Autowired
     private lateinit var citizencardPayService: CitizencardPayService
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 2760298..45022c4 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.api.controller
 
 import com.supwisdom.dlpay.agent.AgentCode
+import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.api.*
 import com.supwisdom.dlpay.api.bean.*
 import com.supwisdom.dlpay.api.service.*
@@ -12,6 +13,7 @@
 import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
 import com.supwisdom.dlpay.agent.service.CitizenCardPayAgent
 import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.ApplicationContext
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.PostMapping
 import org.springframework.web.bind.annotation.RequestBody
@@ -36,9 +38,9 @@
     lateinit var cardService: CardService
     @Autowired
     lateinit var citizencardPayService: CitizencardPayService
-
     @Autowired
-    private lateinit var citizenCardPayAgent: CitizenCardPayAgent
+    private lateinit var applicationContext: ApplicationContext
+
     @Autowired
     lateinit var citizencardQueryResultTask: CitizencardQueryResultTask
 
@@ -201,6 +203,13 @@
                 .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
     }
 
+    fun createAgentService(sourceType: String): AgentPayService {
+        return applicationContext.getBean(sourceType + "Agent")?.let {
+            it as AgentPayService
+        } ?: throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+                "支付类型<$sourceType>未定义")
+    }
+
     /**
      * ============================================================================
      *                           市民卡【交易确认】
@@ -209,7 +218,8 @@
     @PostMapping("/citizencard/payfinish")
     fun citizencardPayinit(@Valid @RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
         val dtl = transactionService.wip(param.refno)
-        val resp = citizenCardPayAgent.pay(dtl)
+        val service = createAgentService(TradeDict.PAYTYPE_CITIZEN_CARD)
+        val resp = service.pay(dtl)
         when (resp.code) {
             AgentCode.SUCCESS ->
                 transactionService.success(dtl.refno, resp.agentRefno, false).let {
@@ -261,48 +271,32 @@
 
             val cancelTrans = builder.cancelInit(mainDtl.refno, transactionService)
             transactionService.wip(cancelTrans.refno)
-            when {
-                TradeDict.PAYTYPE_BALANCE == mainDtl.sourceType -> {
-                    //余额支付,直接撤销
-                    transactionService.success(cancelTrans.refno)
+            val service = createAgentService(mainDtl.sourceType)
+            val resp = service.pay(cancelTrans)
+            when (resp.code) {
+                AgentCode.SUCCESS -> {
+                    transactionService.success(cancelTrans.refno, resp.agentRefno, false)
 
                     return ResponseEntity.ok(ResponseBodyBuilder.create()
                             .success(PayReverseResponse(cancelTrans.refno), "交易撤销成功"))
-
                 }
-                TradeDict.PAYTYPE_CITIZEN_CARD == mainDtl.sourceType -> {
-                    val resp = citizenCardPayAgent.pay(cancelTrans)
-                    when (resp.code) {
-                        AgentCode.SUCCESS -> {
-                            transactionService.success(cancelTrans.refno, resp.agentRefno, false)
-
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .success(PayReverseResponse(cancelTrans.refno), "交易撤销成功"))
-                        }
-                        AgentCode.NEED_QUERY -> {
-                            //待查询
-                            citizencardQueryResultTask.queryResult(cancelTrans.refno, 0)
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .fail(PayReverseResponse(cancelTrans.refno),
-                                            TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
-                        }
-                        else -> transactionService.fail(cancelTrans.refno,
-                                "${resp.agentCode}-${resp.agentMsg}").let {
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .fail(PayReverseResponse(cancelTrans.refno),
-                                            TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
-                        }
-                    }
+                AgentCode.NEED_QUERY -> {
+                    //待查询
+                    citizencardQueryResultTask.queryResult(cancelTrans.refno, 0)
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(PayReverseResponse(cancelTrans.refno),
+                                    TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
                 }
-                else -> return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(PayReverseResponse(cancelTrans.refno),
-                                TradeErrorCode.BUSINESS_DEAL_ERROR, "暂不支持支付方式[${mainDtl.sourceType}]的流水撤销"))
+                else -> transactionService.fail(cancelTrans.refno,
+                        "${resp.agentCode}-${resp.agentMsg}").let {
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(PayReverseResponse(cancelTrans.refno),
+                                    TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
+                }
             }
 
-
-        } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
-                .fail(PayReverseResponse(),
-                        TradeErrorCode.BUSINESS_DEAL_ERROR, "流水不存在"))
+        } ?: return ResponseEntity.ok(ResponseBodyBuilder.create().fail(PayReverseResponse(),
+                TradeErrorCode.BUSINESS_DEAL_ERROR, "流水不存在"))
     }
 
     /**
@@ -331,41 +325,31 @@
             }
             val refundTrans = builder.refundInit(mainDtl.refno, param.refundAmount / 100.0, transactionService)
             transactionService.wip(refundTrans.refno)
-            when {
-                TradeDict.PAYTYPE_BALANCE == mainDtl.sourceType -> {
-                    //余额支付,直接撤销
-                    transactionService.success(refundTrans.refno)
+            val service = createAgentService(mainDtl.sourceType)
+            val resp = service.refund(refundTrans)
+
+            when (resp.code) {
+                AgentCode.SUCCESS -> {
+                    transactionService.success(refundTrans.refno, resp.agentRefno, false)
 
                     return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .success(PayReverseResponse(refundTrans.refno), "交易退款成功"))
-
+                            .success(PayReverseResponse(refundTrans.refno), "交易撤销成功"))
                 }
-                TradeDict.PAYTYPE_CITIZEN_CARD == mainDtl.sourceType -> {
-
-                    val resp = citizencardPayService.cardPayRefund(refundTrans.refno, refundTrans.accdate, mainDtl.refno, MoneyUtil.YuanToFen(mainDtl.personDtl.amount))
-                    when {
-                        YnrccUtil.CODE_SUCCESS == resp.code -> {
-                            transactionService.success(refundTrans.refno, resp.bankjourno, false)
-
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .success(PayReverseResponse(refundTrans.refno), "交易退款成功"))
-                        }
-                        YnrccUtil.CODE_EXCEPTION == resp.code -> {
-                            //待查询
-                            citizencardQueryResultTask.queryResult(refundTrans.refno, 0)
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .data("refundRefno", refundTrans.refno)
-                                    .fail(TradeErrorCode.WAIT_QUERY_RESULT, "请查询退款结果"))
-                        }
-                        else -> transactionService.fail(refundTrans.refno, resp.message).let {
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易退款失败-${resp.message}"))
-                        }
-                    }
+                AgentCode.NEED_QUERY -> {
+                    //待查询
+                    citizencardQueryResultTask.queryResult(refundTrans.refno, 0)
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(PayReverseResponse(refundTrans.refno),
+                                    TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
                 }
-                else -> return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "暂不支持支付方式[${mainDtl.sourceType}]的流水退款"))
+                else -> transactionService.fail(refundTrans.refno,
+                        "${resp.agentCode}-${resp.agentMsg}").let {
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(PayReverseResponse(refundTrans.refno),
+                                    TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
+                }
             }
+
         } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
     }