重构前置接口
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentPayService.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentPayService.java
index 9b10dfc..b681a94 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentPayService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentPayService.java
@@ -2,14 +2,14 @@
 
 import com.supwisdom.dlpay.api.domain.TTransactionMain;
 
-public interface AgentPayService {
-  AgentResponse auth(String agentid, String billno);
+public interface AgentPayService<T> {
+  AgentResponse<T> auth(String agentid, String billno);
 
-  AgentResponse pay(TTransactionMain transaction);
+  AgentResponse<T> pay(TTransactionMain transaction);
 
-  AgentResponse cancel(TTransactionMain transaction);
+  AgentResponse<T> cancel(TTransactionMain transaction);
 
-  AgentResponse refund(TTransactionMain transaction);
+  AgentResponse<T> refund(TTransactionMain transaction);
 
-  AgentResponse query(TTransactionMain transaction);
+  AgentResponse<T> query(TTransactionMain transaction);
 }
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 d07cba5..a8dde97 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
@@ -1,62 +1,72 @@
 package com.supwisdom.dlpay.agent;
 
-public class AgentResponse {
-    public static final String AGENTCODE_SUCCESS = "0";
+public class AgentResponse<T> {
+  public static final String AGENTCODE_SUCCESS = "0";
 
-    public static final String AGENTCODE_FAIL = "1";
+  public static final String AGENTCODE_FAIL = "1";
 
-    private AgentCode code;
-    private String agentCode;
-    private String agentMsg;
-    private String agentBody;
-    private String agentRefno;
-    private DtlStatus dtlStatus;
+  private AgentCode code;
+  private String agentCode;
+  private String agentMsg;
+  private String agentBody;
+  private String agentRefno;
+  private DtlStatus dtlStatus;
 
-    public String getAgentBody() {
-        return agentBody;
-    }
+  private T payload;
 
-    public void setAgentBody(String agentBody) {
-        this.agentBody = agentBody;
-    }
+  public String getAgentBody() {
+    return agentBody;
+  }
 
-    public AgentCode getCode() {
-        return code;
-    }
+  public void setAgentBody(String agentBody) {
+    this.agentBody = agentBody;
+  }
 
-    public void setCode(AgentCode code) {
-        this.code = code;
-    }
+  public AgentCode getCode() {
+    return code;
+  }
 
-    public String getAgentCode() {
-        return agentCode;
-    }
+  public void setCode(AgentCode code) {
+    this.code = code;
+  }
 
-    public void setAgentCode(String agentCode) {
-        this.agentCode = agentCode;
-    }
+  public String getAgentCode() {
+    return agentCode;
+  }
 
-    public String getAgentMsg() {
-        return agentMsg;
-    }
+  public void setAgentCode(String agentCode) {
+    this.agentCode = agentCode;
+  }
 
-    public void setAgentMsg(String agentMsg) {
-        this.agentMsg = agentMsg;
-    }
+  public String getAgentMsg() {
+    return agentMsg;
+  }
 
-    public String getAgentRefno() {
-        return agentRefno;
-    }
+  public void setAgentMsg(String agentMsg) {
+    this.agentMsg = agentMsg;
+  }
 
-    public void setAgentRefno(String agentRefno) {
-        this.agentRefno = agentRefno;
-    }
+  public String getAgentRefno() {
+    return agentRefno;
+  }
 
-    public DtlStatus getDtlStatus() {
-        return dtlStatus;
-    }
+  public void setAgentRefno(String agentRefno) {
+    this.agentRefno = agentRefno;
+  }
 
-    public void setDtlStatus(DtlStatus dtlStatus) {
-        this.dtlStatus = dtlStatus;
-    }
+  public DtlStatus getDtlStatus() {
+    return dtlStatus;
+  }
+
+  public void setDtlStatus(DtlStatus dtlStatus) {
+    this.dtlStatus = dtlStatus;
+  }
+
+  public T getPayload() {
+    return payload;
+  }
+
+  public void setPayload(T payload) {
+    this.payload = payload;
+  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProvider.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProvider.java
index 964b460..88c7f80 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProvider.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProvider.java
@@ -1,9 +1,11 @@
 package com.supwisdom.dlpay.agent;
 
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus;
+
 public interface CheckFileProvider {
-  AgentResponse acquireCheckFile(String checkDate);
+  AgentResponse<TSourceTypeCheckStatus> acquireCheckFile(String checkDate);
 
-  AgentResponse queryCheckFile(String checkDate);
+  AgentResponse<TSourceTypeCheckStatus> queryCheckFile(String checkDate);
 
-  AgentResponse downloadCheckFile(String checkDate);
+  AgentResponse<TSourceTypeCheckStatus> downloadCheckFile(String checkDate);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/ApplicationUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/ApplicationUtil.java
index 3523689..7e51071 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/ApplicationUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/ApplicationUtil.java
@@ -10,11 +10,11 @@
 public class ApplicationUtil {
   private static final Logger logger = LoggerFactory.getLogger(ApplicationUtil.class);
 
-  public static AgentPayService findAgentPayService(ApplicationContext context, String service) {
+  public static <T> AgentPayService<T> findAgentPayService(ApplicationContext context, String service) {
     try {
       Object bean = context.getBean(service);
       if (bean instanceof AgentPayService) {
-        return (AgentPayService) bean;
+        return (AgentPayService<T>) bean;
       } else {
         return null;
       }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt
index 0174c65..553f157 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt
@@ -3,6 +3,7 @@
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.api.bean.BaseResp
 import com.supwisdom.dlpay.api.domain.TTransactionMain
 import com.supwisdom.dlpay.api.service.ConsumePayService
@@ -11,51 +12,47 @@
 import org.springframework.stereotype.Component
 
 interface AlipayService {
-    fun doQrcodepay(transaction: TTransactionMain): AgentResponse
+    fun doQrcodepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
 
-    fun doPrepay(transaction: TTransactionMain): AgentResponse
+    fun doPrepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
 
-    fun doRefund(transaction: TTransactionMain): AgentResponse
+    fun doRefund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
 
-    fun doQuery(transaction: TTransactionMain): AgentResponse
+    fun doQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
 
-    fun doNotify(param: Map<String, String>): AgentResponse
+    fun doNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans>
 
-    /**
-     * 下载对账单
-     * */
-    fun downloadBill(shopacc:String,accdate:String): BaseResp
 }
 
 @Component("alipayAgent")
 class AlipayAgentService(val consumePayService: ConsumePayService,
-                         val aipayService: AlipayService) : AgentPayService {
+                         val aipayService: AlipayService) : AgentPayService<QrcodePayTrans> {
 
-    override fun auth(shopaccno: String?, billno: String?): AgentResponse {
+    override fun auth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans> {
         if (consumePayService.checkShopPaytype(shopaccno!!, TradeDict.PAYTYPE_ALIPAY, true)) {
             //TODO 支付宝实名认证逻辑
         }
-        return AgentResponse().apply {
+        return AgentResponse<QrcodePayTrans>().apply {
             this.code = AgentCode.NOT_SUPPORT
         }
     }
 
-    override fun pay(transaction: TTransactionMain): AgentResponse {
+    override fun pay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
         return when (transaction.transCode) {
             TradeCode.TRANSCODE_QRCODE -> aipayService.doQrcodepay(transaction)
             else -> aipayService.doPrepay(transaction)
         }
     }
 
-    override fun cancel(transaction: TTransactionMain): AgentResponse {
+    override fun cancel(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
         return refund(transaction)
     }
 
-    override fun refund(transaction: TTransactionMain): AgentResponse {
+    override fun refund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
         return aipayService.doRefund(transaction)
     }
 
-    override fun query(transaction: TTransactionMain): AgentResponse {
+    override fun query(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
         return aipayService.doQuery(transaction)
     }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/balance_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/balance_service.kt
index 6852f9b..3966cff 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/balance_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/balance_service.kt
@@ -3,37 +3,38 @@
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.api.domain.TTransactionMain
 import org.springframework.stereotype.Component
 
 @Component("balanceAgent")
-class BalanceAgentService : AgentPayService {
-    private val responseCode = AgentResponse().apply {
+class BalanceAgentService : AgentPayService<String> {
+    private val responseCode = AgentResponse<String>().apply {
         code = AgentCode.SUCCESS
         agentCode = "0"
         agentMsg = "成功"
         agentRefno = ""
     }
 
-    override fun auth(shopaccno: String?, billno: String?): AgentResponse {
-        return AgentResponse().apply {
+    override fun auth(shopaccno: String?, billno: String?): AgentResponse<String> {
+        return AgentResponse<String>().apply {
             this.code = AgentCode.NOT_SUPPORT
         }
     }
 
-    override fun pay(transaction: TTransactionMain): AgentResponse {
+    override fun pay(transaction: TTransactionMain): AgentResponse<String> {
         return responseCode
     }
 
-    override fun cancel(transaction: TTransactionMain): AgentResponse {
+    override fun cancel(transaction: TTransactionMain): AgentResponse<String> {
         return responseCode
     }
 
-    override fun refund(transaction: TTransactionMain): AgentResponse {
+    override fun refund(transaction: TTransactionMain): AgentResponse<String> {
         return responseCode
     }
 
-    override fun query(transaction: TTransactionMain): AgentResponse {
+    override fun query(transaction: TTransactionMain): AgentResponse<String> {
         return responseCode
     }
 }
\ No newline at end of file
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 5136d37..586d819 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
@@ -7,6 +7,7 @@
 import com.supwisdom.dlpay.agent.citizencard.DlpayResp
 import com.supwisdom.dlpay.agent.citizencard.YnrccRespCode
 import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.api.domain.TTransactionMain
 import com.supwisdom.dlpay.framework.util.MoneyUtil
 import org.springframework.beans.factory.annotation.Autowired
@@ -28,7 +29,7 @@
 }
 
 @Component("citizenCardAgent")
-class CitizenCardPayAgent : AgentPayService {
+class CitizenCardPayAgent : AgentPayService<DtlStatus> {
     @Autowired
     private lateinit var citizencardPayService: CitizencardPayService
 
@@ -43,17 +44,17 @@
                 YnrccRespCode(code, msg ?: "未知"))
     }
 
-    override fun auth(shopaccno: String?, billno: String?): AgentResponse {
-        return AgentResponse().apply {
+    override fun auth(shopaccno: String?, billno: String?): AgentResponse<DtlStatus> {
+        return AgentResponse<DtlStatus>().apply {
             this.code = AgentCode.NOT_SUPPORT
         }
     }
 
-    override fun pay(transaction: TTransactionMain): AgentResponse {
+    override fun pay(transaction: TTransactionMain): AgentResponse<DtlStatus> {
         val resp = citizencardPayService.cardPay(transaction.shopDtl.shopaccno, transaction.personDtl.userid, transaction.accdate,
                 MoneyUtil.YuanToFen(transaction.personDtl.amount), transaction.refno)
 
-        return AgentResponse().also {
+        return AgentResponse<DtlStatus>().also {
             val code = agentCode(resp.code, resp.message)
             it.code = code.first
             it.agentCode = code.second.code
@@ -62,15 +63,15 @@
         }
     }
 
-    override fun cancel(transaction: TTransactionMain): AgentResponse {
+    override fun cancel(transaction: TTransactionMain): AgentResponse<DtlStatus> {
         return refund(transaction)
     }
 
-    override fun refund(transaction: TTransactionMain): AgentResponse {
+    override fun refund(transaction: TTransactionMain): AgentResponse<DtlStatus> {
         val resp = citizencardPayService.cardPayRefund(transaction.refno, transaction.accdate,
                 transaction.reverseRefno, MoneyUtil.YuanToFen(transaction.personDtl.amount))
 
-        return AgentResponse().also {
+        return AgentResponse<DtlStatus>().also {
             val code = agentCode(resp.code, resp.message)
             it.code = code.first
             it.agentCode = code.second.code
@@ -79,10 +80,10 @@
         }
     }
 
-    override fun query(transaction: TTransactionMain): AgentResponse {
+    override fun query(transaction: TTransactionMain): AgentResponse<DtlStatus> {
         val resp = citizencardPayService.queryResult(transaction.refno)
 
-        return AgentResponse().also {
+        return AgentResponse<DtlStatus>().also {
             val code = agentCode(resp.code, resp.message)
             it.code = code.first
             it.agentCode = code.second.code
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
index 2f075ef..0bcb1bf 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
@@ -1,31 +1,31 @@
 package com.supwisdom.dlpay.agent.service.impl
 
+import com.alipay.api.AlipayApiException
+import com.alipay.api.DefaultAlipayClient
+import com.alipay.api.domain.AlipayTradePayModel
+import com.alipay.api.domain.AlipayTradeQueryModel
+import com.alipay.api.domain.AlipayTradeRefundModel
+import com.alipay.api.internal.util.AlipaySignature
+import com.alipay.api.request.AlipayTradeAppPayRequest
+import com.alipay.api.request.AlipayTradePayRequest
+import com.alipay.api.request.AlipayTradeQueryRequest
+import com.supwisdom.dlpay.RestTemplateConfig
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.DtlStatus
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
+import com.supwisdom.dlpay.agent.service.AgentServiceProxy
 import com.supwisdom.dlpay.agent.service.AlipayService
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import com.supwisdom.dlpay.api.service.ConsumePayService
 import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionServiceProxy
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeCode
 import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.util.PaytypeUtil
 import mu.KotlinLogging
 import org.springframework.stereotype.Service
-import com.alipay.api.request.AlipayTradePayRequest
-import com.alipay.api.DefaultAlipayClient
-import com.alipay.api.domain.AlipayTradePayModel
-import com.supwisdom.dlpay.agent.service.AgentServiceProxy
-import com.supwisdom.dlpay.api.domain.TTransactionMain
-import com.alipay.api.AlipayApiException
-import com.alipay.api.internal.util.AlipaySignature
-import com.alipay.api.request.AlipayTradeAppPayRequest
-import com.supwisdom.dlpay.api.service.ConsumePayService
-import com.supwisdom.dlpay.api.service.TransactionServiceProxy
-import com.alipay.api.request.AlipayTradeQueryRequest
-import com.supwisdom.dlpay.agent.DtlStatus
-import com.alipay.api.domain.AlipayTradeQueryModel
-import com.alipay.api.domain.AlipayTradeRefundModel
-import com.supwisdom.dlpay.RestTemplateConfig
-import com.supwisdom.dlpay.api.bean.BaseResp
-import com.supwisdom.dlpay.framework.util.StringUtil
-import com.supwisdom.dlpay.framework.util.TradeCode
 
 
 @Service
@@ -37,7 +37,7 @@
     : AlipayService {
     val logger = KotlinLogging.logger { }
 
-    fun checkCfg(config: Map<String, String?>, resp: AgentResponse): Boolean {
+    fun checkCfg(config: Map<String, String?>, resp: AgentResponse<QrcodePayTrans>): Boolean {
         if (config[PaytypeUtil.CFG_ALIPAY_APPID].isNullOrEmpty()
                 || config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY].isNullOrEmpty()
                 || config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY].isNullOrEmpty()) {
@@ -72,13 +72,13 @@
                 }.build()
     }
 
-    override fun doQrcodepay(transaction: TTransactionMain): AgentResponse {
+    override fun doQrcodepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
         val qrcodePayTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
         val config = sourceTypeService.getConsumePaytypeConfig(
                 TradeDict.PAYTYPE_ALIPAY,
                 transaction.shopDtl.shopaccno,
                 qrcodePayTrans.isAnonymous, false)
-        val agentResponse = AgentResponse()
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         if (checkCfg(config, agentResponse)) {
             val request = AlipayTradePayRequest()
             request.bizModel = AlipayTradePayModel().apply {
@@ -125,11 +125,11 @@
         return agentResponse
     }
 
-    override fun doPrepay(transaction: TTransactionMain): AgentResponse {
+    override fun doPrepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
         val config = sourceTypeService.getConsumePaytypeConfig(
                 TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno,
                 false, false)
-        val agentResponse = AgentResponse()
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         if (checkCfg(config, agentResponse)) {
             if (config[PaytypeUtil.CFG_ALIPAY_NOTIFY].isNullOrEmpty()) {
                 agentResponse.code = AgentCode.CONFIG_ERROR
@@ -182,8 +182,8 @@
         return agentResponse
     }
 
-    override fun doRefund(transaction: TTransactionMain): AgentResponse {
-        val agentResponse = AgentResponse()
+    override fun doRefund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         val config = sourceTypeService.getConsumePaytypeConfig(
                 TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno,
                 false, false)
@@ -209,8 +209,8 @@
         return agentResponse
     }
 
-    override fun doQuery(transaction: TTransactionMain): AgentResponse {
-        val agentResponse = AgentResponse()
+    override fun doQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         val config = sourceTypeService.getConsumePaytypeConfig(
                 TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
         if (checkCfg(config, agentResponse)) {
@@ -239,9 +239,9 @@
         return agentResponse
     }
 
-    override fun doNotify(param: Map<String, String>): AgentResponse {
+    override fun doNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans> {
         val refno = param["out_trade_no"]
-        val agentResponse = AgentResponse()
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         if (refno.isNullOrEmpty()) {
             agentResponse.code = AgentCode.FAIL
             return agentResponse
@@ -281,8 +281,4 @@
             }
         }
     }
-
-    override fun downloadBill(shopacc: String, accdate: String): BaseResp {
-        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
-    }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
index 1e0f5f2..61fa734 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
@@ -3,6 +3,7 @@
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentResponse
 import com.supwisdom.dlpay.agent.DtlStatus
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.agent.service.AgentServiceProxy
 import com.supwisdom.dlpay.agent.service.WechatService
 import com.supwisdom.dlpay.api.bean.BaseResp
@@ -33,7 +34,7 @@
 
     val logger = KotlinLogging.logger { }
 
-    fun checkCfg(config: Map<String, String?>, resp: AgentResponse): Boolean {
+    fun checkCfg(config: Map<String, String?>, resp: AgentResponse<QrcodePayTrans>): Boolean {
         if (config[PaytypeUtil.CFG_WECHAT_APPID].isNullOrEmpty()
                 || config[PaytypeUtil.CFG_WECHAT_MECHKEY].isNullOrEmpty()
                 || config[PaytypeUtil.CFG_WECHAT_MECHID].isNullOrEmpty()) {
@@ -46,14 +47,15 @@
         return true
     }
 
-    override fun doAuth(shopaccno: String?, billno: String?): AgentResponse {
-        var qrcodeTrans = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(shopaccno, billno)
-        var agentResponse = AgentResponse()
+    override fun doAuth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans> {
+        val qrcodeTrans = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(shopaccno, billno)
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         if (qrcodeTrans == null) {
             agentResponse.code = AgentCode.REFNO_NOT_EXISTS
             agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
             return agentResponse
         }
+        agentResponse.payload = qrcodeTrans
         val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, shopaccno, qrcodeTrans.isAnonymous, false)
         if (checkCfg(config, agentResponse)) {
             val bean = WechatReqResp().apply {
@@ -63,21 +65,21 @@
                 this.key = config[PaytypeUtil.CFG_WECHAT_MECHKEY]
             }
             bean.generalCheckSign()
-            var xml = bean.generalCheckXML()
+            val xml = bean.generalCheckXML()
             restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
-            var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_OAUTHCODE, xml, String::class.java)
-            var eleMap = XmlUtils.parseXml(res.body)
-            var retcode = eleMap["return_code"]
-            var resultCode = eleMap["result_code"]
-            var openid = eleMap["openid"]
+            val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_OAUTHCODE, xml, String::class.java)
+            val eleMap = XmlUtils.parseXml(res.body)
+            val retcode = eleMap["return_code"]
+            val resultCode = eleMap["result_code"]
+            val openid = eleMap["openid"]
             if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
                     && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !openid.isNullOrEmpty()) {
                 qrcodeTrans.agentUserId = openid
-                var ip = personIdentityDao.getByThirdUid(openid)
+                val ip = personIdentityDao.getByThirdUid(openid)
                 if (ip != null) {
                     qrcodeTrans.userid = ip.person.userid
                 }
-                agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+                agentResponse.payload = agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
                 agentResponse.code = AgentCode.SUCCESS
                 agentResponse.agentCode = retcode
                 agentResponse.agentMsg = eleMap["return_msg"]
@@ -91,14 +93,15 @@
         return agentResponse
     }
 
-    override fun doQrcodepay(transaction: TTransactionMain): AgentResponse {
-        var qrcodeTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
-        var agentResponse = AgentResponse()
+    override fun doQrcodepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+        val qrcodeTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         if (qrcodeTrans == null) {
             agentResponse.code = AgentCode.REFNO_NOT_EXISTS
             agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
             return agentResponse
         }
+        agentResponse.payload = qrcodeTrans
         val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, qrcodeTrans.isAnonymous, false)
         if (checkCfg(config, agentResponse)) {
             val bean = WechatReqResp().apply {
@@ -113,14 +116,14 @@
             }
 
             bean.generalPaySign()
-            var xml = bean.generaPayXML()
+            val xml = bean.generaPayXML()
             restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
-            var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QRCODEPAY, xml, String::class.java)
-            var eleMap = XmlUtils.parseXml(res.body)
-            var retcode = eleMap["return_code"]
-            var resultCode = eleMap["result_code"]
-            var openid = eleMap["openid"]
-            var errorCode = eleMap["err_code"]
+            val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QRCODEPAY, xml, String::class.java)
+            val eleMap = XmlUtils.parseXml(res.body)
+            val retcode = eleMap["return_code"]
+            val resultCode = eleMap["result_code"]
+            val openid = eleMap["openid"]
+            val errorCode = eleMap["err_code"]
             if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
                     && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !openid.isNullOrEmpty()) {
                 agentResponse.code = AgentCode.SUCCESS
@@ -128,32 +131,33 @@
                 agentResponse.dtlStatus = DtlStatus.SUCCESS
                 agentResponse.agentMsg = eleMap["return_msg"]
                 agentResponse.agentRefno = eleMap["transaction_id"]
-                qrcodeTrans.agentRefno =  eleMap["transaction_id"]
-                agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
-            } else if("SYSTEMERROR"==errorCode||"BANKERROR"==errorCode||"USERPAYING"==errorCode){
-                logger.error { "code=${errorCode},des=${eleMap["err_code_des"]}" }
+                qrcodeTrans.agentRefno = eleMap["transaction_id"]
+                agentResponse.payload = agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+            } else if ("SYSTEMERROR" == errorCode || "BANKERROR" == errorCode || "USERPAYING" == errorCode) {
+                logger.error { "code=$errorCode,des=${eleMap["err_code_des"]}" }
                 agentResponse.code = AgentCode.REQUIRE_QUERY
                 agentResponse.agentCode = eleMap["err_code"]
                 agentResponse.agentMsg = eleMap["err_code_des"]
                 agentResponse.agentRefno = eleMap["transaction_id"]
-                qrcodeTrans.agentRefno =  eleMap["transaction_id"]
-                agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
-            }else{
+                qrcodeTrans.agentRefno = eleMap["transaction_id"]
+                agentResponse.payload = agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+            } else {
                 agentResponse.code = AgentCode.FAIL
                 agentResponse.agentCode = eleMap["err_code"]
                 agentResponse.agentMsg = eleMap["err_code_des"]
-                logger.error { "code=${errorCode},des=${eleMap["err_code_des"]}" }
+                logger.error { "code=$errorCode,des=${eleMap["err_code_des"]}" }
             }
         }
         return agentResponse
     }
 
-    override fun doPrepay(transaction: TTransactionMain): AgentResponse {
-        var agentResponse = AgentResponse()
+    override fun doPrepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
         if (checkCfg(config, agentResponse)) {
             //H5 支付
             val trans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
+            agentResponse.payload = trans
             val bean = WechatReqResp().apply {
                 this.appid = config[PaytypeUtil.CFG_WECHAT_APPID]
                 this.mch_id = config[PaytypeUtil.CFG_WECHAT_MECHID]
@@ -162,35 +166,37 @@
                 this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
                 this.spbill_create_ip = trans.spip
                 this.body = transaction.shopDtl.payInfo
-                this.notify_url = StringUtil.urlAppend(config[PaytypeUtil.CFG_WECHAT_NOTIFY],transaction.tenantid)
-                this.trade_type = when(transaction.transCode){TradeCode.TRANSCODE_H5PAY->"MWEB"
-                    TradeCode.TRANSCODE_JSPAY->"JSAPI"
-                    TradeCode.TRANSCODE_APPPAY->"APP"
-                    else->"JSAPI"}
+                this.notify_url = StringUtil.urlAppend(config[PaytypeUtil.CFG_WECHAT_NOTIFY], transaction.tenantid)
+                this.trade_type = when (transaction.transCode) {
+                    TradeCode.TRANSCODE_H5PAY -> "MWEB"
+                    TradeCode.TRANSCODE_JSPAY -> "JSAPI"
+                    TradeCode.TRANSCODE_APPPAY -> "APP"
+                    else -> "JSAPI"
+                }
                 this.scene_info = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"" + config[PaytypeUtil.CFG_WECHAT_NOTIFY] + "\",\"wap_name\": \"微信支付\"}}"
             }
-            if( transaction.transCode==TradeCode.TRANSCODE_JSPAY || transaction.transCode==TradeCode.TRANSCODE_SMPAY){
-                var p = personIdentityDao.getBySourcetype(transaction.personDtl.userid,transaction.sourceType)
-                if(p!=null){
+            if (transaction.transCode == TradeCode.TRANSCODE_JSPAY || transaction.transCode == TradeCode.TRANSCODE_SMPAY) {
+                val p = personIdentityDao.getBySourcetype(transaction.personDtl.userid, transaction.sourceType)
+                if (p != null) {
                     bean.openid = p.thirdUid
                 }
             }
             bean.generaSign()
             val xml = bean.generaXML()
             restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
-            var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_UNIONPAY, xml, String::class.java)
-            var eleMap = XmlUtils.parseXml(res.body)
-            var retcode = eleMap["return_code"]
-            var resultCode = eleMap["result_code"]
+            val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_UNIONPAY, xml, String::class.java)
+            val eleMap = XmlUtils.parseXml(res.body)
+            val retcode = eleMap["return_code"]
+            val resultCode = eleMap["result_code"]
 
             if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
-                    && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode  ) {
+                    && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
                 agentResponse.code = AgentCode.REQUIRE_QUERY
-                agentResponse.agentCode =resultCode
+                agentResponse.agentCode = resultCode
                 agentResponse.agentMsg = eleMap["return_msg"]
                 when {
-                    transaction.transCode==TradeCode.TRANSCODE_H5PAY -> agentResponse.agentBody = eleMap["mweb_url"]
-                    transaction.transCode==TradeCode.TRANSCODE_APPPAY -> {
+                    transaction.transCode == TradeCode.TRANSCODE_H5PAY -> agentResponse.agentBody = eleMap["mweb_url"]
+                    transaction.transCode == TradeCode.TRANSCODE_APPPAY -> {
                         bean.prepay_id = eleMap["prepay_id"]
                         bean.timestamp = DateUtil.getNowSecond().toString()
                         bean.nonce_str = getRandomString(30)
@@ -198,7 +204,7 @@
                         bean.generaAPPSign()
                         agentResponse.agentBody = bean.generaAPPParamters()
                     }
-                    transaction.transCode==TradeCode.TRANSCODE_JSPAY || transaction.transCode==TradeCode.TRANSCODE_SMPAY -> {
+                    transaction.transCode == TradeCode.TRANSCODE_JSPAY || transaction.transCode == TradeCode.TRANSCODE_SMPAY -> {
                         bean.prepay_id = eleMap["prepay_id"]
                         bean.timestamp = DateUtil.getNowSecond().toString()
                         bean.nonce_str = getRandomString(30)
@@ -217,8 +223,8 @@
         return agentResponse
     }
 
-    override fun doQuery(transaction: TTransactionMain): AgentResponse {
-        var agentResponse = AgentResponse()
+    override fun doQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
         if (checkCfg(config, agentResponse)) {
             //H5 支付
@@ -231,10 +237,10 @@
             bean.generalQuerySign()
             val xml = bean.generalQueryXML()
             restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
-            var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QUERY, xml, String::class.java)
-            var eleMap = XmlUtils.parseXml(res.body)
-            var retcode = eleMap["return_code"]
-            var resultCode = eleMap["result_code"]
+            val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QUERY, xml, String::class.java)
+            val eleMap = XmlUtils.parseXml(res.body)
+            val retcode = eleMap["return_code"]
+            val resultCode = eleMap["result_code"]
             val tradeState = eleMap["trade_state"]
             if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
                     && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
@@ -257,8 +263,8 @@
         return agentResponse
     }
 
-    override fun doRefund(transaction: TTransactionMain): AgentResponse {
-        var agentResponse = AgentResponse()
+    override fun doRefund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+        val agentResponse = AgentResponse<QrcodePayTrans>()
         val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
         if (checkCfg(config, agentResponse)) {
             val bean = WechatReqResp().apply {
@@ -269,18 +275,18 @@
                 this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
                 this.refund_fee = MoneyUtil.YuanToFen(transaction.refundAmount)
                 this.out_refund_no = transaction.reverseRefno
-                this.notify_url = StringUtil.urlAppend(config[PaytypeUtil.CFG_WECHAT_NOTIFY],transaction.tenantid)
+                this.notify_url = StringUtil.urlAppend(config[PaytypeUtil.CFG_WECHAT_NOTIFY], transaction.tenantid)
             }
             bean.generaReverseSign()
             val xml = bean.generaReverseXML()
-            var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_REFUND, xml, String::class.java)
-            var eleMap = XmlUtils.parseXml(res.body)
-            var retcode = eleMap["return_code"]
-            var resultCode = eleMap["result_code"]
+            val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_REFUND, xml, String::class.java)
+            val eleMap = XmlUtils.parseXml(res.body)
+            val retcode = eleMap["return_code"]
+            val resultCode = eleMap["result_code"]
             if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
-                    && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode ) {
+                    && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
                 agentResponse.code = AgentCode.REQUIRE_QUERY
-                agentResponse.agentCode =resultCode
+                agentResponse.agentCode = resultCode
                 agentResponse.agentRefno = eleMap["refund_id"]
                 agentResponse.agentMsg = eleMap["return_msg"]
             } else {
@@ -293,9 +299,9 @@
         return agentResponse
     }
 
-    override fun doNotify(param: Map<String, String>): AgentResponse {
-        var agentResponse = AgentResponse()
-        var transaction = consumePayService.getTransactionMainDtl(param["out_trade_no"], null, null)
+    override fun doNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans> {
+        val agentResponse = AgentResponse<QrcodePayTrans>()
+        val transaction = consumePayService.getTransactionMainDtl(param["out_trade_no"], null, null)
         if (transaction == null) {
             agentResponse.code = AgentCode.REFNO_NOT_EXISTS
             agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
@@ -314,10 +320,10 @@
             agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
             agentResponse.agentMsg = "签名错误"
         }
-        var temp = StringUtil.paraFilter(param)
+        val temp = StringUtil.paraFilter(param)
         var signStr = StringUtil.createLinkString(temp)
         val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
-        var key = config[PaytypeUtil.CFG_WECHAT_MECHKEY]
+        val key = config[PaytypeUtil.CFG_WECHAT_MECHKEY]
         signStr += "&key=$key"
         val signRet = MD5.encodeByMD5(signStr)
         logger.error("*******signStr=$signStr")
@@ -332,10 +338,10 @@
         if (!returnCode.isNullOrEmpty() && "SUCCESS" == returnCode
                 && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
             val transid = param["transaction_id"]
-            if(transid.isNullOrEmpty()){
+            if (transid.isNullOrEmpty()) {
                 transactionService.success(transaction.refno)
-            }else{
-                transactionService.success(transaction.refno,transid, true)
+            } else {
+                transactionService.success(transaction.refno, transid, true)
             }
             agentResponse.code = AgentCode.SUCCESS
             agentResponse.agentCode = resultCode
@@ -348,7 +354,4 @@
         return agentResponse
     }
 
-    override fun downloadBill(shopacc:String,accdate:String): BaseResp {
-        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
-    }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
index 165c4c7..efd0c29 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
@@ -3,6 +3,7 @@
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.api.bean.BaseResp
 import com.supwisdom.dlpay.api.domain.TPersondtl
 import com.supwisdom.dlpay.api.domain.TTransactionMain
@@ -33,26 +34,26 @@
 }
 
 @Component("swyktv5Agent")
-class SWYktV5AgentService : AgentPayService {
-    override fun auth(shopaccno: String?, billno: String?): AgentResponse {
-        return AgentResponse().apply {
+class SWYktV5AgentService : AgentPayService<String> {
+    override fun auth(shopaccno: String?, billno: String?): AgentResponse<String> {
+        return AgentResponse<String>().apply {
             this.code = AgentCode.NOT_SUPPORT
         }
     }
 
-    override fun pay(transaction: TTransactionMain?): AgentResponse {
+    override fun pay(transaction: TTransactionMain?): AgentResponse<String> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 
-    override fun cancel(transaction: TTransactionMain?): AgentResponse {
+    override fun cancel(transaction: TTransactionMain?): AgentResponse<String> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 
-    override fun refund(transaction: TTransactionMain?): AgentResponse {
+    override fun refund(transaction: TTransactionMain?): AgentResponse<String> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 
-    override fun query(transaction: TTransactionMain?): AgentResponse {
+    override fun query(transaction: TTransactionMain?): AgentResponse<String> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wanxiao_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wanxiao_service.kt
index eb77875..1fd1eb7 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wanxiao_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wanxiao_service.kt
@@ -3,30 +3,31 @@
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.api.domain.TTransactionMain
 import org.springframework.stereotype.Component
 
 @Component("wanxiaoAgent")
-class WanxiaoAgentService : AgentPayService {
-    override fun auth(shopaccno: String?, billno: String?): AgentResponse {
-        return AgentResponse().apply {
+class WanxiaoAgentService : AgentPayService<QrcodePayTrans> {
+    override fun auth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans> {
+        return AgentResponse<QrcodePayTrans>().apply {
             this.code = AgentCode.NOT_SUPPORT
         }
     }
 
-    override fun pay(transaction: TTransactionMain?): AgentResponse {
+    override fun pay(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 
-    override fun cancel(transaction: TTransactionMain?): AgentResponse {
+    override fun cancel(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 
-    override fun refund(transaction: TTransactionMain?): AgentResponse {
+    override fun refund(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 
-    override fun query(transaction: TTransactionMain?): AgentResponse {
+    override fun query(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
index 7fe78de..8f08241 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
@@ -3,6 +3,7 @@
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.api.bean.BaseResp
 import com.supwisdom.dlpay.api.domain.TTransactionMain
 import com.supwisdom.dlpay.api.service.ConsumePayService
@@ -11,52 +12,48 @@
 import org.springframework.stereotype.Component
 
 interface WechatService {
-    fun doAuth(shopaccno: String?, billno: String?): AgentResponse
+    fun doAuth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans>
 
-    fun doQrcodepay(transaction: TTransactionMain): AgentResponse
+    fun doQrcodepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
 
-    fun doPrepay(transaction: TTransactionMain): AgentResponse
+    fun doPrepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
 
-    fun doQuery(transaction: TTransactionMain): AgentResponse
+    fun doQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
 
-    fun doRefund(transaction: TTransactionMain): AgentResponse
+    fun doRefund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
 
-    fun doNotify(param: Map<String, String>): AgentResponse
+    fun doNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans>
 
-    /**
-     * 下载对账单
-     * */
-    fun downloadBill(shopacc:String,accdate:String):BaseResp
 }
 
 @Component("wechatAgent")
 class WeChatPayAgentService(val consumePayService: ConsumePayService,
-                            val wechatService: WechatService) : AgentPayService {
-    override fun auth(shopaccno: String?, billno: String?): AgentResponse {
+                            val wechatService: WechatService) : AgentPayService<QrcodePayTrans> {
+    override fun auth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans> {
         if (consumePayService.checkShopPaytype(shopaccno!!, TradeDict.PAYTYPE_WECHAT, true)) {
             return wechatService.doAuth(shopaccno, billno)
         }
-        return AgentResponse().apply {
+        return AgentResponse<QrcodePayTrans>().apply {
             this.code = AgentCode.NOT_SUPPORT
         }
     }
 
-    override fun pay(transaction: TTransactionMain?): AgentResponse {
+    override fun pay(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
         return when (transaction!!.transCode) {
             TradeCode.TRANSCODE_QRCODE -> wechatService.doQrcodepay(transaction)
             else -> wechatService.doPrepay(transaction)
         }
     }
 
-    override fun cancel(transaction: TTransactionMain?): AgentResponse {
+    override fun cancel(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
         return refund(transaction)
     }
 
-    override fun refund(transaction: TTransactionMain?): AgentResponse {
+    override fun refund(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
         return wechatService.doRefund(transaction!!)
     }
 
-    override fun query(transaction: TTransactionMain?): AgentResponse {
+    override fun query(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
         return wechatService.doQuery(transaction!!)
     }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
index 65f41d8..ff9510d 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
@@ -111,7 +111,7 @@
                 return
             }
 
-            val service = ApplicationUtil.findAgentPayService(applicationContext,
+            val service = ApplicationUtil.findAgentPayService<Any>(applicationContext,
                     transaction.sourceType + "Agent")
 
             logger.info("refno=[${transaction.refno}]开始第" + (qcnt + 1) + "次查询支付结果:")
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 cfdd7ec..b62c990 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
@@ -2,6 +2,7 @@
 
 import com.supwisdom.dlpay.agent.AgentCode
 import com.supwisdom.dlpay.agent.AgentPayService
+import com.supwisdom.dlpay.agent.DtlStatus
 import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
 import com.supwisdom.dlpay.agent.service.AgentServiceProxy
 import com.supwisdom.dlpay.api.*
@@ -217,8 +218,8 @@
                 .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
     }
 
-    fun createAgentService(sourceType: String): AgentPayService {
-        return ApplicationUtil.findAgentPayService(applicationContext, sourceType + "Agent")
+    fun <T> createAgentService(sourceType: String): AgentPayService<T> {
+        return ApplicationUtil.findAgentPayService<T>(applicationContext, sourceType + "Agent")
                 ?: throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
                         "支付类型<$sourceType>未定义")
     }
@@ -231,7 +232,7 @@
     @PostMapping("/citizencard/payfinish")
     fun citizencardPayinit(@Valid @RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
         val dtl = transactionService.wip(param.refno)
-        val service = createAgentService(TradeDict.PAYTYPE_CITIZEN_CARD)
+        val service = createAgentService<DtlStatus>(TradeDict.PAYTYPE_CITIZEN_CARD)
         val resp = service.pay(dtl)
         when (resp.code) {
             AgentCode.SUCCESS ->
@@ -287,7 +288,7 @@
 
             val cancelTrans = builder.cancelInit(mainDtl.refno, transactionService)
             transactionService.wip(cancelTrans.refno)
-            val service = createAgentService(mainDtl.sourceType)
+            val service = createAgentService<DtlStatus>(mainDtl.sourceType)
             val resp = service.cancel(cancelTrans)
             when (resp.code) {
                 AgentCode.SUCCESS -> {
@@ -341,7 +342,7 @@
             }
             val refundTrans = builder.refundInit(mainDtl.refno, param.refundAmount / 100.0, transactionService)
             transactionService.wip(refundTrans.refno)
-            val service = createAgentService(mainDtl.sourceType)
+            val service = createAgentService<Any>(mainDtl.sourceType)
             val resp = service.refund(refundTrans)
 
             when (resp.code) {
@@ -472,7 +473,7 @@
                     .fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR,
                             "支付方式<${qrcode.sourceType}>未配置科目号"))
         }
-        var systime = systemUtilService.sysdatetime
+        val systime = systemUtilService.sysdatetime
         // 2. 记录 qrcode 交易明细表
         val qrcodeTrans = agentServiceProxy.qrcodePayTransSaveOrUpdate(
                 QrcodePayTrans().apply {
@@ -487,17 +488,19 @@
                 })
 
         // 3. 查询用户身份
-        val service = createAgentService(qrcode.sourceType)
+        val service = createAgentService<QrcodePayTrans>(qrcode.sourceType)
         val agentResp = service.auth(qrcodeTrans.agentMerchId, qrcodeTrans.billno)
         // 4. 重新读取 qrcode 交易明细表,以获取 service.auth 查询后的结果数据
-        val qrcodeTransResp = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(qrcodeTrans.agentMerchId,
-                qrcodeTrans.billno)
+        // 修改, 通过返回值来判断
+//        val qrcodeTransResp = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(qrcodeTrans.agentMerchId,
+//                qrcodeTrans.billno)
         apiResp.also {
             it.sourceType = sourceType.sourceType
             it.paydesc = qrcodeSummary(sourceType)
         }
         return when (agentResp.code) {
             AgentCode.SUCCESS -> {
+                val qrcodeTransResp = agentResp.payload
                 if (!sourceType.anonymousEnable && qrcodeTransResp.isAnonymous) {
                     ResponseEntity.ok(ResponseBodyBuilder.create()
                             .fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR,
@@ -511,6 +514,7 @@
                 }
             }
             AgentCode.NOT_SUPPORT -> {
+                val qrcodeTransResp = agentResp.payload
                 if (!sourceType.anonymousEnable) {
                     ResponseEntity.ok(ResponseBodyBuilder.create()
                             .fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR,
@@ -614,7 +618,7 @@
 
         //3. 调用第三方支付
         transactionService.wip(transaction.refno)
-        val service = createAgentService(qrcodeTrans.sourceType)
+        val service = createAgentService<QrcodePayTrans>(qrcodeTrans.sourceType)
         apiResponse.apply {
             refno = transaction.refno
             accdate = transaction.accdate
@@ -650,7 +654,7 @@
      * ============================================================================
      * */
     @PostMapping("/thirdpay/init")
-    fun thirdpayInit(@RequestBody param: ThirdPayinitParam,request:HttpServletRequest): ResponseEntity<Any> {
+    fun thirdpayInit(@RequestBody param: ThirdPayinitParam, request: HttpServletRequest): ResponseEntity<Any> {
         val dtlType = consumePayService.getDtltypeDictionary(param.dtltype, Dictionary.DTLTYPES)
         val sourceType = sourceTypeService.getBySourceType(param.sourceType)
                 ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -664,17 +668,25 @@
             var transcode = 0
             var des = ""
             when (param.subType) {
-                TradeDict.PAYTYPE_APP ->{transcode = TradeCode.TRANSCODE_APPPAY;des="APP内支付"}
-                TradeDict.PAYTYPE_JS -> {transcode = TradeCode.TRANSCODE_JSPAY;des="JS支付"}
-                TradeDict.PAYTYPE_H5 -> {transcode = TradeCode.TRANSCODE_H5PAY;des="H5支付"}
-                TradeDict.PAYTYPE_SM -> {transcode = TradeCode.TRANSCODE_SMPAY;des="小程序支付"}
+                TradeDict.PAYTYPE_APP -> {
+                    transcode = TradeCode.TRANSCODE_APPPAY;des = "APP内支付"
+                }
+                TradeDict.PAYTYPE_JS -> {
+                    transcode = TradeCode.TRANSCODE_JSPAY;des = "JS支付"
+                }
+                TradeDict.PAYTYPE_H5 -> {
+                    transcode = TradeCode.TRANSCODE_H5PAY;des = "H5支付"
+                }
+                TradeDict.PAYTYPE_SM -> {
+                    transcode = TradeCode.TRANSCODE_SMPAY;des = "小程序支付"
+                }
             }
             val transaction = TransactionBuilder().apply {
                 setTransInfo(param.transdate, param.transtime, transcode,
                         sourceType.sourceType)
                 setOutTransInfo(shopacc.shopaccno, param.billno)
                 operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
-                payinfo=sourceType.paydesc+des
+                payinfo = sourceType.paydesc + des
 
             }.person(account).apply {
                 setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
@@ -692,8 +704,8 @@
                         }
                     }.init(transactionService)
 
-            var systime = systemUtilService.sysdatetime
-            if(param.spip.isNullOrEmpty()){
+            val systime = systemUtilService.sysdatetime
+            if (param.spip.isNullOrEmpty()) {
                 param.spip = request.remoteAddr
             }
             // 2. 记录 qrcode 交易明细表
@@ -735,7 +747,7 @@
         } else if (dtl.transCode == TradeCode.TRANSCODE_WECHAT) {
             type = TradeDict.PAYTYPE_WECHAT
         }
-        val service = createAgentService(type)
+        val service = createAgentService<QrcodePayTrans>(type)
         val resp = service.pay(dtl)
         when (resp.code) {
             AgentCode.SUCCESS ->
@@ -769,16 +781,16 @@
      * */
     @PostMapping("/qrcodequery")
     fun qrcodeQuery(@RequestBody param: DoorQRCodeParam): ResponseEntity<Any> {
-        var token = redisTemplate.opsForValue().get(param.qrcode)
-        if(token.isNullOrEmpty()){
+        val token = redisTemplate.opsForValue().get(param.qrcode)
+        if (token.isNullOrEmpty()) {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(1, "二维码不存在或已失效"))
         }
         val ret = qrCodeService.decodeCode(token)
-        return if(ret.retcode==0){
+        return if (ret.retcode == 0) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
                     .success(ret, "成功"))
-        }else{
+        } else {
             ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(ret.retcode, ret.retmsg))
         }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt
index 5e72e70..2bee46c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt
@@ -37,7 +37,9 @@
         return TSourceTypeCheckStatus().also {
             it.sourceType = sourceType.sourceType
             it.tenantId = sourceType.tenantid
+            // 没有对账文件状态时创建一条以当前系统记账日期为起始时间的对账明细
             it.startAccdate = systemUtilService.accdate
+            it.checkAccdate = it.startAccdate
             it.forceRecheck = false
             it.checkFileDate = it.startAccdate
             it.checkFileOk = false
@@ -61,10 +63,11 @@
             return if (interval >= sourcetype.tplusN) {
                 status.checkAccdate = DateUtil.getNewDay(status.checkAccdate, 1)
                 status.checkStatus = false
-                status.checkFileOk = false
                 status.checkFileDate = DateUtil.getNewDay(status.checkFileDate, 1)
+                status.checkFileOk = false
                 sourceTypeService.saveOrUpdateSourceTypeCheckStatus(status)
             } else {
+                // 未到对账时间,跳过
                 null
             }
         }
@@ -88,18 +91,18 @@
                 sourceTypeCheckExecutor.reconciliation(it)
             } else {
                 // 开始下载对账文件
-                sourceTypeCheckExecutor.checkSourceType(it)
+                sourceTypeCheckExecutor.checkAndDownloadChkfile(it)
             }
         }.toMutableList()
 
+        val finishResult: MutableList<Future<SourceTypeCheckExecutor.ExecutorResult>> = mutableListOf()
+        val newPrcResult: MutableList<Future<SourceTypeCheckExecutor.ExecutorResult>> = mutableListOf()
         while (checkProcessResult.isNotEmpty()) {
-            val finishResult: MutableList<Future<SourceTypeCheckExecutor.ExecutorResult>> = mutableListOf()
-            val newPrcResult: MutableList<Future<SourceTypeCheckExecutor.ExecutorResult>> = mutableListOf()
             checkProcessResult.forEach {
                 try {
                     val result = it.get(10, TimeUnit.SECONDS)
                     if (result.code == SourceTypeCheckExecutor.SUCCESS) {
-                        // 完成对账问价下载 但 还未对账
+                        // 完成对账文件下载 但 还未对账
                         if (result.status.checkFileOk && !result.status.checkStatus) {
                             newPrcResult.add(sourceTypeCheckExecutor.reconciliation(result.status))
                         } else if (!result.status.checkFileOk) {
@@ -113,6 +116,8 @@
                                         "date <${result.status.checkAccdate}> 对账成功"
                             }
                         }
+                    } else if (result.code == SourceTypeCheckExecutor.WAIT) {
+                        newPrcResult.add(sourceTypeCheckExecutor.checkAndDownloadChkfile(result.status))
                     } else {
                         logger.error {
                             "sourcetype <${result.status.sourceType}> 对账状任务错误, error=" +
@@ -127,6 +132,7 @@
             checkProcessResult.removeIf { finishResult.contains(it) }
             finishResult.clear()
             checkProcessResult.addAll(newPrcResult)
+            newPrcResult.clear()
         }
     }
 }
@@ -167,7 +173,7 @@
     }
 
     @Async("sourcetypeCheckTaskExecutor")
-    fun checkSourceType(checkStatus: TSourceTypeCheckStatus): Future<ExecutorResult> {
+    fun checkAndDownloadChkfile(checkStatus: TSourceTypeCheckStatus): Future<ExecutorResult> {
         // 2. 根据对账日期下载对账文件
         val result = getProvider(checkStatus.sourceType)?.let { provider ->
             val acResp = provider.acquireCheckFile(checkStatus.checkFileDate)
@@ -184,8 +190,10 @@
                 } else {
                     ExecutorResult(checkStatus, FAIL, "下载失败,未能查到对账文件")
                 }
-            } else {
+            } else if (acResp.code == AgentCode.SUCCESS) {
                 downloadFile(provider, checkStatus)
+            } else {
+                ExecutorResult(checkStatus, FAIL, acResp.agentMsg)
             }
         } ?: ExecutorResult(checkStatus, FAIL, "未定义 CheckFileProvider")
         return AsyncResult(result)
@@ -194,6 +202,7 @@
     @Async("sourcetypeCheckTaskExecutor")
     fun reconciliation(checkStatus: TSourceTypeCheckStatus): Future<ExecutorResult> {
         // 3. 完成对账
-        return AsyncResult(ExecutorResult(checkStatus, SUCCESS, "成功"))
+        TODO("实现对账逻辑")
+//        return AsyncResult(ExecutorResult(checkStatus, SUCCESS, "成功"))
     }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
index 35136c5..1d8e2fc 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
@@ -101,7 +101,7 @@
             return
         }
 
-        val service = ApplicationUtil.findAgentPayService(applicationContext, dtl.sourceType + "Agent")
+        val service = ApplicationUtil.findAgentPayService<Any>(applicationContext, dtl.sourceType + "Agent")
         val resp = service.query(dtl)
         when (resp.code) {
             AgentCode.SUCCESS -> {