diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayResp.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayResp.java
index ba5e113..2ed95c0 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayResp.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayResp.java
@@ -9,9 +9,9 @@
   private String message;
   private String transdate;
   private String transtime;
-  private String bankjourno;
-  private String captcha;
-  private String status;
+  private String bankjourno; //银行流水号
+  private String captcha; //验证码
+  private String status; //0-成功；1-失败；2-已退款；3-部分退款
   private String filename;
 
   @XmlElement(name = "CODE")
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/YnrccUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/YnrccUtil.java
index d6d7b9f..e2ef84f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/util/YnrccUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/YnrccUtil.java
@@ -5,18 +5,26 @@
 
 
 public class YnrccUtil {
-  private static final String BANKCARD_BIND_TRANSCODE = "BC5510";
-  private static final String BANKCARD_SIGN_TRANSCODE = "BC5511";
-  private static final String BANKCARD_PAY_TRANSCODE = "BC5512";
-  private static final String BANKCARD_PAYREFUND_TRANSCODE = "BC5513";
-  private static final String BANKCARD_QUERYRESULT_TRANSCODE = "BC5514";
-  private static final String BANKCARD_CHKFILE_TRANSCODE = "BC5515";
+  public static final String BANKCARD_BIND_TRANSCODE = "BC5510";
+  public static final String BANKCARD_SIGN_TRANSCODE = "BC5511";
+  public static final String BANKCARD_PAY_TRANSCODE = "BC5512";
+  public static final String BANKCARD_PAYREFUND_TRANSCODE = "BC5513";
+  public static final String BANKCARD_QUERYRESULT_TRANSCODE = "BC5514";
+  public static final String BANKCARD_CHKFILE_TRANSCODE = "BC5515";
 
   public static final String DLPAY_CATEGORIE = "C001"; //消费类别
 
   public static final String YNRCC_ANGENT_URL = "ynrcc.agent.url"; //农商行前置url
-  public static final String YNRCC_SIGNTYPE = "ynrcc.agent.signtype"; //农商行前置signtype
   public static final String YNRCC_SIGNKEY = "ynrcc.agent.signkey"; //农商行前置md5key
+  public static final String YNRCC_MERCHANT_BANKCARDNO = "merchant.bankcardno";
+  public static final String YNRCC_MERCHANT_BANKACCNAME = "merchant.bankaccname";
+
+  public static final String PARAM_CONFIG_ERROR = "90000"; // 参数未配置
+  public static final String PARAM_VALUE_ERROR = "90001"; // 参数值错误
+
+  public static final int AGENT_CONNECT_TIMEOUT = 20;
+  public static final String TRANSTYPE_SIGNCARD = "1"; //签约
+  public static final String TRANSTYPE_UNSIGNCARD = "2"; //解约
 
   public static final Map<String, String> errcode = new HashMap<>(0);
   static {
@@ -28,17 +36,26 @@
     errcode.put("0105", "户名不符");
     errcode.put("0106", "卡状态异常");
     errcode.put("0107", "无此卡号");
+    errcode.put("0108", "已存在签约信息,与签约证件号码不符");
+    errcode.put("0109", "已存在签约信息,与签约证件类型不符");
+    errcode.put("0110", "已存在签约信息,与签约户名不符");
+    errcode.put("0111", "已存在签约信息,与签约手机号不符");
+
     errcode.put("0201", "未进行银行卡绑定");
     errcode.put("0202", "无效的交易类型");
     errcode.put("0301", "未签约");
     errcode.put("0302", "余额不足");
     errcode.put("0303", "MD5校验失败");
+    errcode.put("0304", "该卡号已经解约,不允许重复解约");
     errcode.put("0401", "原始流水不存在");
     errcode.put("0402", "原始流水未成功");
     errcode.put("0403", "原始流水已退款");
     errcode.put("4004", "商户账户余额不足");
     errcode.put("0405", "不在退款时间范围内");
     errcode.put("0406", "当日无交易明细");
+    errcode.put("0407", "非大理市民卡,不允许交易");
+    errcode.put("0408", "同一请求流水号不允许重复提交");
+    errcode.put("4444", "其他错误");
   }
 
 
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt
index b85342f..8b378e8 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.api.service
 
 import com.supwisdom.dlpay.api.bean.DaliDatasyncDetail
+import com.supwisdom.dlpay.api.domain.TCard
 import org.springframework.transaction.annotation.Propagation
 import org.springframework.transaction.annotation.Transactional
 
@@ -9,4 +10,7 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
     fun doUpdateUserInfos(bean: DaliDatasyncDetail): Boolean
 
+    @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun getBankcardByUserid(userid: String): TCard?
+
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt
index be69c42..d345330 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt
@@ -130,5 +130,7 @@
     }
 
 
-
+    override fun getBankcardByUserid(userid: String): TCard? {
+        return cardDao.findCardByUseridAndCardtype(userid, ConstantUtil.CARDTYPE_BANKCARD)
+    }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/citizencard_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/citizencard_service.kt
index 7faf4d7..5da1116 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/citizencard_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/citizencard_service.kt
@@ -1,8 +1,18 @@
 package com.supwisdom.dlpay.citizencard.service
 
 import com.supwisdom.dlpay.api.bean.DlpayResp
+import com.supwisdom.dlpay.api.domain.TPerson
 
 interface CitizencardPayService {
-    fun bindCard(bankcardno: String, idtype: String, idno: String, phone: String): DlpayResp
+    fun bindCard(bankcardno: String, username: String, idtype: String, idno: String, phone: String): DlpayResp
+
+    fun signCard(bankcardno: String, username: String, idtype: String, idno: String, phone: String, transtype: String): DlpayResp
+
+    fun cardPay(shopaccno: String, person: TPerson, amount: Int, refno: String): DlpayResp
+
+    fun cardPayRefund(refno: String, orignRefno: String, amount: Int): DlpayResp
+
+    fun queryResult(refno: String, orignRefno: String): DlpayResp
+
 
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/impl/citizencard_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/impl/citizencard_service_impl.kt
index b29a084..5785262 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/impl/citizencard_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/impl/citizencard_service_impl.kt
@@ -1,12 +1,303 @@
 package com.supwisdom.dlpay.citizencard.service.impl
 
+import com.google.gson.Gson
+import com.sun.jersey.api.client.Client
+import com.sun.jersey.api.client.ClientResponse
 import com.supwisdom.dlpay.api.bean.DlpayResp
+import com.supwisdom.dlpay.api.domain.TPerson
+import com.supwisdom.dlpay.api.service.DaliDatasyncService
+import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.types.IDTypes
 import com.supwisdom.dlpay.citizencard.service.CitizencardPayService
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.util.YnrccUtil
+import mu.KotlinLogging
+import org.springframework.beans.factory.annotation.Autowired
+import javax.ws.rs.core.MediaType
 
 class CitizencardPayServiceImpl : CitizencardPayService {
+    @Autowired
+    lateinit var sourceTypeService: SourceTypeService
+    @Autowired
+    lateinit var systemUtilService: SystemUtilService
+    @Autowired
+    lateinit var daliDatasyncService: DaliDatasyncService
 
-    override fun bindCard(bankcardno: String, idtype: String, idno: String, phone: String): DlpayResp {
-        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    private val logger = KotlinLogging.logger { }
+
+    private fun checkCitizencardConfig(config: Map<String, String?>, resp: DlpayResp): Boolean {
+        val agentUrl = config[YnrccUtil.YNRCC_ANGENT_URL]
+        val signKey = config[YnrccUtil.YNRCC_SIGNKEY]
+        if (agentUrl.isNullOrEmpty()) {
+            resp.code = YnrccUtil.PARAM_CONFIG_ERROR
+            resp.message = "系统参数未配置[农商行前置地址前缀]"
+            logger.error(resp.message)
+            return false
+        }
+        if (signKey.isNullOrEmpty()) {
+            resp.code = YnrccUtil.PARAM_CONFIG_ERROR
+            resp.message = "系统参数未配置[农商行前置签名秘钥]"
+            logger.error(resp.message)
+            return false
+        }
+        return true
     }
 
+    override fun bindCard(bankcardno: String, username: String, idtype: String, idno: String, phone: String): DlpayResp {
+        var resp = DlpayResp()
+        val config = sourceTypeService.getChargePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, true)
+        if (!checkCitizencardConfig(config, resp)) {
+            return resp
+        }
+        val idType = IDTypes.findByValue(idtype)
+        if (idType < 0) {
+            resp.code = YnrccUtil.PARAM_VALUE_ERROR
+            resp.message = "证件类型未识别[$idtype]"
+            logger.error(resp.message)
+            return resp
+        }
+        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,
+                "refno" to refno,
+                "bankcardno" to bankcardno,
+                "username" to username,
+                "idtype" to idType,
+                "idno" to idno,
+                "phone" to phone,
+                "sign_type" to "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"
+        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)
+        return if (200 == respClient.status) {
+            resp = respClient.getEntity(DlpayResp::class.java)
+            logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+            resp
+        } else {
+            resp.code = "99"
+            resp.message = "请求前置返回失败[httpStatus=$respClient.status]"
+            logger.error(resp.message)
+            resp
+        }
+    }
+
+    override fun signCard(bankcardno: String, username: String, idtype: String, idno: String, phone: String, transtype: String): DlpayResp {
+        var resp = DlpayResp()
+        val config = sourceTypeService.getChargePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, true)
+        if (!checkCitizencardConfig(config, resp)) {
+            return resp
+        }
+        val idType = IDTypes.findByValue(idtype)
+        if (idType < 0) {
+            resp.code = YnrccUtil.PARAM_VALUE_ERROR
+            resp.message = "证件类型未识别[$idtype]"
+            logger.error(resp.message)
+            return resp
+        }
+        if (YnrccUtil.TRANSTYPE_SIGNCARD != transtype && YnrccUtil.TRANSTYPE_UNSIGNCARD != transtype) {
+            resp.code = YnrccUtil.PARAM_VALUE_ERROR
+            resp.message = "签约类型错误[$transtype]"
+            logger.error(resp.message)
+            return resp
+        }
+
+        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"
+        ))
+        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() + "/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)
+        return if (200 == respClient.status) {
+            resp = respClient.getEntity(DlpayResp::class.java)
+            logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+            resp
+        } else {
+            resp.code = "99"
+            resp.message = "请求前置返回失败[httpStatus=$respClient.status]"
+            logger.error(resp.message)
+            resp
+        }
+    }
+
+    override fun cardPay(shopaccno: String, person: TPerson, amount: Int, refno: String): DlpayResp {
+        var resp = DlpayResp()
+        val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, shopaccno, false, false)
+        if (!checkCitizencardConfig(config, resp)) {
+            return resp
+        }
+        val merchantBankcardno = config[YnrccUtil.YNRCC_MERCHANT_BANKCARDNO]
+        val merchantBankaccname = config[YnrccUtil.YNRCC_MERCHANT_BANKACCNAME]
+        if (StringUtil.isEmpty(merchantBankcardno) || StringUtil.isEmpty(merchantBankaccname)) {
+            resp.code = YnrccUtil.PARAM_CONFIG_ERROR
+            resp.message = "系统参数未配置[商户收款银行账号]"
+            logger.error(resp.message)
+            return resp
+        }
+        val idType = IDTypes.findByValue(person.idtype)
+        if (idType < 0) {
+            resp.code = YnrccUtil.PARAM_VALUE_ERROR
+            resp.message = "证件类型未识别[${person.idtype}]"
+            logger.error(resp.message)
+            return resp
+        }
+        val userBankcard = daliDatasyncService.getBankcardByUserid(person.userid)
+        if (null == userBankcard) {
+            resp.code = "99"
+            resp.message = "用户[${person.userid}]未绑定银行卡"
+            logger.error(resp.message)
+            return resp
+        } else if (TradeDict.STATUS_NORMAL != userBankcard.status) {
+            resp.code = "99"
+            resp.message = "用户[${person.userid}]绑定银行卡状态异常"
+            logger.error(resp.message)
+            return resp
+        } else if (!userBankcard.signed) {
+            resp.code = "99"
+            resp.message = "用户[${person.userid}]绑定银行卡未签约"
+            logger.error(resp.message)
+            return resp
+        }
+        val bankcardno = userBankcard.cardno
+
+        val systime = systemUtilService.sysdatetime
+        val params = hashMapOf<String, String>()
+        params.plus(mapOf(
+                "transcode" to YnrccUtil.BANKCARD_PAY_TRANSCODE,
+                "transdate" to systime.hostdate,
+                "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"
+        ))
+        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() + "/cardpay"
+        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)
+        return if (200 == respClient.status) {
+            resp = respClient.getEntity(DlpayResp::class.java)
+            logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+            resp
+        } else {
+            resp.code = "99"
+            resp.message = "请求前置返回失败[httpStatus=$respClient.status]"
+            logger.error(resp.message)
+            resp
+        }
+    }
+
+    override fun cardPayRefund(refno: String, orignRefno: String, amount: Int): DlpayResp {
+        var resp = DlpayResp()
+        val config = sourceTypeService.getChargePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, true)
+        if (!checkCitizencardConfig(config, resp)) {
+            return resp
+        }
+
+        val systime = systemUtilService.sysdatetime
+        val params = hashMapOf<String, String>()
+        params.plus(mapOf(
+                "transcode" to YnrccUtil.BANKCARD_PAYREFUND_TRANSCODE,
+                "transdate" to systime.hostdate,
+                "transtime" to systime.hosttime,
+                "refno" to refno,
+                "refund_refno" to orignRefno,
+                "amount" to amount,
+                "description" to "市民卡代扣消费退款",
+                "sign_type" to "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() + "/cardpayrefund"
+        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)
+        return if (200 == respClient.status) {
+            resp = respClient.getEntity(DlpayResp::class.java)
+            logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+            resp
+        } else {
+            resp.code = "99"
+            resp.message = "请求前置返回失败[httpStatus=$respClient.status]"
+            logger.error(resp.message)
+            resp
+        }
+    }
+
+    override fun queryResult(refno: String, orignRefno: String): DlpayResp {
+        var resp = DlpayResp()
+        val config = sourceTypeService.getChargePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, true)
+        if (!checkCitizencardConfig(config, resp)) {
+            return resp
+        }
+
+        val systime = systemUtilService.sysdatetime
+        val params = hashMapOf<String, String>()
+        params.plus(mapOf(
+                "transcode" to YnrccUtil.BANKCARD_PAYREFUND_TRANSCODE,
+                "transdate" to systime.hostdate,
+                "transtime" to systime.hosttime,
+                "refno" to refno,
+                "orign_refno" to orignRefno,
+                "sign_type" to "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() + "/queryresult"
+        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)
+        return if (200 == respClient.status) {
+            resp = respClient.getEntity(DlpayResp::class.java)
+            logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+            resp
+        } else {
+            resp.code = "99"
+            resp.message = "请求前置返回失败[httpStatus=$respClient.status]"
+            logger.error(resp.message)
+            resp
+        }
+
+    }
+
+
 }
\ No newline at end of file
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index b201022..610e4fd 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -485,13 +485,11 @@
 INSERT INTO TB_SOURCETYPE_CONFIG (ID, SOURCETYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
 VALUES ('13', 'citizenCard', 'ynrcc.agent.url', '农商行前置地址前缀', NULL, 't', '{tenantid}');
 INSERT INTO TB_SOURCETYPE_CONFIG (ID, SOURCETYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
-VALUES ('14', 'citizenCard', 'ynrcc.agent.signtype', '农商行前置签名方式', 'MD5', 't', '{tenantid}');
-INSERT INTO TB_SOURCETYPE_CONFIG (ID, SOURCETYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
 VALUES ('15', 'citizenCard', 'ynrcc.agent.signkey', '农商行前置签名秘钥', NULL, 't', '{tenantid}');
 INSERT INTO TB_SOURCETYPE_CONFIG (ID, SOURCETYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
-VALUES ('16', 'citizenCard', 'bankcardno', '商户银行卡号', NULL, 'f', '{tenantid}');
+VALUES ('16', 'citizenCard', 'merchant.bankcardno', '商户银行卡号', NULL, 'f', '{tenantid}');
 INSERT INTO TB_SOURCETYPE_CONFIG (ID, SOURCETYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
-VALUES ('17', 'citizenCard', 'bankaccname', '银行开户名', NULL, 'f', '{tenantid}');
+VALUES ('17', 'citizenCard', 'merchant.bankaccname', '银行开户名', NULL, 'f', '{tenantid}');
 
 INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
 VALUES (1, 'yes', 1, '20190514165658', '账户最大余额默认值', '元', '10001', '账户开户时的默认账户最大余额', 'amount', '{tenantid}');
