银行接口初步实现
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java
index 999f37f..79d4b62 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java
@@ -1,16 +1,23 @@
 package com.supwisdom.dlpay.api.util;
 
 public enum IDTypes {
-  IDTYPE_IDCARD("idcard"), // 身份证
-  IDTYPE_PASSPORT("passport"), // 护照
-  IDTYPE_DRIVING_LICENSE("driving_license"), // 驾照
-  IDTYPE_HK_MACAU_PASS("hk_macau_pass"), // 港澳通行证
-  IDTYPE_STUDENT_IDCARD("student_idcard"), // 学生证
-  IDTYPE_OTHER("unknown"),
-  IDTYPE_LIST(new IDTypes[]{IDTYPE_IDCARD, IDTYPE_PASSPORT,
-      IDTYPE_DRIVING_LICENSE, IDTYPE_HK_MACAU_PASS, IDTYPE_STUDENT_IDCARD, IDTYPE_OTHER}); // 其它
+  IDCARD(52, "idcard"), // 身份证
+  RESIDENCE_BOOKLET(55, "residence_booklet"), //户口簿
+  PASSPORT(70, "passport"), // 护照
+  HK_MACAU_PASS(76, "hk_macau_pass"), // 港澳居民来往内地通行证
+  TAIWAN_PASS(67, "taiwan_pass"), // 台湾同胞来往内地通行证
+  FOREIGNER_RESIDENCE_PERMIT(68, "foreigner_residence_permit"), // 外国人居留证
+  MILITARY_IDCARD(58, "military_idcard"), //  军官证
+  SOLDIER_IDCARD(64, "soldier_idcard"), //  士兵证
+  DRIVING_LICENSE(-97, "driving_license"), // 驾照
+  STUDENT_IDCARD(-98, "student_idcard"), // 学生证
+  OTHERS(-99, "unknown"),
+  IDTYPE_LIST(-100, new IDTypes[]{IDCARD, RESIDENCE_BOOKLET, PASSPORT, HK_MACAU_PASS, TAIWAN_PASS, FOREIGNER_RESIDENCE_PERMIT, MILITARY_IDCARD, SOLDIER_IDCARD,
+      DRIVING_LICENSE, STUDENT_IDCARD, OTHERS}); // 其它
 
-  IDTypes(Object data) {
+
+  IDTypes(int id, Object data) {
+    this.id = id;
     this.data = data;
   }
 
@@ -18,9 +25,35 @@
     return this.data.toString();
   }
 
+  public int getId() {
+    return this.id;
+  }
+
   public Object getData() {
     return this.data;
   }
 
   private Object data;
+
+  private int id;
+
+  public static String findById(int id) {
+    IDTypes[] list = (IDTypes[]) IDTypes.IDTYPE_LIST.getData();
+    for (IDTypes item : list) {
+      if (item.getId() == id) {
+        return item.value();
+      }
+    }
+    return null;
+  }
+
+  public static int findByValue(String idtype) {
+    IDTypes[] list = (IDTypes[]) IDTypes.IDTYPE_LIST.getData();
+    for (IDTypes item : list) {
+      if (item.value().equals(idtype)) {
+        return item.getId();
+      }
+    }
+    return -999;
+  }
 }
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java
index 9d67476..ea51688 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java
@@ -29,7 +29,7 @@
       if (StringUtils.isEmpty(idno)) {
         return false;
       }
-      if (IDTypes.IDTYPE_IDCARD.value().equals(idtype) && idno.length() != 18) {
+      if (IDTypes.IDCARD.value().equals(idtype) && idno.length() != 18) {
         return false;
       }
       return true;
diff --git a/payapi-common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java b/payapi-common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java
index 3fa5c38..680fb98 100644
--- a/payapi-common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java
+++ b/payapi-common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java
@@ -55,7 +55,7 @@
     List<ConstraintViolation<OpenUserParam>> result = validate(param);
     assertFalse(getViolationMessage(result), result.isEmpty());
 
-    param.setIdtype(IDTypes.IDTYPE_IDCARD.value());
+    param.setIdtype(IDTypes.IDCARD.value());
     param.setIdno("123213");
     param.setUid("1231323");
     param.setName("lily");
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
index 3678cc0..0af068f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
@@ -1,48 +1,282 @@
 package com.supwisdom.dlpay.api.bean;
 
+import com.supwisdom.dlpay.framework.util.MD5;
+
 public class DlpayReq {
   private static final String prefix = "<?xml version=\"1.0\" encoding=\"GBK\"?>";
+  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";
 
-  //HEAD
-  private String jkdm; //<JKDM>接口代码</JKDM>
-  private String jgdm; //<JGDM>结果代码</JGDM>
-  private String fsdw; //<FSDW>发送单位</FSDW>
-  private String jsdw; //<JSDW>接收单位</JSDW>
-  private String czyh; //<CZYH>操作员号</CZYH>
-  private String jyxh; //<JYXH>交易序号</JYXH>
-  private String jyqd; //<JYQD>交易渠道</JYQD>
-  private String yhxx; //<YHXX>安全用户信息</YHXX>
-  private String klxx; //<KLXX>安全口令信息</KLXX>
+  public static final String DLPAY_CATEGORIE = "C001"; //消费类别
 
-  //DATA业务参数  <KEY>key值</KEY>
+  private String transdate; //交易日期
+  private String transtime; //交易时间
+  private String sn; //应用系统唯一流水号
+  private String bcNo; //银行卡卡号
+  private String name; //户名
+  private String idType; //证件类型
+  private String idNo; //证件号码
+  private String phone; //手机号
 
+  private String categorie; //消费类别
+  private String transType; //交易类型 签约1,解约2
 
-  private String getPayXml() {
+  private String merchantBcno; //商户卡号
+  private String merchantName; //商户户名
+  private Integer amount; //消费金额
+  private String description; //描述交易内容
+
+  private String oriSn; //原应用系统唯一流水号
+  private String chkdate; //对账日期
+
+  /**
+   * 市民卡绑定请求XML
+   * */
+  public String getBindCardXml() {
     StringBuffer xml = new StringBuffer();
     xml.append(prefix)
-        .append("<FORMDATA>")
-        //HEAD
-        .append("<HEAD>")
-        .append("<JKDM>").append(jkdm).append("</JKDM>")
-        .append("<JGDM>").append("000000").append("</JGDM>") //发送时填充000000
-        .append("<FSDW>").append(fsdw).append("</FSDW>")
-        .append("<JSDW>").append(jsdw).append("</JSDW>")
-        .append("<CZYH>").append(czyh).append("</CZYH>")
-        .append("<JYXH>").append(jyxh).append("</JYXH>")
-        .append("<JYQD>").append(jyqd).append("</JYQD>")
-        .append("<YHXX>").append(yhxx).append("</YHXX>")
-        .append("<KLXX>").append(klxx).append("</KLXX>")
-        .append("</HEAD>")
-        //DATA
-        .append("<DATA>")
-//        .append("<REFNO>").append("201906211124000011").append("</REFNO>")
-        .append("</DATA>")
-        .append("</FORMDATA>");
+        .append("<root>")
+        .append("<TRANSCODE>").append(BANKCARD_BIND_TRANSCODE).append("</TRANSCODE>")
+        .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+        .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+        .append("<SN>").append(sn).append("</SN>")
+        .append("<BC_NO>").append(bcNo).append("</BC_NO>")
+        .append("<NAME>").append(name).append("</NAME>")
+        .append("<ID_TYPE>").append(idType).append("</ID_TYPE>")
+        .append("<ID_NO>").append(idNo).append("</ID_NO>")
+        .append("<PHONE>").append(phone).append("</PHONE>")
+        .append("</root>");
     return String.format("%08d", xml.toString().length()) + xml.toString();
   }
 
 
+  /**
+   * 市民卡签约/解约请求XML
+   * */
+  public String getSignXml(){
+    StringBuffer xml = new StringBuffer();
+    xml.append(prefix)
+        .append("<root>")
+        .append("<TRANSCODE>").append(BANKCARD_SIGN_TRANSCODE).append("</TRANSCODE>")
+        .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+        .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+        .append("<SN>").append(sn).append("</SN>")
+        .append("<CATEGORIE>").append(categorie).append("</CATEGORIE>")
+        .append("<BC_NO>").append(bcNo).append("</BC_NO>")
+        .append("<NAME>").append(name).append("</NAME>")
+        .append("<ID_TYPE>").append(idType).append("</ID_TYPE>")
+        .append("<ID_NO>").append(idNo).append("</ID_NO>")
+        .append("<PHONE>").append(phone).append("</PHONE>")
+        .append("<TRANS_TYPE>").append(transType).append("</TRANS_TYPE>")
+        .append("</root>");
+    return String.format("%08d", xml.toString().length()) + xml.toString();
+  }
 
+  /**
+   * 市民卡代扣消费接口请求报文
+   * */
+  public String getCardpayXml(){
+    StringBuffer xml = new StringBuffer();
+    xml.append(prefix)
+        .append("<root>")
+        .append("<TRANSCODE>").append(BANKCARD_PAY_TRANSCODE).append("</TRANSCODE>")
+        .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+        .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+        .append("<SN>").append(sn).append("</SN>")
+        .append("<CATEGORIE>").append(categorie).append("</CATEGORIE>")
+        .append("<BC_NO>").append(bcNo).append("</BC_NO>")
+        .append("<NAME>").append(name).append("</NAME>")
+//        .append("<ID_TYPE>").append(idType).append("</ID_TYPE>")
+        .append("<ID_NO>").append(idNo).append("</ID_NO>")
+        .append("<MERCHANT_BCNO>").append(merchantBcno).append("</MERCHANT_BCNO>")
+        .append("<MERCHANT_NAME>").append(merchantName).append("</MERCHANT_NAME>")
+        .append("<AMOUNT>").append(amount).append("</AMOUNT>")
+        .append("<DESCRIPTION>").append(description).append("</DESCRIPTION>")
+        .append("<MAC>").append(MD5.encodeByMD5ForDlpay(merchantBcno + bcNo + amount)).append("</MAC>")
+        .append("</root>");
+    return String.format("%08d", xml.toString().length()) + xml.toString();
+  }
 
+  /**
+   * 市民卡退款接口请求报文
+   * */
+  public String getPayRefundXml(){
+    StringBuffer xml = new StringBuffer();
+    xml.append(prefix)
+        .append("<root>")
+        .append("<TRANSCODE>").append(BANKCARD_PAYREFUND_TRANSCODE).append("</TRANSCODE>")
+        .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+        .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+        .append("<SN>").append(sn).append("</SN>")
+        .append("<ORI_SN>").append(oriSn).append("</ORI_SN>")
+        .append("<AMOUNT>").append(amount).append("</AMOUNT>")
+        .append("<DESCRIPTION>").append(description).append("</DESCRIPTION>")
+        .append("</root>");
+    return String.format("%08d", xml.toString().length()) + xml.toString();
+  }
 
+  /**
+   * 市民卡交易查询接口请求报文
+   * */
+  public String getQueryResultXml(){
+    StringBuffer xml = new StringBuffer();
+    xml.append(prefix)
+        .append("<root>")
+        .append("<TRANSCODE>").append(BANKCARD_QUERYRESULT_TRANSCODE).append("</TRANSCODE>")
+        .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+        .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+        .append("<SN>").append(sn).append("</SN>")
+        .append("<ORI_SN>").append(oriSn).append("</ORI_SN>")
+        .append("</root>");
+    return String.format("%08d", xml.toString().length()) + xml.toString();
+  }
+
+  /**
+   * 市民卡对账接口请求报文
+   * */
+  public String getChkfileXml(){
+    StringBuffer xml = new StringBuffer();
+    xml.append(prefix)
+        .append("<root>")
+        .append("<TRANSCODE>").append(BANKCARD_CHKFILE_TRANSCODE).append("</TRANSCODE>")
+        .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+        .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+        .append("<SN>").append(sn).append("</SN>")
+        .append("<DZDATE>").append(chkdate).append("</DZDATE>")
+        .append("<MERCHANT_BCNO>").append("</MERCHANT_BCNO>")
+        .append("</root>");
+    return String.format("%08d", xml.toString().length()) + xml.toString();
+  }
+
+  public String getTransdate() {
+    return transdate;
+  }
+
+  public void setTransdate(String transdate) {
+    this.transdate = transdate;
+  }
+
+  public String getTranstime() {
+    return transtime;
+  }
+
+  public void setTranstime(String transtime) {
+    this.transtime = transtime;
+  }
+
+  public String getSn() {
+    return sn;
+  }
+
+  public void setSn(String sn) {
+    this.sn = sn;
+  }
+
+  public String getBcNo() {
+    return bcNo;
+  }
+
+  public void setBcNo(String bcNo) {
+    this.bcNo = bcNo;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getIdType() {
+    return idType;
+  }
+
+  public void setIdType(String idType) {
+    this.idType = idType;
+  }
+
+  public String getIdNo() {
+    return idNo;
+  }
+
+  public void setIdNo(String idNo) {
+    this.idNo = idNo;
+  }
+
+  public String getPhone() {
+    return phone;
+  }
+
+  public void setPhone(String phone) {
+    this.phone = phone;
+  }
+
+  public String getCategorie() {
+    return categorie;
+  }
+
+  public void setCategorie(String categorie) {
+    this.categorie = categorie;
+  }
+
+  public String getTransType() {
+    return transType;
+  }
+
+  public void setTransType(String transType) {
+    this.transType = transType;
+  }
+
+  public String getMerchantBcno() {
+    return merchantBcno;
+  }
+
+  public void setMerchantBcno(String merchantBcno) {
+    this.merchantBcno = merchantBcno;
+  }
+
+  public String getMerchantName() {
+    return merchantName;
+  }
+
+  public void setMerchantName(String merchantName) {
+    this.merchantName = merchantName;
+  }
+
+  public Integer getAmount() {
+    return amount;
+  }
+
+  public void setAmount(Integer amount) {
+    this.amount = amount;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public String getOriSn() {
+    return oriSn;
+  }
+
+  public void setOriSn(String oriSn) {
+    this.oriSn = oriSn;
+  }
+
+  public String getChkdate() {
+    return chkdate;
+  }
+
+  public void setChkdate(String chkdate) {
+    this.chkdate = chkdate;
+  }
 }
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
new file mode 100644
index 0000000..ba5e113
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayResp.java
@@ -0,0 +1,88 @@
+package com.supwisdom.dlpay.api.bean;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "root")
+public class DlpayResp {
+  private String code;
+  private String message;
+  private String transdate;
+  private String transtime;
+  private String bankjourno;
+  private String captcha;
+  private String status;
+  private String filename;
+
+  @XmlElement(name = "CODE")
+  public String getCode() {
+    return code;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  @XmlElement(name = "MESSAGE")
+  public String getMessage() {
+    return message;
+  }
+
+  public void setMessage(String message) {
+    this.message = message;
+  }
+
+  @XmlElement(name = "TRANSDATE")
+  public String getTransdate() {
+    return transdate;
+  }
+
+  public void setTransdate(String transdate) {
+    this.transdate = transdate;
+  }
+
+  @XmlElement(name = "TRANSTIME")
+  public String getTranstime() {
+    return transtime;
+  }
+
+  public void setTranstime(String transtime) {
+    this.transtime = transtime;
+  }
+
+  @XmlElement(name = "BANKJOURNO")
+  public String getBankjourno() {
+    return bankjourno;
+  }
+
+  public void setBankjourno(String bankjourno) {
+    this.bankjourno = bankjourno;
+  }
+
+  @XmlElement(name = "CAPTCHA")
+  public String getCaptcha() {
+    return captcha;
+  }
+
+  public void setCaptcha(String captcha) {
+    this.captcha = captcha;
+  }
+
+  @XmlElement(name = "STATUS")
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  @XmlElement(name = "FILENAME")
+  public String getFilename() {
+    return filename;
+  }
+
+  public void setFilename(String filename) {
+    this.filename = filename;
+  }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java
index b310480..4a239dd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java
@@ -24,6 +24,9 @@
   @Column(name = "CONFIG_NAME", length = 200)
   private String configName;
 
+  @Column(name = "GLOBALFLAG", length = 200)
+  private Boolean globalflag = false;
+
   @Column(name = "tenantid", length = 20)
   @NotNull
   private String tenantid = "";
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
index 75fa85a..9e31db8 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
@@ -26,7 +26,7 @@
   @NotNull
   private String status;
 
-  @Column(name = "IDTYPE", length = 20)
+  @Column(name = "IDTYPE", length = 60)
   private String idtype;
 
   @Column(name = "IDNO", length = 30)
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
index 4d5ba84..91abab4 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
@@ -67,4 +67,21 @@
         return hexDigits[d1] + hexDigits[d2];  
     }
 
+    public static String encodeByMD5ForDlpay(String originString) {
+        if (originString != null) {
+            try {
+                //创建具有指定算法名称的信息摘要
+                MessageDigest md = MessageDigest.getInstance("MD5");
+                //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
+                byte[] results = md.digest(originString.getBytes("GBK"));
+                //将得到的字节数组变成字符串返回
+                String resultString = byteArrayToHexString(results);
+                return resultString;
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
index 66deb65..996af8e 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
@@ -7,8 +7,8 @@
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
+import javax.xml.bind.Unmarshaller;
+import java.io.*;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -38,56 +38,30 @@
     return xmlContent;
   }
 
-  /*
-    public static <T> T getXmlToObject(String xmlContent, Class clazz) {
+  public static <T> T getXmlToObject(String xmlContent, String charset, Class clazz) {
+    try {
+      JAXBContext context = JAXBContext.newInstance(clazz);
+      // xml转换为对象 XML------Object
+      InputStream inputStream;
       try {
-        JAXBContext context = JAXBContext.newInstance(clazz);
-        // xml转换为对象 XML------Object
-        InputStream inputStream;
-        try {
-          inputStream = new ByteArrayInputStream(
-              xmlContent.getBytes("GBK"));
-          Unmarshaller um = context.createUnmarshaller();
+        inputStream = new ByteArrayInputStream(
+            xmlContent.getBytes(charset));
+        Unmarshaller um = context.createUnmarshaller();
 
-          @Suppress("UNCHECKED_CAST")
-          return (T) um.unmarshal(inputStream);
-        } catch (UnsupportedEncodingException e) {
-          // TODO Auto-generated catch block
-          e.printStackTrace();
-        }catch (Exception e) {
-          e.printStackTrace();
-        }
-      } catch (JAXBException e) {
-
+        return (T) um.unmarshal(inputStream);
+      } catch (UnsupportedEncodingException e) {
+        // TODO Auto-generated catch block
+        e.printStackTrace();
+      } catch (Exception e) {
         e.printStackTrace();
       }
-      return null;
+    } catch (JAXBException e) {
+
+      e.printStackTrace();
     }
+    return null;
+  }
 
-    public static <T> T getXmlToObject(String xmlContent,String charset, Class clazz) {
-      try {
-        JAXBContext context = JAXBContext.newInstance(clazz);
-        // xml转换为对象 XML------Object
-        InputStream inputStream;
-        try {
-          inputStream = new ByteArrayInputStream(
-              xmlContent.getBytes(charset));
-          Unmarshaller um = context.createUnmarshaller();
-
-          return (T) um.unmarshal(inputStream);
-        } catch (UnsupportedEncodingException e) {
-          // TODO Auto-generated catch block
-          e.printStackTrace();
-        }catch (Exception e) {
-          e.printStackTrace();
-        }
-      } catch (JAXBException e) {
-
-        e.printStackTrace();
-      }
-      return null;
-    }
-  */
   public static Map<String, String> parseXml(String xml) throws Exception {
     Map<String, String> map = new HashMap<String, String>();
     Document document = DocumentHelper.parseText(xml);
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
index 5aa25fb..7f8bf3f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
@@ -13,6 +13,30 @@
 import java.util.Random;
 
 public class DlpayUtil {
+  public static final Map<String, String> errcode = new HashMap<>(0);
+
+  static {
+    errcode.put("0000", "成功");
+    errcode.put("0101", "手机号不一致");
+    errcode.put("0102", "无预留手机号");
+    errcode.put("0103", "证件类型不一致");
+    errcode.put("0104", "证件号码不一致");
+    errcode.put("0105", "户名不符");
+    errcode.put("0106", "卡状态异常");
+    errcode.put("0107", "无此卡号");
+    errcode.put("0201", "未进行银行卡绑定");
+    errcode.put("0202", "无效的交易类型");
+    errcode.put("0301", "未签约");
+    errcode.put("0302", "余额不足");
+    errcode.put("0303", "MD5校验失败");
+    errcode.put("0401", "原始流水不存在");
+    errcode.put("0402", "原始流水未成功");
+    errcode.put("0403", "原始流水已退款");
+    errcode.put("4004", "商户账户余额不足");
+    errcode.put("0405", "不在退款时间范围内");
+    errcode.put("0406", "当日无交易明细");
+  }
+
   /**
    * socket方式请求农商行
    */
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
index 3b5bd5e..430499c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -3,14 +3,14 @@
 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.BaseResp
-import com.supwisdom.dlpay.api.bean.SupStatusRevResp
-import com.supwisdom.dlpay.api.bean.SupYktResp
-import com.supwisdom.dlpay.api.bean.WechatReqResp
+import com.supwisdom.dlpay.api.bean.*
 import com.supwisdom.dlpay.api.domain.TPersondtl
 import com.supwisdom.dlpay.api.domain.TShopdtl
+import com.supwisdom.dlpay.api.util.IDTypes
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.Code
+import com.supwisdom.dlpay.util.DlpayUtil
+import mu.KotlinLogging
 
 class CallBackResp {
     var retcode: String = "99"
@@ -24,6 +24,8 @@
 class CallService {
 
     companion object {
+        private val logger = KotlinLogging.logger { }
+
         fun callYktPay(config: Map<String, String?>, paydtl: TPersondtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp {
             val code = CallBackResp()
             val appid = config["appid"]
@@ -235,6 +237,214 @@
             }
         }
 
+
+        /**
+         * 大理农商行银行卡绑定
+         * */
+        fun CallCitizenCardBind(config: Map<String, String?>, transdate: String, transtime: String, refno: String, bankcardno: String, name: String, idtype: String, idno: String, phone: String): CallBackResp {
+            val resp = CallBackResp()
+            val ip = config["socket.ip"]
+            val port = config["socket.port"]
+            val idType = IDTypes.findByValue(idtype)
+            if (ip.isNullOrEmpty() || port.isNullOrEmpty()) {
+                resp.retcode = "99"
+                resp.retmsg = "市民卡socket的IP和端口未配置"
+                return resp
+            }
+            if (idType < 0) {
+                resp.retcode = "99"
+                resp.retmsg = "证件类型未识别[$idtype]"
+                return resp
+            }
+
+            val req = DlpayReq().apply {
+                this.transdate = transdate
+                this.transtime = transtime
+                this.sn = refno
+                this.bcNo = bankcardno
+                this.name = name
+                this.idType = "$idType"
+                this.idNo = idno
+                this.phone = phone
+            }
+            logger.info("请求绑定银行卡发送报文:\n${req.bindCardXml}")
+            try {
+                val returnXml = DlpayUtil.send(ip, port.toInt(), 10, req.bindCardXml)
+                logger.info("请求绑定银行卡返回报文[$refno]:\n$returnXml")
+                if (returnXml.isNullOrEmpty()) {
+                    resp.retcode = "99"
+                    resp.retmsg = "请求绑定银行卡返回报文为空"
+                    return resp
+                }
+                val returnResp = XmlUtils.getXmlToObject<DlpayResp>(returnXml.substring(8), "GBK", DlpayResp::class.java)
+                if (null == returnResp) {
+                    resp.retcode = "99"
+                    resp.retmsg = "解析返回报文错误!"
+                    return resp
+                }
+
+                if ("0000" == returnResp.code) {
+                    resp.retcode = "0"
+                    resp.retmsg = "success"
+                    resp.add("outtradeno", returnResp.bankjourno) //银行流水号
+                    resp.add("verifycode", returnResp.captcha) //fixme:短信验证码!!
+                } else {
+                    resp.retcode = "99"
+                    resp.retmsg = returnResp.message
+                }
+                return resp
+            } catch (e: Exception) {
+                e.printStackTrace()
+                resp.retcode = "99"
+                resp.retmsg = "请求绑定银行卡异常!e:${e.message}"
+                return resp
+            }
+        }
+
+        /**
+         * 大理农商行银行卡签约/解约
+         * transtype:1-签约,2-解约
+         * */
+        fun CallCitizenCardSigned(config: Map<String, String?>, transdate: String, transtime: String, refno: String, bankcardno: String, name: String, idtype: String, idno: String, phone: String, transtype: String): CallBackResp {
+            val resp = CallBackResp()
+            val ip = config["socket.ip"]
+            val port = config["socket.port"]
+            val idType = IDTypes.findByValue(idtype)
+            if (ip.isNullOrEmpty() || port.isNullOrEmpty()) {
+                resp.retcode = "99"
+                resp.retmsg = "市民卡socket的IP和端口未配置"
+                return resp
+            }
+            if (idType < 0) {
+                resp.retcode = "99"
+                resp.retmsg = "证件类型未识别[$idtype]"
+                return resp
+            }
+            if ("1" != transtype && "2" != transtype) {
+                resp.retcode = "99"
+                resp.retmsg = "请求操作类型错误[$transtype]"
+                return resp
+            }
+
+            val req = DlpayReq().apply {
+                this.transdate = transdate
+                this.transtime = transtime
+                this.sn = refno
+                this.categorie = DlpayReq.DLPAY_CATEGORIE  //业务类别
+                this.bcNo = bankcardno
+                this.name = name
+                this.idType = "$idType"
+                this.idNo = idno
+                this.phone = phone
+                this.transType = transtype  //1-签约,2-解约
+            }
+            logger.info("代扣签(解)约发送报文:\n${req.signXml}")
+            try {
+                val returnXml = DlpayUtil.send(ip, port.toInt(), 10, req.signXml)
+                logger.info("请求代扣签(解)约返回报文[$refno]:\n$returnXml")
+                if (returnXml.isNullOrEmpty()) {
+                    resp.retcode = "99"
+                    resp.retmsg = "请求代扣签(解)约返回报文为空"
+                    return resp
+                }
+                val returnResp = XmlUtils.getXmlToObject<DlpayResp>(returnXml.substring(8), "GBK", DlpayResp::class.java)
+                if (null == returnResp) {
+                    resp.retcode = "99"
+                    resp.retmsg = "解析返回报文错误!"
+                    return resp
+                }
+
+                if ("0000" == returnResp.code) {
+                    resp.retcode = "0"
+                    resp.retmsg = "success"
+                    resp.add("outtradeno", returnResp.bankjourno) //银行流水号
+                } else {
+                    resp.retcode = "99"
+                    resp.retmsg = returnResp.message
+                }
+                return resp
+            } catch (e: Exception) {
+                e.printStackTrace()
+                resp.retcode = "99"
+                resp.retmsg = "请求代扣签(解)约异常!e:${e.message}"
+                return resp
+            }
+        }
+
+        /**
+         * 大理农商行银行卡代扣消费
+         * */
+        fun callCitizenCardPay(config: Map<String, String?>, transdate: String, transtime: String, refno: String, amount:Double, bankcardno: String, name: String, idtype: String, idno: String, phone: String): CallBackResp {
+            val resp = CallBackResp()
+            val ip = config["socket.ip"]
+            val port = config["socket.port"]
+            val merchantBankCardno = config["bankcardno"] //商户银行账号
+            val merchantBankAccname = config["bankaccname"] //商户银行开户名
+            val idType = IDTypes.findByValue(idtype)
+            if (ip.isNullOrEmpty() || port.isNullOrEmpty()) {
+                resp.retcode = "99"
+                resp.retmsg = "市民卡socket的IP和端口未配置"
+                return resp
+            }else if(merchantBankCardno.isNullOrEmpty() || merchantBankAccname.isNullOrEmpty()){
+                resp.retcode = "99"
+                resp.retmsg = "商户银行收款参数未配置"
+                return resp
+            }
+
+            if (idType < 0) {
+                resp.retcode = "99"
+                resp.retmsg = "证件类型未识别[$idtype]"
+                return resp
+            }
+
+            val req = DlpayReq().apply {
+                this.transdate = transdate
+                this.transtime = transtime
+                this.sn = refno
+                this.categorie = DlpayReq.DLPAY_CATEGORIE //业务代码
+                this.bcNo = bankcardno
+                this.name = name
+                this.idType = "$idType"
+                this.idNo = idno
+                this.merchantBcno = merchantBankCardno
+                this.merchantName = merchantBankAccname
+                this.amount = MoneyUtil.YuanToFen(amount)
+                this.description="市民卡代扣消费"
+            }
+            logger.info("请求代扣消费发送报文:\n${req.cardpayXml}")
+            try {
+                val returnXml = DlpayUtil.send(ip, port.toInt(), 10, req.cardpayXml)
+                logger.info("请求代扣消费返回报文[$refno]:\n$returnXml")
+                if (returnXml.isNullOrEmpty()) {
+                    resp.retcode = "99"
+                    resp.retmsg = "请求代扣消费返回报文为空"
+                    return resp
+                }
+                val returnResp = XmlUtils.getXmlToObject<DlpayResp>(returnXml.substring(8), "GBK", DlpayResp::class.java)
+                if (null == returnResp) {
+                    resp.retcode = "99"
+                    resp.retmsg = "解析返回报文错误!"
+                    return resp
+                }
+
+                if ("0000" == returnResp.code) {
+                    resp.retcode = "0"
+                    resp.retmsg = "success"
+                    resp.add("outtradeno", returnResp.bankjourno) //银行流水号
+                } else {
+                    resp.retcode = "99"
+                    resp.retmsg = returnResp.message
+                }
+                return resp
+            } catch (e: Exception) {
+                e.printStackTrace()
+                //fixme: 查询逻辑?
+                resp.retcode = "99"
+                resp.retmsg = "请求代扣消费异常!e:${e.message}"
+                return resp
+            }
+        }
+
         fun CallCitizenCardPay(config: Map<String, String?>, paydtl: TShopdtl): CallBackResp {
             val resp = CallBackResp()
             resp.retcode = "0"
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index d373525..739b2c3 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -2,10 +2,8 @@
 
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
-import com.supwisdom.dlpay.api.APIRequestParam
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.framework.util.*
-import com.supwisdom.dlpay.util.ConstantUtil
 import com.supwisdom.dlpay.util.DESedeUtil
 
 class DaliDatasyncParam {
@@ -45,7 +43,7 @@
 
     fun decData(deskey: String): ArrayList<DaliDatasyncDetail> {
         try {
-            val listType = object : TypeToken<ArrayList<ConsumeFeetype>>() {}.type
+            val listType = object : TypeToken<ArrayList<DaliDatasyncDetail>>() {}.type
             val decstr = DESedeUtil.getInstance(deskey).decode(data)
             return Gson().fromJson(decstr, listType)
         } catch (e: Exception) {
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index 37daf22..fdec8f7 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -452,32 +452,38 @@
 VALUES ('wechat', 't', '微信支付', 't', 't', 't', 't', 'f', '{tenantid}');
 
 -- 支付方式
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('yktpay','appid',null,'100005', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('yktpay','appkey',null,'adc4ac6822fd462780f878b86cb94688', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('yktpay','orderurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/pay', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('yktpay','reverseurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/payreverse', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'alipay.gateway', '支付宝网关地址', 'https://openapi.alipay.com/gateway.do', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'enable.paymethod', '支付渠道', 'balance,moneyFund,debitCardExpress,bankPay,pcredit', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'notify.url', '异步通知地址', 'http://ykt.supwisdom.com:9116/epay/zfb/newnotify', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'timeout.express', '支付超时时间', '5m', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'alipay.public.key', '支付宝商户应用的支付宝公钥', NULL, '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'alipay.rsa.private.key', '支付宝商户应用RSA私钥', NULL, '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'alipay.rsa.public.key', '支付宝商户应用RSA公钥', NULL, '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'appid', '支付宝应用APPID', NULL, '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('citizenCard', 'bankcardno', NULL, NULL, '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('yktpay','appid',null,'100005', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('yktpay','appkey',null,'adc4ac6822fd462780f878b86cb94688', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('yktpay','orderurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/pay', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('yktpay','reverseurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/payreverse', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'alipay.gateway', '支付宝网关地址', 'https://openapi.alipay.com/gateway.do', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'enable.paymethod', '支付渠道', 'balance,moneyFund,debitCardExpress,bankPay,pcredit', 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'notify.url', '异步通知地址', 'http://ykt.supwisdom.com:9116/epay/zfb/newnotify', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'timeout.express', '支付超时时间', '5m', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'alipay.public.key', '支付宝商户应用的支付宝公钥', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'alipay.rsa.private.key', '支付宝商户应用RSA私钥', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'alipay.rsa.public.key', '支付宝商户应用RSA公钥', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'appid', '支付宝应用APPID', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('citizenCard', 'socket.ip', 'socket的IP', NULL, 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('citizenCard', 'socket.port', 'socket的端口', NULL, 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('citizenCard', 'bankcardno', '商户银行卡号', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('citizenCard', '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}');
@@ -511,18 +517,27 @@
 VALUES ('cancel','dtlStatusList', '交易取消', '流水状态', '{tenantid}');
 
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('1', 'idtypeList', '身份证', '证件类型', '{tenantid}');
+VALUES ('idcard', 'idtypeList', '身份证', '证件类型', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('2', 'idtypeList', '护照', '证件类型', '{tenantid}');
+VALUES ('residence_booklet', 'idtypeList', '户口簿', '证件类型', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('3', 'idtypeList', '驾照', '证件类型', '{tenantid}');
+VALUES ('passport', 'idtypeList', '护照', '证件类型', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('4', 'idtypeList', '港澳通行证', '证件类型', '{tenantid}');
+VALUES ('hk_macau_pass', 'idtypeList', '港澳居民来往内地通行证', '证件类型', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('5', 'idtypeList', '学工号', '证件类型', '{tenantid}');
+VALUES ('taiwan_pass', 'idtypeList', '港澳通行证', '台湾同胞来往内地通行证', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('9', 'idtypeList', '其他', '证件类型', '{tenantid}');
-
+VALUES ('foreigner_residence_permit', 'idtypeList', '港澳通行证', '外国人居留证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('military_idcard', 'idtypeList', '港澳通行证', '军官证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('soldier_idcard', 'idtypeList', '港澳通行证', '士兵证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('driving_license', 'idtypeList', '驾照', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('student_idcard', 'idtypeList', '学工号', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('unknown', 'idtypeList', '其他', '证件类型', '{tenantid}');
 
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
 VALUES ('male', 'sexList', '男', '性别', '{tenantid}');