调农商行前置测通
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/DlpayResp.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/DlpayResp.java
index bc9510a..4e90b51 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/DlpayResp.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/DlpayResp.java
@@ -1,9 +1,5 @@
 package com.supwisdom.dlpay.agent.citizencard;
 
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-@XmlRootElement(name = "root")
 public class DlpayResp {
   private String code;
   private String message;
@@ -17,7 +13,6 @@
   private String trxdate; //银行记账日期
   private Integer amount; //查询时返回流水金额
 
-  @XmlElement(name = "CODE")
   public String getCode() {
     return code;
   }
@@ -26,7 +21,6 @@
     this.code = code;
   }
 
-  @XmlElement(name = "MESSAGE")
   public String getMessage() {
     return message;
   }
@@ -35,7 +29,6 @@
     this.message = message;
   }
 
-  @XmlElement(name = "TRANSDATE")
   public String getTransdate() {
     return transdate;
   }
@@ -44,7 +37,6 @@
     this.transdate = transdate;
   }
 
-  @XmlElement(name = "TRANSTIME")
   public String getTranstime() {
     return transtime;
   }
@@ -53,7 +45,6 @@
     this.transtime = transtime;
   }
 
-  @XmlElement(name = "BANKJOURNO")
   public String getBankjourno() {
     return bankjourno;
   }
@@ -62,7 +53,6 @@
     this.bankjourno = bankjourno;
   }
 
-  @XmlElement(name = "SINSTATUS")
   public String getSinstatus() {
     return sinstatus;
   }
@@ -71,7 +61,6 @@
     this.sinstatus = sinstatus;
   }
 
-  @XmlElement(name = "CAPTCHA")
   public String getCaptcha() {
     return captcha;
   }
@@ -80,7 +69,6 @@
     this.captcha = captcha;
   }
 
-  @XmlElement(name = "STATUS")
   public String getStatus() {
     return status;
   }
@@ -89,7 +77,6 @@
     this.status = status;
   }
 
-  @XmlElement(name = "FILENAME")
   public String getFilename() {
     return filename;
   }
@@ -98,7 +85,6 @@
     this.filename = filename;
   }
 
-  @XmlElement(name = "TRXDATE")
   public String getTrxdate() {
     return trxdate;
   }
@@ -107,7 +93,6 @@
     this.trxdate = trxdate;
   }
 
-  @XmlElement(name = "AMOUNT")
   public Integer getAmount() {
     return amount;
   }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccUtil.java
index 4c8a23d..db5c54b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccUtil.java
@@ -69,6 +69,7 @@
     errcode.add(Pair.of(AgentCode.SHORT_OF_BALANCE, new YnrccRespCode("0302", "余额不足")));
     errcode.add(Pair.of(AgentCode.SERVER_INTERNAL_ERROR, new YnrccRespCode("0303", "MD5校验失败")));
     errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0304", "该卡号已经解约,不允许重复解约")));
+
     errcode.add(Pair.of(AgentCode.REFNO_NOT_EXISTS, new YnrccRespCode("0401", "原始流水不存在")));
     errcode.add(Pair.of(AgentCode.FAIL, new YnrccRespCode("0402", "原始流水未成功")));
     errcode.add(Pair.of(AgentCode.FAIL, new YnrccRespCode("0403", "原始流水已退款")));
@@ -77,6 +78,15 @@
     errcode.add(Pair.of(AgentCode.SUCCESS, new YnrccRespCode("0406", "当日无交易明细")));
     errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0407", "非大理市民卡,不允许交易")));
     errcode.add(Pair.of(AgentCode.FAIL, new YnrccRespCode("0408", "同一请求流水号不允许重复提交")));
+    errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0409", "商户卡号为空")));
+    errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0410", "商户户名错")));
+    errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0411", "退款金额大于原代扣金额")));
+    errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0412", "退款金额大于剩余可退金额")));
+    errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0413", "不允许该类型的商户账户交易")));
+    errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0414", "退款时请输入原应用系统唯一流水号")));
+    errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0415", "交易金额大于单笔限额")));
+    errcode.add(Pair.of(AgentCode.SERVER_INTERNAL_ERROR, new YnrccRespCode("0416", "通用限额未配置")));
+
     errcode.add(Pair.of(AgentCode.COMMON_ERROR, new YnrccRespCode("4444", "其他错误")));
     errcode.add(Pair.of(AgentCode.REQUIRE_QUERY, new YnrccRespCode(CODE_EXCEPTION, "待查询")));
     errcode.add(Pair.of(AgentCode.SERVER_INTERNAL_ERROR, new YnrccRespCode(PARAM_CONFIG_ERROR, "{message}")));
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/service/impl/SourceTypeServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/service/impl/SourceTypeServiceImpl.java
index 545f848..14631ee 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/service/impl/SourceTypeServiceImpl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/service/impl/SourceTypeServiceImpl.java
@@ -40,7 +40,7 @@
   @Override
   @Cacheable(cacheNames = "dictionary_cache", key = "@tenantHolder.genKey('sourcetype', #sourceType)")
   public TSourceType getBySourceType(String sourceType) {
-    return sourceTypeDao.getOne(sourceType);
+    return sourceTypeDao.getBySourceType(sourceType);
   }
 
   @Override
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
index c9bf7e0..632ffde 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
@@ -41,15 +41,11 @@
 
     //sql,xss过滤
     HttpServletRequest httpServletRequest = (HttpServletRequest) request;
-    logger.info("CrosXssFilter.......orignal url:{},ParameterMap:{}",
-        httpServletRequest.getRequestURI(),
-        new Gson().toJson(httpServletRequest.getParameterMap()));
+//    logger.info("CrosXssFilter.......orignal url:{},ParameterMap:{}",  httpServletRequest.getRequestURI(), new Gson().toJson(httpServletRequest.getParameterMap()));
     XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper(
         httpServletRequest);
     chain.doFilter(xssHttpServletRequestWrapper, response);
-    logger.info("CrosXssFilter..........doFilter url:{},ParameterMap:{}",
-        xssHttpServletRequestWrapper.getRequestURI(),
-        new Gson().toJson(xssHttpServletRequestWrapper.getParameterMap()));
+//    logger.info("CrosXssFilter..........doFilter url:{},ParameterMap:{}", xssHttpServletRequestWrapper.getRequestURI(), new Gson().toJson(xssHttpServletRequestWrapper.getParameterMap()));
   }
 
   @Override
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 586d819..4278bf0 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
@@ -52,7 +52,7 @@
 
     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)
+                Math.abs(MoneyUtil.YuanToFen(transaction.personDtl.amount)), transaction.refno)
 
         return AgentResponse<DtlStatus>().also {
             val code = agentCode(resp.code, resp.message)
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
index 2eddc6b..c6c763a 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
@@ -3,6 +3,7 @@
 import com.google.gson.Gson
 import com.sun.jersey.api.client.Client
 import com.sun.jersey.api.client.ClientResponse
+import com.sun.jersey.core.util.MultivaluedMapImpl
 import com.supwisdom.dlpay.agent.citizencard.DlpayResp
 import com.supwisdom.dlpay.api.service.CardService
 import com.supwisdom.dlpay.api.service.SourceTypeService
@@ -64,29 +65,32 @@
         val systime = systemUtilService.sysdatetime
         val refno = systemUtilService.refno
         val params = hashMapOf<String, String>()
-        params.plus(mapOf(
-                "transcode" to YnrccUtil.BANKCARD_BIND_TRANSCODE,
-                "transdate" to systime.hostdate,
-                "transtime" to systime.hosttime,
-                "categorie" to YnrccUtil.DLPAY_CATEGORIE,
-                "refno" to refno,
-                "bankcardno" to bankcardno,
-                "username" to username,
-                "idtype" to idType,
-                "idno" to idno,
-                "phone" to phone,
-                "sign_type" to "MD5"
-        ))
+        params["transcode"] = YnrccUtil.BANKCARD_BIND_TRANSCODE
+        params["transdate"] = systime.hostdate
+        params["transtime"] = systime.hosttime
+        params["categorie"] = YnrccUtil.DLPAY_CATEGORIE
+        params["refno"] = refno
+        params["bankcardno"] = bankcardno
+        params["username"] = username
+        params["idtype"] = idType.toString()
+        params["idno"] = idno
+        params["phone"] = phone
+        params["sign_type"] = "MD5"
         val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
         params["sign"] = sign
+
+        val postData = MultivaluedMapImpl()
+        params.forEach { (t, u) -> postData.add(t, u) }
+
         val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/bindcard"
         logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
         val client = Client.create()
         client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
-        val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+        val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
         return if (200 == respClient.status) {
-            resp = respClient.getEntity(DlpayResp::class.java)
-            logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+            val jsonStr = respClient.getEntity(String::class.java)
+            logger.error("refno=[$refno], url=[$url], return=[$jsonStr]")
+            resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
             resp
         } else {
             resp.code = "99"
@@ -119,30 +123,33 @@
         val systime = systemUtilService.sysdatetime
         val refno = systemUtilService.refno
         val params = hashMapOf<String, String>()
-        params.plus(mapOf(
-                "transcode" to YnrccUtil.BANKCARD_SIGN_TRANSCODE,
-                "transdate" to systime.hostdate,
-                "transtime" to systime.hosttime,
-                "refno" to refno,
-                "categorie" to YnrccUtil.DLPAY_CATEGORIE,
-                "transtype" to transtype,
-                "bankcardno" to bankcardno,
-                "username" to username,
-                "idtype" to idType,
-                "idno" to idno,
-                "phone" to phone,
-                "sign_type" to "MD5"
-        ))
+        params["transcode"] = YnrccUtil.BANKCARD_SIGN_TRANSCODE
+        params["transdate"] = systime.hostdate
+        params["transtime"] = systime.hosttime
+        params["refno"] = refno
+        params["categorie"] = YnrccUtil.DLPAY_CATEGORIE
+        params["transtype"] = transtype
+        params["bankcardno"] = bankcardno
+        params["username"] = username
+        params["idtype"] = idType.toString()
+        params["idno"] = idno
+        params["phone"] = phone
+        params["sign_type"] = "MD5"
         val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
         params["sign"] = sign
+
+        val postData = MultivaluedMapImpl()
+        params.forEach { (t, u) -> postData.add(t, u) }
+
         val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/signcard"
         logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
         val client = Client.create()
         client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
-        val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+        val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
         return if (200 == respClient.status) {
-            resp = respClient.getEntity(DlpayResp::class.java)
-            logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+            val jsonStr = respClient.getEntity(String::class.java)
+            logger.error("refno=[$refno], url=[$url], return=[$jsonStr]")
+            resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
             resp
         } else {
             resp.code = "99"
@@ -195,33 +202,36 @@
 
         val systime = systemUtilService.sysdatetime
         val params = hashMapOf<String, String>()
-        params.plus(mapOf(
-                "transcode" to YnrccUtil.BANKCARD_PAY_TRANSCODE,
-                "transdate" to accdate, //我们的记账日期
-                "transtime" to systime.hosttime,
-                "refno" to refno,
-                "categorie" to YnrccUtil.DLPAY_CATEGORIE,
-                "bankcardno" to bankcardno,
-                "username" to person.name,
-                "idtype" to idType,
-                "idno" to person.idno,
-                "merchant_bankcardno" to merchantBankcardno,
-                "merchant_bankaccname" to merchantBankaccname,
-                "amount" to amount,
-                "description" to "市民卡代扣消费",
-                "sign_type" to "MD5"
-        ))
+        params["transcode"] = YnrccUtil.BANKCARD_PAY_TRANSCODE
+        params["transdate"] = accdate
+        params["transtime"] = systime.hosttime
+        params["refno"] = refno
+        params["categorie"] = YnrccUtil.DLPAY_CATEGORIE
+        params["bankcardno"] = bankcardno
+        params["username"] = person.name
+        params["idtype"] = idType.toString()
+        params["idno"] = person.idno
+        params["merchant_bankcardno"] = merchantBankcardno!!
+        params["merchant_bankaccname"] = merchantBankaccname!!
+        params["amount"] = amount.toString()
+        params["description"] = "市民卡代扣消费"
+        params["sign_type"] = "MD5"
         val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
         params["sign"] = sign
+
+        val postData = MultivaluedMapImpl()
+        params.forEach { (t, u) -> postData.add(t, u) }
+
         val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/cardpay"
         logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
         try {
             val client = Client.create()
             client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
-            val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+            val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
             return if (200 == respClient.status) {
-                resp = respClient.getEntity(DlpayResp::class.java)
-                logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+                val jsonStr = respClient.getEntity(String::class.java)
+                logger.error("refno=[$refno], url=[$url], return=[$jsonStr]")
+                resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
                 resp
             } else {
                 resp.code = "99"
@@ -247,27 +257,30 @@
 
         val systime = systemUtilService.sysdatetime
         val params = hashMapOf<String, String>()
-        params.plus(mapOf(
-                "transcode" to YnrccUtil.BANKCARD_PAYREFUND_TRANSCODE,
-                "transdate" to accdate, //我们的记账日期
-                "transtime" to systime.hosttime,
-                "refno" to refno,
-                "refundRefno" to orignRefno,
-                "amount" to amount,
-                "description" to "市民卡代扣消费退款",
-                "sign_type" to "MD5"
-        ))
+        params["transcode"] = YnrccUtil.BANKCARD_PAYREFUND_TRANSCODE
+        params["transdate"] = accdate //我们的记账日期
+        params["transtime"] = systime.hosttime
+        params["refno"] = refno
+        params["refundRefno"] = orignRefno
+        params["amount"] = amount.toString()
+        params["description"] = "市民卡代扣消费退款"
+        params["sign_type"] = "MD5"
         val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
         params["sign"] = sign
+
+        val postData = MultivaluedMapImpl()
+        params.forEach { (t, u) -> postData.add(t, u) }
+
         val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/cardpayrefund"
         logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
         try {
             val client = Client.create()
             client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
-            val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+            val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
             return if (200 == respClient.status) {
-                resp = respClient.getEntity(DlpayResp::class.java)
-                logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+                val jsonStr = respClient.getEntity(String::class.java)
+                logger.error("refno=[$refno],refundRefno=[$orignRefno], url=[$url], return=[$jsonStr]")
+                resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
                 resp
             } else {
                 resp.code = "99"
@@ -294,25 +307,28 @@
         val systime = systemUtilService.sysdatetime
         val refno = systemUtilService.refno
         val params = hashMapOf<String, String>()
-        params.plus(mapOf(
-                "transcode" to YnrccUtil.BANKCARD_QUERYRESULT_TRANSCODE,
-                "transdate" to systime.hostdate,
-                "transtime" to systime.hosttime,
-                "refno" to refno,
-                "orignRefno" to orignRefno,
-                "sign_type" to "MD5"
-        ))
+        params["transcode"] = YnrccUtil.BANKCARD_QUERYRESULT_TRANSCODE
+        params["transdate"] = systime.hostdate
+        params["transtime"] = systime.hosttime
+        params["refno"] = refno
+        params["orignRefno"] = orignRefno
+        params["sign_type"] = "MD5"
         val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
         params["sign"] = sign
+
+        val postData = MultivaluedMapImpl()
+        params.forEach { (t, u) -> postData.add(t, u) }
+
         val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/queryresult"
         logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
         try {
             val client = Client.create()
             client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
-            val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+            val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
             return if (200 == respClient.status) {
-                resp = respClient.getEntity(DlpayResp::class.java)
-                logger.error("refno=[$orignRefno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+                val jsonStr = respClient.getEntity(String::class.java)
+                logger.error("refno=[$orignRefno], url=[$url], return=[$jsonStr]")
+                resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
                 resp
             } else {
                 resp.code = "99"
@@ -338,25 +354,28 @@
         val systime = systemUtilService.sysdatetime
         val refno = systemUtilService.refno
         val params = hashMapOf<String, String>()
-        params.plus(mapOf(
-                "transcode" to YnrccUtil.BANKCARD_CHKFILE_TRANSCODE,
-                "transdate" to systime.hostdate,
-                "transtime" to systime.hosttime,
-                "refno" to refno,
-                "checkdate" to checkdate,
-                "merchant_bankcardno" to merchantBankcardno,
-                "sign_type" to "MD5"
-        ))
+        params["transcode"] = YnrccUtil.BANKCARD_CHKFILE_TRANSCODE
+        params["transdate"] = systime.hostdate
+        params["transtime"] = systime.hosttime
+        params["refno"] = refno
+        params["checkdate"] = checkdate
+        params["merchant_bankcardno"] = merchantBankcardno ?: ""
+        params["sign_type"] = "MD5"
         val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
         params["sign"] = sign
-        val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/bindcard"
+
+        val postData = MultivaluedMapImpl()
+        params.forEach { (t, u) -> postData.add(t, u) }
+
+        val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/checkdtl"
         logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
         val client = Client.create()
         client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
-        val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+        val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
         return if (200 == respClient.status) {
-            resp = respClient.getEntity(DlpayResp::class.java)
-            logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+            val jsonStr = respClient.getEntity(String::class.java)
+            logger.error("refno=[$refno],chkdate=[$checkdate], url=[$url], return=[$jsonStr]")
+            resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
             resp
         } else {
             resp.code = "99"
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 ff9510d..a9fbfa0 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
@@ -12,6 +12,7 @@
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.tenant.TenantContext
 import com.supwisdom.dlpay.framework.util.ApplicationUtil
+import com.supwisdom.dlpay.framework.util.Constants
 import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.util.ConstantUtil
 import mu.KotlinLogging
@@ -95,6 +96,8 @@
     @Async("queryAgentPayResult")
     fun queryResult(transaction: TTransactionMain, qcnt: Int) {
         try {
+            if (null == TenantContext.getTenantSchema()) TenantContext.setTenantSchema(transaction.tenantid)
+
             if (qcnt >= YnrccUtil.QUERY_MAX_COUNT) {
                 //查询超最大次数
                 logger.error("查询refno=[${transaction.refno}]流水结果超最大查询次数[${YnrccUtil.QUERY_MAX_COUNT}]")
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 b62c990..f10bf3b 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
@@ -70,7 +70,7 @@
             return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .success(QueryTransDtlResponse(it.refno, it.outTradeNo, it.shopDtl.amount,
                             it.status, it.sourceType, it.personDtl.payinfo, it.reverseFlag,
-                            it.shopDtl.transdesc), "查询成功"))
+                            it.shopDtl.transdesc,it.personDtl.remark), "查询成功"))
         } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
     }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
index 32dc699..32c43b6 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
@@ -9,6 +9,7 @@
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.Constants
 import com.supwisdom.dlpay.framework.util.DateUtil
 import com.supwisdom.dlpay.framework.util.StringUtil
 import com.supwisdom.dlpay.framework.util.SysparaUtil
@@ -37,7 +38,7 @@
     @PostMapping("/datasync")
     fun daliDatasync(@RequestBody param: DaliDatasyncParam): ResponseEntity<Any> {
         try {
-            if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema("{tenantid}") //fixme: tenantid设置
+            if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID) //fixme: tenantid设置
             param.checkParam()
             val appid = systemUtilService.getSysparaValue(SysparaUtil.DLCARDMANAGER_APPID)
             val appkey = systemUtilService.getSysparaValue(SysparaUtil.DLCARDMANAGER_SECRET)
@@ -130,7 +131,7 @@
         }
 
         try {
-            if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema("{tenantid}") //fixme: tenantid设置
+            if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID) //fixme: tenantid设置
             val txtFile = File(filename)
             val batchSize = 1000
             var sumCount = 0
@@ -218,7 +219,7 @@
         }
 
         try {
-            if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema("{tenantid}") //fixme: tenantid设置
+            if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID) //fixme: tenantid设置
             var totalcnt = 0
             var failcnt = 0
             var detailMsg = ""
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
index 4610ef7..5a26d56 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
@@ -32,6 +32,8 @@
                 TradeDict.STATUS_LOST == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOSS, "市民卡[$cardno]已经挂失!")
                 TradeDict.STATUS_FROZEN == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_FROZEN, "市民卡[$cardno]已经冻结!")
                 TradeDict.STATUS_LOCKED == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "市民卡[$cardno]已被锁定!")
+                TradeDict.STATUS_UNUSE == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "市民卡[$cardno]未启用!")
+                TradeDict.STATUS_ABNORMAL == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "市民卡[$cardno]状态异常!")
             }
         }
 
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index 2a8c984..5b109df 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -11,6 +11,7 @@
 import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.MoneyUtil
 import com.supwisdom.dlpay.framework.util.Subject
 import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
@@ -373,6 +374,13 @@
                     ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
                             "系统异常,无法处理退款流水")
             originTrans.reverseFlag = transaction.reverseType
+            if(originTrans.person){
+                originTrans.personDtl.reverseFlag = originTrans.reverseFlag
+                originTrans.personDtl.reverseAmount = originTrans.refundAmount
+            }
+            if(originTrans.shop){
+                originTrans.shopDtl.reverseFlag = originTrans.reverseFlag
+            }
             transactionMainDao.save(originTrans)
         }
 
@@ -391,6 +399,11 @@
         val originTrans = transactionMainDao.findByRefnoForUpdate(originRefno)
                 ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS
                         , "被退款流水不存在")
+        if (TradeDict.REVERSE_FLAG_NONE != originTrans.reverseType) {
+            throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+                    "原始流水为撤销或退款流水,不能再被退款")
+        }
+
         if (originTrans.status != TradeDict.DTL_STATUS_SUCCESS) {
             throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
                     "原流水不是成功状态")
@@ -401,8 +414,13 @@
         }
 
         doReversePrepareAndCheck(originTrans, builder, refundAmount)
-        // 判断退款金额
-        builder.preCheck()
+        //fixme: 判断退款金额 check 不支持部分退款
+        if (originTrans.person) {
+            if (!MoneyUtil.moneyEqual(Math.abs(originTrans.personDtl.amount), refundAmount)) {
+                throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR
+                        , "暂不支持部分退款")
+            }
+        }
         val transaction = doReverseProcess(originTrans, builder)
 
         originTrans.reverseFlag = TradeDict.REVERSE_FLAG_WIP
@@ -415,6 +433,11 @@
         val originTrans = transactionMainDao.findByRefnoForUpdate(originRefno)
                 ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS
                         , "被冲正流水不存在")
+        if (TradeDict.REVERSE_FLAG_NONE != originTrans.reverseType) {
+            throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+                    "原始流水为撤销或退款流水,不能再被撤销")
+        }
+
         if (originTrans.status != TradeDict.DTL_STATUS_SUCCESS) {
             throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
                     "原流水不是成功状态")
@@ -450,24 +473,32 @@
     }
 
     private fun doReverseProcess(originTrans: TTransactionMain, builder: TransactionBuilder): TTransactionMain {
-
+        val summarySuffix = getReverseSuffix(builder.reverseType)
         if (originTrans.person) {
             builder.person().apply {
                 setAmount(-originTrans.personDtl.amount, getOppositeTradeFlag(originTrans.personDtl.tradeflag))
                 setOpposite(originTrans.personDtl.oppositeAccNo, originTrans.personDtl.oppositeAccName)
             }
+            builder.description = "${originTrans.personDtl.transdesc}$summarySuffix"
+            builder.payinfo = originTrans.personDtl.payinfo
         }
         if (originTrans.shop) {
             builder.shop().apply {
                 setAmount(-originTrans.shopDtl.amount, getOppositeTradeFlag(originTrans.shopDtl.tradeflag))
                 setOpposite(originTrans.shopDtl.oppositeAccNo, originTrans.shopDtl.oppositeAccName)
             }
+            builder.description = "${originTrans.shopDtl.transdesc}$summarySuffix"
+            builder.payinfo = originTrans.shopDtl.payInfo
         }
-        val summarySuffix = getReverseSuffix(builder.reverseType)
+
         originTrans.details.forEach {
             builder.addDebitCreditRecord(it.draccno, it.drsubjno, it.craccno, it.crsubjno,
                     -it.amount, "${it.summary}$summarySuffix")
         }
+        builder.dtltype = originTrans.dtltype
+        if(builder.operId.isNullOrEmpty()){
+            builder.operator(originTrans.operid, originTrans.opertype)
+        }
         return builderRecords(builder, TradeDict.DTL_STATUS_INIT)
     }
 
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
index 9f662ab..eb46e66 100644
--- a/payapi/src/main/resources/application.properties
+++ b/payapi/src/main/resources/application.properties
@@ -32,7 +32,7 @@
 ## quartz task scheduler
 shopbalance.updater.cron=10/* * * * * ?
 dayend.settletask.cron=0 3/30 2-3 * * ?
-query.third.transdtl.result.cron=7 0/3 * * * ?
+query.third.transdtl.result.cron=7 0/1 * * * ?
 download.ynrcc.chkfile.cron =3 0/10 1 * * ?
 #dayend.settletask.cron = 0 0/2 * * * ?
 ################################################
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index 112b98b..c177115 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -524,7 +524,7 @@
 VALUES ('DAYENDSETTLETASK', '日终结算', '0', '20190619100600', '{tenantid}');
 
 INSERT INTO "tb_shop" ("shopid", "shopname", "shoptype", "fshopid", "status", "opendate", "tenantid")
-VALUES (1, '支付中心', 0, 0, 'normal', '20190517', '{tenantid}');
+VALUES (1, '支付中心', 'root', 0, 'normal', '20190517', '{tenantid}');
 
 INSERT INTO "tb_transcode" ("transcode", "transname", "tenantid")
 VALUES (3010, '市民卡代扣', '{tenantid}');
@@ -534,9 +534,9 @@
 VALUES (3500, '账户充值', '{tenantid}');
 
 INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES (1, 'cancel', 'reverseFlagList', '冲正', '冲正状态', '{tenantid}');
+VALUES (1, 'cancel', 'reverseFlagList', '被撤销', '冲正状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES (2, 'reverse', 'reverseFlagList', '手工撤销', '冲正状态', '{tenantid}');
+VALUES (2, 'refund', 'reverseFlagList', '被退款', '冲正状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
 VALUES (3, 'none', 'reverseFlagList', '-', '冲正状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
diff --git a/payapi/src/main/resources/templates/system/dtl/userdtl.html b/payapi/src/main/resources/templates/system/dtl/userdtl.html
index 85c7665..6dda89c 100644
--- a/payapi/src/main/resources/templates/system/dtl/userdtl.html
+++ b/payapi/src/main/resources/templates/system/dtl/userdtl.html
@@ -35,7 +35,7 @@
                 <div class="layui-inline">
                     <label class="layui-form-label">支付方式</label>
                     <div class="layui-input-block" style="height: 38px;">
-                        <select name="sourceType" id="userdtl-search-sourceType" class="layui-select">
+                        <select name="sourcetype" id="userdtl-search-sourceType" class="layui-select">
                             <option value=""> 全部</option>
                             <option th:each="pt:${paytypelist}" th:value="${pt.sourceType}"
                                     th:text="${pt.paydesc}"></option>
@@ -63,7 +63,7 @@
                 <div class="layui-inline">
                     <label class="layui-form-label">状态</label>
                     <div class="layui-input-block" style="height:38px;">
-                        <select name="transStatus" id="userdtl-search-transStatus" class="layui-select">
+                        <select name="status" id="userdtl-search-transStatus" class="layui-select">
                             <option value=""> 全部</option>
                             <option th:each="st:${dtlStatusList}" th:value="${st.dictval}"
                                     th:text="${st.dictcaption}"></option>
@@ -148,10 +148,10 @@
                     endTransdate: $("#userdtl-search-endTransdate").val(),
                     personname: $("#userdtl-search-personname").val(),
                     cardno: $("#userdtl-search-cardno").val(),
-                    sourceType: $("#userdtl-search-sourceType").val(),
+                    sourcetype: $("#userdtl-search-sourceType").val(),
                     tradeflag: $("#userdtl-search-tradeflag").val(),
                     transcode: $("#userdtl-search-transcode").val(),
-                    transStatus: $("#userdtl-search-transStatus").val()
+                    status: $("#userdtl-search-transStatus").val()
                 }, page: {curr: 1}
             });
         });
@@ -164,10 +164,10 @@
                 "endTransdate": "",
                 "personname": "",
                 "cardno": "",
-                "sourceType": "",
+                "sourcetype": "",
                 "tradeflag": "",
                 "transcode": "",
-                "transStatus": ""
+                "status": ""
             });
             form.render("select");
         });