diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ShopProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ShopProxy.java
index adb2b3c..4562fa2 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ShopProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ShopProxy.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.paysdk.proxy;
 
+import com.supwisdom.dlpay.api.bean.DownloadShopBillParam;
 import com.supwisdom.dlpay.api.bean.OpenShopParam;
 import com.supwisdom.dlpay.api.bean.QueryShopParam;
 import com.supwisdom.dlpay.api.bean.ShopResponse;
@@ -17,4 +18,7 @@
 
   @GetMapping("/query")
   ShopResponse queryShop(@RequestBody QueryShopParam param);
+
+  @PostMapping("/downloadshopbill")
+  String downloadShopBill(@RequestBody DownloadShopBillParam param);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java
index 7781be6..4b3ace3 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java
@@ -24,4 +24,12 @@
 
   @Query("from TCard t where cardtype='citizencard' and t.lastsaved>?1 and t.lastsaved<=?2 ")
   List<TCard> findCitizencardByLastsaved(String startdate, String enddate);
+
+  @Query("from TCard t where t.cardtype='citizencard' and t.cardphyid=?1 order by t.cardno")
+  List<TCard> findCitizencardByCardphyid(String cardphyid);
+
+  @Query("from TCard t where t.cardtype='citizencard' and t.cardphyid=?1 and t.id<>?2 order by t.cardno")
+  List<TCard> findCitizencardByCardphyidWithoutOldId(String cardphyid, String oldId);
+
+  TCard getById(String id);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
index 150f0cd..56e0cae 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
@@ -264,7 +264,7 @@
         + MoneyUtil.YuanToFen(this.availbal)
         + MoneyUtil.YuanToFen(this.balance)
         + MoneyUtil.YuanToFen(this.frozebal);
-    System.out.println("accno="+this.accno+",data="+data);
+//    System.out.println("accno="+this.accno+",data="+data);
     return Signature.generateTac(this.accno, data);
   }
 
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java
index 184130f..a0173a0 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java
@@ -16,7 +16,7 @@
     if (tenant == null) {
       throw new IllegalArgumentException("TenantID 未定义");
     }
-    System.out.println("factor="+factor+",data="+data+",tenant="+tenant);
+//    System.out.println("factor="+factor+",data="+data+",tenant="+tenant);
     return HMACUtil.sha256HMAC(deliveryKey(tenant, factor), data).substring(0, 24);
   }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
index 628137b..adc71b5 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
@@ -221,4 +221,55 @@
     }
     return false;
   }
+
+  public static boolean isNumber(String inputStr) {
+    char[] ch = inputStr.toCharArray();
+    for (int i = 0; i < ch.length; i++) {
+      if ((ch[i] < '0') || (ch[i] > '9')) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  public static boolean isCardphyid(String str) {
+    if (null != str && str.matches("^[A-F0-9]+$")) {
+      return true;
+    }
+    return false;
+  }
+
+  private static char getBankCardCheckCode(String nonCheckCodeBankCard) {
+    if (nonCheckCodeBankCard == null || nonCheckCodeBankCard.trim().length() == 0 || !nonCheckCodeBankCard.matches("\\d+")) {
+      //如果传的不是数字返回N
+      return 'N';
+    }
+    char[] chs = nonCheckCodeBankCard.trim().toCharArray();
+    int luhmSum = 0;
+    for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
+      int k = chs[i] - '0';
+      if (j % 2 == 0) {
+        k *= 2;
+        k = k / 10 + k % 10;
+      }
+      luhmSum += k;
+    }
+    return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');
+  }
+
+  /**
+   * 判断是否是银行卡号
+   * */
+  public static boolean isBankcardno(String bankCard) {
+    if (bankCard.length() < 15 || bankCard.length() > 19) {
+      return false;
+    }
+    char bit = getBankCardCheckCode(bankCard.substring(0, bankCard.length() - 1));
+    if (bit == 'N') {
+      return false;
+    }
+    return bankCard.charAt(bankCard.length() - 1) == bit;
+  }
+
+
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java
index b5c095d..5f4961b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/CitizenCardShowBean.java
@@ -17,6 +17,7 @@
   private String idno;
   private String mobile;
   private String email;
+  private String sex;
 
   public String getCid() {
     return cid;
@@ -145,4 +146,12 @@
   public void setEmail(String email) {
     this.email = email;
   }
+
+  public String getSex() {
+    return sex;
+  }
+
+  public void setSex(String sex) {
+    this.sex = sex;
+  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
index fe353a1..eb36de9 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
@@ -3,27 +3,22 @@
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.domain.TAccount;
 import com.supwisdom.dlpay.api.domain.TPerson;
-import com.supwisdom.dlpay.api.domain.TPersonIdentity;
 import com.supwisdom.dlpay.api.domain.TPointsAccount;
-import com.supwisdom.dlpay.framework.domain.TOperator;
-import com.supwisdom.dlpay.framework.util.Dictionary;
-import com.supwisdom.dlpay.framework.util.PageResult;
-import com.supwisdom.dlpay.framework.util.StringUtil;
-import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.system.bean.CitizenCardSearchBean;
 import com.supwisdom.dlpay.system.bean.CitizenCardShowBean;
-import com.supwisdom.dlpay.system.bean.IdTypeBean;
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
 import com.supwisdom.dlpay.system.service.DictionaryProxy;
 import com.supwisdom.dlpay.system.service.UserDataService;
+import com.supwisdom.dlpay.util.WebCheckException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.ArrayList;
-import java.util.List;
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
 
 @Controller
 public class UserController {
@@ -177,7 +172,7 @@
   @GetMapping("/user/cardlist")
   @PreAuthorize("hasPermission('/user/card','')")
   @ResponseBody
-  public PageResult<CitizenCardShowBean> getBusinessDataList(@RequestParam("page") Integer pageNo,
+  public PageResult<CitizenCardShowBean> getCitizenCardList(@RequestParam("page") Integer pageNo,
                                                              @RequestParam("limit") Integer pageSize,
                                                              @RequestParam(value = "cardno", required = false) String cardno,
                                                              @RequestParam(value = "cardphyid", required = false) String cardphyid,
@@ -194,4 +189,93 @@
       return new PageResult<>(99, "系统查询错误");
     }
   }
+
+  @GetMapping("/user/load4addcard")
+  @PreAuthorize("hasPermission('/user/load4addcard','')")
+  public String addCitizenCard() {
+    return "system/user/addcard";
+  }
+
+  @PostMapping("/user/cardadd")
+  @PreAuthorize("hasPermission('/user/cardadd','')")
+  @ResponseBody
+  public JsonResult addCitizencard(@RequestParam(value = "cardno", required = false) String cardno,
+                                   @RequestParam(value = "cardphyid", required = false) String cardphyid,
+                                   @RequestParam(value = "expiredate", required = false) String expiredate,
+                                   @RequestParam(value = "cardstatus", required = false) String cardstatus,
+                                   @RequestParam(value = "bankcardno", required = false) String bankcardno,
+                                   @RequestParam(value = "signstatus", required = false) String signstatus,
+                                   @RequestParam(value = "username", required = false) String username,
+                                   @RequestParam(value = "sex", required = false) String sex,
+                                   @RequestParam(value = "idtype", required = false) String idtype,
+                                   @RequestParam(value = "idno", required = false) String idno,
+                                   @RequestParam(value = "mobile", required = false) String mobile,
+                                   @RequestParam(value = "email", required = false) String email) {
+    try {
+      if (userDataService.doSaveNewCitizenCard(cardno, cardphyid, expiredate, cardstatus, bankcardno, signstatus, username, sex, idtype, idno, mobile, email)) {
+        return JsonResult.ok("新增成功！");
+      } else {
+        return JsonResult.error("新增失败！");
+      }
+    } catch (WebCheckException wce) {
+      return JsonResult.error(wce.getMessage());
+    } catch (Exception e) {
+      return dealViolationException(e, "新增异常！！");
+    }
+  }
+
+  private JsonResult dealViolationException(Exception e, String defaultErrmsg) {
+    String errmsg = "";
+    if (e instanceof ConstraintViolationException) {
+      ConstraintViolationException cve = (ConstraintViolationException) e;
+      if (null != cve.getConstraintViolations()) {
+        for (ConstraintViolation v : cve.getConstraintViolations()) {
+          errmsg += v.getMessage() + " ";
+        }
+      }
+    }
+    if (!StringUtil.isEmpty(errmsg)) {
+      return JsonResult.error(errmsg);
+    } else {
+      e.printStackTrace();
+      return JsonResult.error(defaultErrmsg);
+    }
+  }
+
+  @GetMapping("/user/load4modifycard")
+  @PreAuthorize("hasPermission('/user/load4modifycard','')")
+  public String load4UpdateCitizenCard() {
+    return "system/user/updatecard";
+  }
+
+  @PostMapping("/user/cardupdate")
+  @PreAuthorize("hasPermission('/user/cardupdate','')")
+  @ResponseBody
+  public JsonResult addCitizencard(@RequestParam(value = "cid") String cid,
+                                   @RequestParam(value = "bkid") String bkid,
+                                   @RequestParam(value = "cardno", required = false) String cardno,
+                                   @RequestParam(value = "cardphyid", required = false) String cardphyid,
+                                   @RequestParam(value = "expiredate", required = false) String expiredate,
+                                   @RequestParam(value = "cardstatus", required = false) String cardstatus,
+                                   @RequestParam(value = "bankcardno", required = false) String bankcardno,
+                                   @RequestParam(value = "signstatus", required = false) String signstatus,
+                                   @RequestParam(value = "username", required = false) String username,
+                                   @RequestParam(value = "sex", required = false) String sex,
+                                   @RequestParam(value = "idtype", required = false) String idtype,
+                                   @RequestParam(value = "idno", required = false) String idno,
+                                   @RequestParam(value = "mobile", required = false) String mobile,
+                                   @RequestParam(value = "email", required = false) String email) {
+    try {
+      if (userDataService.doUpdateCitizenCard(cid, bkid, cardno, cardphyid, expiredate, cardstatus, bankcardno, signstatus, username, sex, idtype, idno, mobile, email)) {
+        return JsonResult.ok("修改成功！");
+      } else {
+        return JsonResult.error("修改失败！");
+      }
+    } catch (WebCheckException wce) {
+      return JsonResult.error(wce.getMessage());
+    } catch (Exception e) {
+      return dealViolationException(e, "修改异常！！！");
+    }
+  }
+
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
index 3140f79..8cc7a5b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
@@ -1,14 +1,12 @@
 package com.supwisdom.dlpay.system.service;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
-import com.supwisdom.dlpay.api.domain.TAccount;
-import com.supwisdom.dlpay.api.domain.TPerson;
-import com.supwisdom.dlpay.api.domain.TPersonIdentity;
-import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.api.domain.*;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.CitizenCardSearchBean;
 import com.supwisdom.dlpay.system.bean.CitizenCardShowBean;
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
+import com.supwisdom.dlpay.util.WebCheckException;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -48,4 +46,16 @@
      * */
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<CitizenCardShowBean> getUserCitizenCardPage(CitizenCardSearchBean param, int pageNo, int pageSize);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    boolean doSaveNewCitizenCard(String cardno, String cardphyid, String expiredate, String cardstatus, String bankcardno,
+                                 String signstatus, String username, String sex, String idtype, String idno, String mobile,
+                                 String email) throws Exception;
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    boolean doUpdateCitizenCard(String cid, String bkid, String cardno, String cardphyid, String expiredate, String cardstatus,
+                                String bankcardno, String signstatus, String username, String sex, String idtype, String idno,
+                                String mobile, String email) throws Exception;
+
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
index a42e636..01105f8 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
@@ -1,14 +1,10 @@
 package com.supwisdom.dlpay.system.service.impl;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
-import com.supwisdom.dlpay.api.dao.AccountDao;
-import com.supwisdom.dlpay.api.dao.PersonDao;
-import com.supwisdom.dlpay.api.dao.PersonIdentityDao;
-import com.supwisdom.dlpay.api.dao.PointsAccountDao;
-import com.supwisdom.dlpay.api.domain.TAccount;
-import com.supwisdom.dlpay.api.domain.TPerson;
-import com.supwisdom.dlpay.api.domain.TPersonIdentity;
-import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.api.dao.*;
+import com.supwisdom.dlpay.api.domain.*;
+import com.supwisdom.dlpay.api.types.IDTypes;
+import com.supwisdom.dlpay.api.types.SexTypes;
 import com.supwisdom.dlpay.framework.data.SystemDateTime;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.tenant.TenantContext;
@@ -17,6 +13,8 @@
 import com.supwisdom.dlpay.system.bean.CitizenCardShowBean;
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
 import com.supwisdom.dlpay.system.service.UserDataService;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import com.supwisdom.dlpay.util.WebCheckException;
 import org.hibernate.query.internal.NativeQueryImpl;
 import org.hibernate.transform.Transformers;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +27,7 @@
 import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
 import java.math.BigInteger;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 
@@ -44,6 +43,8 @@
   private SystemUtilService systemUtilService;
   @Autowired
   private PersonIdentityDao personIdentityDao;
+  @Autowired
+  private CardDao cardDao;
 
   @PersistenceContext
   private EntityManager entityManager;
@@ -195,7 +196,7 @@
 
   @Override
   public PageResult<CitizenCardShowBean> getUserCitizenCardPage(CitizenCardSearchBean param, int pageNo, int pageSize) {
-    StringBuffer querySql = new StringBuffer("select t.id as cid,t.cardno,t.cardtype,t.cardphyid,case when t.status='closed' then 'closed' else t.trans_status end as status,t.expiredate,a.id as bkid,a.cardno as bankcardno,a.signed,t.lastsaved,t.userid,p.name as username,p.idtype,p.idno,p.mobile,p.email \n" +
+    StringBuffer querySql = new StringBuffer("select t.id as cid,t.cardno,t.cardtype,t.cardphyid,case when t.status='closed' then 'closed' else t.trans_status end as status,t.expiredate,a.id as bkid,a.cardno as bankcardno,a.signed,t.lastsaved,t.userid,p.name as username,p.idtype,p.idno,p.mobile,p.email,p.sex \n" +
         "from tb_card t left join tb_card a on a.cardtype='bankcard' and a.cardphyid=t.cardphyid and a.userid=t.userid left join tb_person p on p.userid=t.userid \n" +
         "where t.cardtype='citizencard' ");
     StringBuffer countSql = new StringBuffer("select count(t.id) as cnt \n" +
@@ -251,4 +252,331 @@
     BigInteger cnt = (BigInteger) countQuery.getSingleResult();
     return new PageResult<>(cnt.longValue(), list);
   }
+
+  private boolean checkCitizenCardData(String cardno, String cardphyid, String expiredate, String cardstatus, String bankcardno,
+                                       String signstatus, String username, String sex, String idtype, String idno, String mobile,
+                                       String email) throws WebCheckException {
+    if (StringUtil.isEmpty(cardno)) throw new WebCheckException("市民卡号不能为空");
+    if (!StringUtil.isNumber(cardno.trim())) throw new WebCheckException("请正确填写市民卡号");
+
+    if (StringUtil.isEmpty(cardphyid)) throw new WebCheckException("物理卡号不能为空");
+    if (!StringUtil.isCardphyid(cardphyid.trim()) || cardphyid.trim().length() != 8)
+      throw new WebCheckException("请正确填写八位物理卡号(八位十六进制数，字母大写)");
+
+    if (StringUtil.isEmpty(expiredate)) throw new WebCheckException("请填写卡有效期");
+    if (!DateUtil.checkDatetimeValid(expiredate.trim(), "yyyy-MM-dd")) throw new WebCheckException("请正确填写卡有效期");
+
+    if (StringUtil.isEmpty(cardstatus)) throw new WebCheckException("请选择卡状态");
+    if (!Arrays.asList(TradeDict.STATUS_NORMAL, TradeDict.STATUS_CLOSED, TradeDict.STATUS_ABNORMAL, TradeDict.STATUS_UNUSE).contains(cardstatus.trim()))
+      throw new WebCheckException("请正确选择卡状态");
+
+    if (StringUtil.isEmpty(bankcardno)) throw new WebCheckException("请填写银行卡号");
+    if (!StringUtil.isBankcardno(bankcardno.trim())) throw new WebCheckException("请正确填写银行卡号");
+
+    if (StringUtil.isEmpty(signstatus)) throw new WebCheckException("请选择银行卡签约状态");
+    if (!"0".equals(signstatus.trim()) && !"1".equals(signstatus.trim())) throw new WebCheckException("请选择银行卡签约状态");
+
+    if (StringUtil.isEmpty(username)) throw new WebCheckException("请填写姓名");
+
+    if (StringUtil.isEmpty(sex)) throw new WebCheckException("请选择性别");
+    if (Arrays.asList(SexTypes.ALL).contains(sex.trim())) throw new WebCheckException("请正确选择性别");
+
+    if (StringUtil.isEmpty(idtype)) throw new WebCheckException("请选择证件类别");
+    if (-999 == IDTypes.findByValue(idtype.trim())) throw new WebCheckException("请正确选择证件类别");
+
+    if (StringUtil.isEmpty(idno)) throw new WebCheckException("请填写证件号");
+    if (IDTypes.IDCARD.value().equals(idtype.trim()) && !StringUtil.isIdentity(idno.trim()))
+      throw new WebCheckException("请正确填写身份证号");
+
+    if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile.trim())) throw new WebCheckException("请正确填写手机号");
+    if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email.trim())) throw new WebCheckException("请正确填写电子邮箱");
+    return true;
+  }
+
+  @Override
+  public boolean doSaveNewCitizenCard(String cardno, String cardphyid, String expiredate, String cardstatus, String bankcardno,
+                                      String signstatus, String username, String sex, String idtype, String idno, String mobile,
+                                      String email) throws Exception {
+    if (checkCitizenCardData(cardno, cardphyid, expiredate, cardstatus, bankcardno, signstatus, username, sex, idtype, idno, mobile, email)) {
+      double maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.BALANCE_LIMIT, SysparaUtil.DEFAULT_BALANCE_LIMIT);
+      double lowfreeLimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.NOPASS_LIMIT, SysparaUtil.DEFAULT_NOPASS_LIMIT);
+      double daylimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.DAY_PAY_LIMIT, SysparaUtil.DEFAULT_DAY_PAY_LIMIT);
+
+      TCard cityCard = cardDao.findCardByCardnoAndCardtype(cardno.trim(), ConstantUtil.CARDTYPE_CITIZENCARD);
+      if (null != cityCard) throw new WebCheckException("市民卡号已经存在！");
+
+      TCard bankCard = cardDao.findCardByCardnoAndCardtype(bankcardno.trim(), ConstantUtil.CARDTYPE_BANKCARD);
+      if (null != bankCard) throw new WebCheckException("银行卡号已经存在！");
+
+      List<TCard> cardList = cardDao.findCitizencardByCardphyid(cardphyid.trim());
+      if (!StringUtil.isEmpty(cardList)) throw new WebCheckException("物理卡号已经存在！");
+
+      TPerson person = personDao.findByIdentity(idtype.trim(), idno.trim());
+      if (null != person && username.trim().equals(person.getName()))
+        throw new WebCheckException("证件号对应的用户已经存在，且姓名不匹配！");
+
+      SystemDateTime dt = systemUtilService.getSysdatetime();
+      if (null != person) {
+        boolean needUpdate = false;
+        if (!sex.trim().equals(person.getSex())) {
+          person.setSex(sex.trim());
+          needUpdate = true;
+        }
+        if (!StringUtil.isEmpty(mobile) && !mobile.trim().equals(person.getMobile())) {
+          person.setMobile(mobile.trim());
+          needUpdate = true;
+        }
+        if (!StringUtil.isEmpty(email) && !email.trim().equals(person.getEmail())) {
+          person.setEmail(email.trim());
+          needUpdate = true;
+        }
+        if (needUpdate) {
+          person.setLastsaved(dt.getHostdatetime());
+          personDao.save(person);
+        }
+      } else {
+        person = new TPerson();
+        person.setName(username.trim());
+        person.setSex(sex.trim());
+        person.setStatus(TradeDict.STATUS_NORMAL);
+        person.setIdtype(idtype.trim());
+        person.setIdno(idno.trim());
+        person.setEmail(null == email ? null : email.trim());
+        person.setMobile(null == mobile ? null : mobile.trim());
+        person.setLastsaved(dt.getHostdatetime());
+        person.setTenantid(TenantContext.getTenantSchema());
+        person = personDao.save(person);
+
+        TAccount account = new TAccount();
+        account.setAccname(person.getName());
+        account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT);
+        account.setUserid(person.getUserid());
+        account.setTransStatus(person.getStatus());
+        account.setBalance(0D);
+        account.setAvailbal(0D);
+        account.setFrozebal(0D);
+        account.setLowfreeFlag(false);
+        account.setLowfreeLimit(lowfreeLimit);
+        account.setDaylimit(daylimit);
+        account.setMaxbal(maxbal);
+        account.setLasttranstime(dt.getSysdate());
+        account.setLastdayDpsamt(0D);
+        account.setLastdayTransamt(0D);
+        account.setOpendate(dt.getHostdate());
+        account.setTac(Signature.SPY_TAC);
+        account.setTenantid(person.getTenantid());
+        account = accountDao.save(account);
+        account.setTac(account.generateTac());
+        accountDao.save(account);
+      }
+
+      cityCard = new TCard(); //新增市民卡
+      cityCard.setCardno(cardno.trim());
+      cityCard.setCardtype(ConstantUtil.CARDTYPE_CITIZENCARD);
+      cityCard.setCardphyid(cardphyid.trim());
+      cityCard.setStatus(TradeDict.STATUS_NORMAL);
+      cityCard.setTransStatus(cardstatus.trim());
+      if (TradeDict.STATUS_CLOSED.equals(cardstatus.trim())) {
+        cityCard.setStatus(TradeDict.STATUS_CLOSED);
+        cityCard.setTransStatus(TradeDict.STATUS_ABNORMAL);
+      }
+      cityCard.setExpiredate(DateUtil.unParseToDateFormat(expiredate.trim()));
+      cityCard.setSigned(false);
+      cityCard.setUserid(person.getUserid());
+      cityCard.setLastsaved(dt.getHostdatetime());
+      cityCard.setTenantid(person.getTenantid());
+      cardDao.save(cityCard);
+
+      bankCard = new TCard(); //新增银行卡
+      bankCard.setCardno(bankcardno.trim());
+      bankCard.setCardtype(ConstantUtil.CARDTYPE_BANKCARD);
+      bankCard.setCardphyid(cardphyid.trim());
+      bankCard.setStatus(TradeDict.STATUS_NORMAL);
+      bankCard.setTransStatus(TradeDict.STATUS_NORMAL);
+      if (TradeDict.STATUS_CLOSED.equals(cardstatus.trim())) {
+        bankCard.setStatus(TradeDict.STATUS_CLOSED);
+      }
+      bankCard.setExpiredate("21991231");
+      bankCard.setSigned("1".equals(signstatus.trim()));
+      bankCard.setUserid(person.getUserid());
+      bankCard.setLastsaved(dt.getHostdatetime());
+      bankCard.setTenantid(person.getTenantid());
+      if (TradeDict.STATUS_NORMAL.equals(bankCard.getStatus())) {
+        cardDao.closedBankcardStatusByUserid(bankCard.getUserid());  //注销其他银行卡
+      }
+      cardDao.save(bankCard);
+      return true;
+    }
+    return false;
+  }
+
+  private TCard findCardById(String id) {
+    if (!StringUtil.isEmpty(id)) return cardDao.getById(id.trim());
+    return null;
+  }
+
+  @Override
+  public boolean doUpdateCitizenCard(String cid, String bkid, String cardno, String cardphyid, String expiredate, String cardstatus,
+                                     String bankcardno, String signstatus, String username, String sex, String idtype, String idno,
+                                     String mobile, String email) throws Exception {
+    TCard cityCard = findCardById(cid);
+    TCard bankCard = findCardById(bkid);
+    if (null == cityCard || null == bankCard ||
+        !ConstantUtil.CARDTYPE_CITIZENCARD.equals(cityCard.getCardtype()) ||
+        !ConstantUtil.CARDTYPE_BANKCARD.equals(bankCard.getCardtype()) ||
+        !cityCard.getUserid().equals(bankCard.getUserid()) ||
+        !cityCard.getCardphyid().equals(bankCard.getCardphyid())) {
+      throw new WebCheckException("请求参数错误，请重新查询！");
+    }
+    TPerson person = personDao.findByUserid(cityCard.getUserid());
+    if(null==person) throw new WebCheckException("请求参数错误，请重新查询！");
+
+    if (checkCitizenCardData(cardno, cardphyid, expiredate, cardstatus, bankcardno, signstatus, username, sex, idtype, idno, mobile, email)) {
+      TPerson owner = null; //市民卡拥有者
+      SystemDateTime dt = systemUtilService.getSysdatetime();
+      if(idtype.trim().equals(person.getIdtype()) && idno.trim().equals(person.getIdno())){
+        //同一用户
+        if(!username.trim().equals(person.getName())) throw new WebCheckException("数据异常！证件号对应的用户已经存在，但姓名不匹配！");
+        owner = person;
+      }else{
+        //改变了所有者
+        TPerson newPerson = personDao.findByIdentity(idtype.trim(), idno.trim());
+        if(null!=newPerson && !username.trim().equals(newPerson.getName())) throw new WebCheckException("数据异常！证件号对应的用户已经存在，但姓名不匹配！");
+        if(null==newPerson){
+          //新增
+          double maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.BALANCE_LIMIT, SysparaUtil.DEFAULT_BALANCE_LIMIT);
+          double lowfreeLimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.NOPASS_LIMIT, SysparaUtil.DEFAULT_NOPASS_LIMIT);
+          double daylimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.DAY_PAY_LIMIT, SysparaUtil.DEFAULT_DAY_PAY_LIMIT);
+
+          newPerson = new TPerson();
+          newPerson.setName(username.trim());
+          newPerson.setSex(sex.trim());
+          newPerson.setStatus(TradeDict.STATUS_NORMAL);
+          newPerson.setIdtype(idtype.trim());
+          newPerson.setIdno(idno.trim());
+          newPerson.setEmail(null == email ? null : email.trim());
+          newPerson.setMobile(null == mobile ? null : mobile.trim());
+          newPerson.setLastsaved(dt.getHostdatetime());
+          newPerson.setTenantid(TenantContext.getTenantSchema());
+          newPerson = personDao.save(newPerson);
+
+          TAccount account = new TAccount();
+          account.setAccname(newPerson.getName());
+          account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT);
+          account.setUserid(newPerson.getUserid());
+          account.setTransStatus(newPerson.getStatus());
+          account.setBalance(0D);
+          account.setAvailbal(0D);
+          account.setFrozebal(0D);
+          account.setLowfreeFlag(false);
+          account.setLowfreeLimit(lowfreeLimit);
+          account.setDaylimit(daylimit);
+          account.setMaxbal(maxbal);
+          account.setLasttranstime(dt.getSysdate());
+          account.setLastdayDpsamt(0D);
+          account.setLastdayTransamt(0D);
+          account.setOpendate(dt.getHostdate());
+          account.setTac(Signature.SPY_TAC);
+          account.setTenantid(person.getTenantid());
+          account = accountDao.save(account);
+          account.setTac(account.generateTac());
+          accountDao.save(account);
+        }
+        owner = newPerson;
+      }
+      if(null== owner) throw new WebCheckException("业务处理异常！");
+
+      boolean needUpdate = false;
+      if (!sex.trim().equals(owner.getSex())) {
+        owner.setSex(sex.trim());
+        needUpdate = true;
+      }
+      if (!StringUtil.isEmpty(mobile) && !mobile.trim().equals(owner.getMobile())) {
+        owner.setMobile(mobile.trim());
+        needUpdate = true;
+      }
+      if (!StringUtil.isEmpty(email) && !email.trim().equals(owner.getEmail())) {
+        owner.setEmail(email.trim());
+        needUpdate = true;
+      }
+      if (needUpdate) {
+        owner.setLastsaved(dt.getHostdatetime());
+        personDao.save(owner);
+      }
+
+      boolean cardUpdate = false;
+      if(!cardno.trim().equals(cityCard.getCardno())){
+        //市民卡号变更
+        if (null != cardDao.findCardByCardnoAndCardtype(cardno.trim(), ConstantUtil.CARDTYPE_CITIZENCARD)) throw new WebCheckException("市民卡号已经存在");
+
+        cityCard.setCardno(cardno.trim());
+        cardUpdate = true;
+      }
+      if(!cardphyid.trim().equals(cityCard.getCardphyid())){
+        List<TCard> cardList = cardDao.findCitizencardByCardphyidWithoutOldId(cardphyid.trim(), cityCard.getId());
+        if (!StringUtil.isEmpty(cardList)) throw new WebCheckException("物理卡号已经存在！");
+
+        cityCard.setCardphyid(cardphyid.trim());
+        cardUpdate = true;
+      }
+
+      String newExpiredate = DateUtil.unParseToDateFormat(expiredate);
+      if(!newExpiredate.equals(cityCard.getExpiredate())){
+        cityCard.setExpiredate(newExpiredate);
+        cardUpdate = true;
+      }
+
+      if (TradeDict.STATUS_CLOSED.equals(cardstatus.trim())) {
+        if (!TradeDict.STATUS_CLOSED.equals(cityCard.getStatus())) {
+          cityCard.setStatus(TradeDict.STATUS_CLOSED);
+          cardUpdate = true;
+        }
+      } else if (!cardstatus.trim().equals(cityCard.getTransStatus())) {
+        cityCard.setTransStatus(cardstatus.trim());
+        cardUpdate = true;
+      }
+      if(!cityCard.getUserid().equals(owner.getUserid())){
+        cityCard.setUserid(owner.getUserid());
+        cardUpdate = true;
+      }
+
+      if(cardUpdate){
+        cityCard.setLastsaved(dt.getHostdatetime());
+        cardDao.save(cityCard);
+      }
+
+      boolean bankcardUpdate = false;
+      if(!bankcardno.trim().equals(bankCard.getCardno())){
+        if (null != cardDao.findCardByCardnoAndCardtype(bankcardno.trim(), ConstantUtil.CARDTYPE_BANKCARD)) throw new WebCheckException("银行卡号已经存在");
+        bankCard.setCardno(bankcardno.trim());
+        bankCard.setSigned("1".equals(signstatus));
+        bankcardUpdate = true;
+      }
+      if(!cardphyid.trim().equals(bankCard.getCardphyid())){
+        bankCard.setCardphyid(cityCard.getCardphyid());
+        bankcardUpdate = true;
+      }
+      if(TradeDict.STATUS_CLOSED.equals(cardstatus.trim()) && !TradeDict.STATUS_CLOSED.equals(bankCard.getStatus())){
+        bankCard.setStatus(TradeDict.STATUS_CLOSED);
+        bankcardUpdate = true;
+      }
+      if(!bankCard.getSigned().equals("1".equals(signstatus.trim()))){
+        bankCard.setSigned("1".equals(signstatus.trim()));
+        bankcardUpdate = true;
+      }
+
+      if(!bankCard.getUserid().equals(owner.getUserid())){
+        bankCard.setUserid(cityCard.getUserid());
+        bankcardUpdate = true;
+      }
+
+      if(bankcardUpdate){
+        bankCard.setLastsaved(dt.getHostdatetime());
+        cardDao.save(bankCard);
+      }
+
+      return true;
+    }
+    return false;
+  }
 }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt
index c1dbf6a..157c81c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt
@@ -13,6 +13,7 @@
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import com.supwisdom.dlpay.system.service.DtlDataService
 import com.supwisdom.dlpay.util.ConstantUtil
+import org.apache.log4j.spi.ErrorCode
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.*
@@ -85,23 +86,28 @@
      */
     @PostMapping("/downloadshopbill")
     fun downloadShopBill(@RequestBody param: DownloadShopBillParam, response: HttpServletResponse): ResponseEntity<Any> {
-        val outputStream = response.outputStream
         try {
             shopService.checkDownloadShopBillParam(param) //判断该天是否已结算，未结算直接报错
             val count = dtlDataService.getDownloadShopBillCount(param)
             if (count <= 0) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create().fail(TradeErrorCode.NO_DEAL_EEROR, "当天无交易记录"))
             }
-            parseFile(dtlDataService, param, count, outputStream)
-            return ResponseEntity.ok(outputStream)
+            val outputStream = response.outputStream
+            return try {
+                parseFile(dtlDataService, param, count, outputStream)
+                ResponseEntity.ok(outputStream)
+            } catch (eb: Exception) {
+                ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .exception(TradeErrorCode.BUSINESS_DEAL_ERROR, eb, "生成对账文件数据出错"))
+            } finally {
+                outputStream?.close()
+            }
         } catch (ex: RequestParamCheckException) {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .requestException(ex, "请求参数错误"))
         } catch (et: TransactionException) {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .transException(et, "业务处理错误"))
-        } finally {
-            outputStream?.close()
         }
     }
 
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 4981023..210c331 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
@@ -55,6 +55,7 @@
         var resp = UserInforResponse()
         var cityCard: TCard?
         if (!citizencardno.isNullOrEmpty()) {
+            //根据市民卡号查询
             cityCard = cardDao.findCardByCardnoAndCardtype(citizencardno, ConstantUtil.CARDTYPE_CITIZENCARD)
             if (cityCard == null) {
                 resp.retcode = 1
@@ -65,6 +66,21 @@
             if (bankcard != null) {
                 resp.bankcardno = bankcard.cardno
             }
+        } else if (!bankcardno.isNullOrEmpty()) {
+            //根据银行卡号查询
+            val bankcard = cardDao.findCardByCardnoAndCardtype(bankcardno?.trim(), ConstantUtil.CARDTYPE_BANKCARD)
+            if (bankcard == null) {
+                resp.retcode = 1
+                resp.retmsg = "银行卡不存在"
+                return resp
+            }
+            resp.bankcardno = bankcard.cardno
+            cityCard = cardDao.findBankcardByCitizencard(bankcard.userid, ConstantUtil.CARDTYPE_CITIZENCARD, bankcard.cardphyid)
+            if (cityCard == null) {
+                resp.retcode = 1
+                resp.retmsg = "市民卡不存在"
+                return resp
+            }
         } else {
             resp.retcode = 1
             resp.retmsg = "参数错误"
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt
index fde2ac5..b0dbb6b 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt
@@ -14,6 +14,7 @@
 import com.supwisdom.dlpay.framework.domain.TShop
 import com.supwisdom.dlpay.framework.domain.TShopacc
 import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.EnumCheck
 import org.springframework.beans.factory.annotation.Autowired
@@ -111,8 +112,8 @@
 
     override fun checkDownloadShopBillParam(param: DownloadShopBillParam): Boolean {
         if (!StringUtil.isEmpty(param.checkdate)) {
-            val ctl = settleCtlDao.findByTenantId(param.tenantid)
-                    ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "[tenantid=${param.tenantid}]未找到结算状态表")
+            val ctl = settleCtlDao.findByTenantId(TenantContext.getTenantSchema())
+                    ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "[tenantid=${TenantContext.getTenantSchema()}]未找到结算状态表")
             if (DateUtil.compareDatetime(param.checkdate, "${ctl.settledate}", "yyyyMMdd") >= 0) {
                 throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "对账单未生成") //未结算，不返回对账单
             }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
index b368d5a..9937a31 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
@@ -185,7 +185,7 @@
             //需要补账
             chkdtl.chkresult = ConstantUtil.CHKDTL_CHKRESULT_NOCHARGE
             chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_ADD
-            chkdtl.remark = "本地未入账，需要补助"
+            chkdtl.remark = "本地未入账，需要补帐"
             transactionChkdtlDao.save(chkdtl) //对账明细表更新
         }
     }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
index 38f1499..b997a61 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
@@ -34,7 +34,7 @@
             ver += Manifests.read("Payapi-Buildtime") ?: "no"
             ver
         } catch (ex: Exception) {
-            ex.printStackTrace()
+//            ex.printStackTrace()
             "unknown"
         }
     }
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index cefb007..bcdf83c 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -303,7 +303,14 @@
 VALUES (90, '', 37, '查询', '/user/card', '{tenantid}');
 INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
 VALUES (91, '', 38, '查询', '/report/shoptodaybusiness', '{tenantid}');
-
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (92, '', 37, '新增跳转', '/user/load4addcard', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (93, '', 37, '新增', '/user/cardadd', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (94, '', 37, '修改跳转', '/user/load4modifycard', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (95, '', 37, '修改', '/user/cardupdate', '{tenantid}');
 
 INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
 VALUES ('ff8080816b7947ed016b795577300036', 16, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
@@ -461,6 +468,15 @@
 VALUES ('ff8080816db87e27016db9446fda008b', 90, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
 INSERT INTO  "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
 VALUES ('4028ee9f6e5d95d8016e5d99e8dd0013', 91, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO  "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816ec5cfd5016ec5d16d470006', 92, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO  "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816ec5cfd5016ec5d16d470007', 93, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO  "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816ecaebf8016ecaeedcec0004', 94, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO  "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816ecafb4e016ecafd58400005', 95, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+
 
 
 INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
diff --git a/payapi/src/main/resources/templates/system/user/addcard.html b/payapi/src/main/resources/templates/system/user/addcard.html
new file mode 100644
index 0000000..0151106
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/addcard.html
@@ -0,0 +1,175 @@
+<form id="citizencard-add-form" lay-filter="citizencard-add-form" class="layui-form model-form">
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>市民卡号</label>
+            <div class="layui-input-inline">
+                <input name="cardno" placeholder="请输入市民卡号" type="text" class="layui-input" maxlength="10"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>物理卡号</label>
+            <div class="layui-input-inline">
+                <input name="cardphyid" placeholder="请输入电子物理卡号" type="text" class="layui-input" maxlength="8"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>卡有效期</label>
+            <div class="layui-input-inline">
+                <input name="expiredate" placeholder="请选择卡有效期" type="text" class="layui-input" maxlength="10"
+                       id="citizencard-add-expiredate" autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>卡状态</label>
+            <div class="layui-input-inline">
+                <select name="cardstatus" class="layui-input layui-select" lay-verify="required">
+                    <option value="normal" selected>1_正常</option>
+                    <option value="closed">9_注销</option>
+                    <option value="abnormal">2_异常</option>
+                    <option value="unuse">0_未启用</option>
+                </select>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>银行卡号</label>
+            <div class="layui-input-inline">
+                <input name="bankcardno" placeholder="请填写银行卡号" type="text" class="layui-input" maxlength="19"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>签约状态</label>
+            <div class="layui-input-inline">
+                <select name="signstatus" class="layui-input layui-select" lay-verify="required">
+                    <option value="0" selected>未签约</option>
+                    <option value="1">已签约</option>
+                </select>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>姓名</label>
+            <div class="layui-input-inline">
+                <input name="username" placeholder="请填写姓名" type="text" class="layui-input" maxlength="20"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>性别</label>
+            <div class="layui-input-inline">
+                <select name="sex" class="layui-input layui-select" lay-verify="required">
+                    <option value="male" selected>男</option>
+                    <option value="female">女</option>
+                    <option value="unknown">未知</option>
+                </select>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>证件类型</label>
+            <div class="layui-input-inline">
+                <select name="idtype" class="layui-input layui-select" lay-verify="required">
+                    <option value="idcard" selected>0_身份证</option>
+                    <option value="residence_booklet">1_户口簿</option>
+                    <option value="passport">2_护照</option>
+                    <option value="hk_macau_pass">3_港澳居民来往内地通行证</option>
+                    <option value="taiwan_pass">4_台湾同胞来往内地通行证</option>
+                    <option value="foreigner_residence_permit">5_外国人居留证</option>
+                    <option value="military_idcard">6_军官证</option>
+                    <option value="soldier_idcard">7_士兵证</option>
+                    <option value="unknown">9_其他</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>证件号</label>
+            <div class="layui-input-inline">
+                <input name="idno" placeholder="请输入证件号" type="text" class="layui-input" maxlength="18"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label">手机号</label>
+            <div class="layui-input-inline">
+                <input name="mobile" placeholder="请输入手机号" type="text" class="layui-input" maxlength="11"
+                       autocomplete="off"/>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label">邮箱</label>
+            <div class="layui-input-inline">
+                <input name="email" placeholder="请输入邮箱" type="text" class="layui-input" maxlength="60" autocomplete="off"/>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn" lay-filter="citizencard-add-form-submit" lay-submit  id="citizencard-add-ok">保存</button>
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'laydate'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var laydate = layui.laydate;
+
+        form.render('select');
+        laydate.render({
+            elem: '#citizencard-add-expiredate',
+            trigger: 'click'
+        });
+
+        // 表单提交事件
+        form.on('submit(citizencard-add-form-submit)', function (data) {
+            layer.load(2);
+            var token_name = $("meta[name='_csrf_token']").attr("content");
+            var token = $("meta[name='_csrf_token']").attr("value");
+            data.field[token_name] = token;
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : '[[@{/user/cardadd}]]',
+                data : data.field,
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code === 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.putTempData('t_addCityNo', data.field.cardno);
+                        admin.finishPopupCenter();
+                    } else if (result.code === 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('[[@{/login}]]');
+                        }, 1000);
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function(err) {
+                    admin.errorBack(err);
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/user/card.html b/payapi/src/main/resources/templates/system/user/card.html
index 138d2b9..251daa4 100644
--- a/payapi/src/main/resources/templates/system/user/card.html
+++ b/payapi/src/main/resources/templates/system/user/card.html
@@ -44,6 +44,13 @@
                                autocomplete="off" class="layui-input"/>
                     </div>
                 </div>
+                <div class="layui-inline" style="margin-right: 20px;margin-top: 10px;">
+                    <label class="layui-form-label">&nbsp;</label>
+                    <div class="layui-input-block" style="width: 265px;">
+                        <button id="citizencard-search-btn" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜 索</button>
+                        <button id="citizencard-search-btn-reset" class="layui-btn layui-btn-primary">清 空</button>
+                    </div>
+                </div>
             </div>
         </div>
     </div>
@@ -54,10 +61,10 @@
 
 <script type="text/html" id="citizencard-table-toolbar">
     <div class="layui-btn-container">
-        <button class="layui-btn layui-btn-sm" id="btn-citizencard-search-ok" lay-event="search"><i
-                class="layui-icon">&#xe615;</i>搜 索</button>
-        <button class="layui-btn layui-btn-sm" id="btn-citizencard-search-clear" lay-event="clear"><i
-                class="layui-icon"></i>清 空</button>
+        <button class="layui-btn layui-btn-sm" id="btn-citizencard-add" lay-event="add"><i
+                class="layui-icon">&#xe654;</i>新 增</button>
+        <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-citizencard-modify" lay-event="modify"><i
+                class="layui-icon">&#xe642;</i>修 改</button>
     </div>
 </script>
 
@@ -76,6 +83,7 @@
             toolbar: '#citizencard-table-toolbar',
             cols: [
                 [
+                    {type:'radio', align: 'center', width: 35, fixed: 'left'},
                     {field:'cardno',title:'市民卡号', align: 'center', width: 120, fixed: 'left', sort: true},
                     {field:'cardphyid',title:'物理卡号', align: 'center', width: 120, fixed: 'left'},
                     {
@@ -137,25 +145,64 @@
             ]
         });
 
+        $("#citizencard-search-btn").click(function(){
+            table.reload('citizencardSearchTable', {
+                where: {
+                    cardno: $("#citizencard-search-cardno").val(),
+                    cardphyid: $("#citizencard-search-cardphyid").val(),
+                    bankcardno: $("#citizencard-search-bankcardno").val(),
+                    username: $("#citizencard-search-username").val(),
+                    idno: $("#citizencard-search-idno").val()
+                }, page: {curr: 1}
+            });
+        });
+
+        $("#citizencard-search-btn-reset").click(function(){
+            $("#citizencard-search-cardno").val("");
+            $("#citizencard-search-cardphyid").val("");
+            $("#citizencard-search-bankcardno").val("");
+            $("#citizencard-search-username").val("");
+            $("#citizencard-search-idno").val("");
+        });
+
         table.on('toolbar(citizencardSearchTable-filter)', function (obj) {
             switch (obj.event) {
-                case 'search':
-                    table.reload('citizencardSearchTable', {
-                        where: {
-                            cardno: $("#citizencard-search-cardno").val(),
-                            cardphyid: $("#citizencard-search-cardphyid").val(),
-                            bankcardno: $("#citizencard-search-bankcardno").val(),
-                            username: $("#citizencard-search-username").val(),
-                            idno: $("#citizencard-search-idno").val()
-                        }, page: {curr: 1}
+                case 'add':
+                    admin.popupCenter({
+                        title: '添加市民卡',
+                        area: '700px',
+                        path: '[[@{/user/load4addcard}]]',
+                        finish: function () {
+                            var tmpNo = admin.getTempData('t_addCityNo');
+                            if(undefined !=tmpNo && !isempty(tmpNo)){
+                                table.reload('citizencardSearchTable', { where: {cardno: tmpNo}, page: {curr: 1} });
+                            }else{
+                                table.reload('citizencardSearchTable', {});
+                            }
+                        }
                     });
                     break;
-                case 'clear':
-                    $("#citizencard-search-cardno").val("");
-                    $("#citizencard-search-cardphyid").val("");
-                    $("#citizencard-search-bankcardno").val("");
-                    $("#citizencard-search-username").val("");
-                    $("#citizencard-search-idno").val("");
+                case 'modify':
+                    var checkStatus = table.checkStatus('citizencardSearchTable');
+                    if(checkStatus.data.length ==0){
+                        layer.msg("请先选中要修改的市民卡", {icon: 2, time: 1500});
+                        return;
+                    }
+                    admin.putTempData('t_citycard', checkStatus.data[0]);
+                    admin.popupCenter({
+                        title: '修改市民卡',
+                        area: '700px',
+                        path: '[[@{/user/load4modifycard}]]',
+                        finish: function () {
+                            var tmpUpNo = admin.getTempData('t_updateCityNo');
+                            console.log("xx",tmpUpNo);
+                            if(undefined !=tmpUpNo && !isempty(tmpUpNo)){
+                                table.reload('citizencardSearchTable', { where: {cardno: tmpUpNo}, page: {curr: 1} });
+                            }else{
+                                table.reload('citizencardSearchTable', {});
+                            }
+                        }
+                    });
                     break;
             }
         });
diff --git a/payapi/src/main/resources/templates/system/user/updatecard.html b/payapi/src/main/resources/templates/system/user/updatecard.html
new file mode 100644
index 0000000..7e1cb74
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/updatecard.html
@@ -0,0 +1,208 @@
+<form id="citizencard-modify-form" lay-filter="citizencard-modify-form" class="layui-form model-form">
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>市民卡号</label>
+            <div class="layui-input-inline">
+                <input type="hidden" name="cid" class="layui-input"/>
+                <input type="hidden" name="bkid" class="layui-input"/>
+                <input name="cardno" placeholder="请输入市民卡号" type="text" class="layui-input" maxlength="10"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>物理卡号</label>
+            <div class="layui-input-inline">
+                <input name="cardphyid" placeholder="请输入电子物理卡号" type="text" class="layui-input" maxlength="8"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>卡有效期</label>
+            <div class="layui-input-inline">
+                <input name="expiredate" placeholder="请选择卡有效期" type="text" class="layui-input" maxlength="10"
+                       id="citizencard-modify-expiredate" autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>卡状态</label>
+            <div class="layui-input-inline">
+                <select name="cardstatus" class="layui-input layui-select" lay-verify="required">
+                    <option value="normal" selected>1_正常</option>
+                    <option value="closed">9_注销</option>
+                    <option value="abnormal">2_异常</option>
+                    <option value="unuse">0_未启用</option>
+                </select>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>银行卡号</label>
+            <div class="layui-input-inline">
+                <input name="bankcardno" placeholder="请填写银行卡号" type="text" class="layui-input" maxlength="19"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>签约状态</label>
+            <div class="layui-input-inline">
+                <select name="signstatus" class="layui-input layui-select" lay-verify="required">
+                    <option value="0" selected>未签约</option>
+                    <option value="1">已签约</option>
+                </select>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>姓名</label>
+            <div class="layui-input-inline">
+                <input name="username" placeholder="请填写姓名" type="text" class="layui-input" maxlength="20"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>性别</label>
+            <div class="layui-input-inline">
+                <select name="sex" class="layui-input layui-select" lay-verify="required">
+                    <option value="male" selected>男</option>
+                    <option value="female">女</option>
+                    <option value="unknown">未知</option>
+                </select>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>证件类型</label>
+            <div class="layui-input-inline">
+                <select name="idtype" class="layui-input layui-select" lay-verify="required">
+                    <option value="idcard" selected>0_身份证</option>
+                    <option value="residence_booklet">1_户口簿</option>
+                    <option value="passport">2_护照</option>
+                    <option value="hk_macau_pass">3_港澳居民来往内地通行证</option>
+                    <option value="taiwan_pass">4_台湾同胞来往内地通行证</option>
+                    <option value="foreigner_residence_permit">5_外国人居留证</option>
+                    <option value="military_idcard">6_军官证</option>
+                    <option value="soldier_idcard">7_士兵证</option>
+                    <option value="unknown">9_其他</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label"><span style="color: red;">*</span>证件号</label>
+            <div class="layui-input-inline">
+                <input name="idno" placeholder="请输入证件号" type="text" class="layui-input" maxlength="18"
+                       autocomplete="off" lay-verify="required" required/>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-inline">
+            <label class="layui-form-label">手机号</label>
+            <div class="layui-input-inline">
+                <input name="mobile" placeholder="请输入手机号" type="text" class="layui-input" maxlength="11"
+                       autocomplete="off"/>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label">邮箱</label>
+            <div class="layui-input-inline">
+                <input name="email" placeholder="请输入邮箱" type="text" class="layui-input" maxlength="60" autocomplete="off"/>
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn" lay-filter="citizencard-modify-form-submit" lay-submit  id="citizencard-modify-ok">保存</button>
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'laydate'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var laydate = layui.laydate;
+
+        form.render('select');
+        laydate.render({
+            elem: '#citizencard-modify-expiredate',
+            trigger: 'click'
+        });
+
+        //回显数据
+        var cardBean = admin.getTempData('t_citycard');
+        if (cardBean) {
+            console.log("修改市民卡回显：",cardBean);
+            form.val('citizencard-modify-form', {
+                cid:cardBean.cid,
+                bkid:cardBean.bkid,
+                cardno:cardBean.cardno,
+                cardphyid:cardBean.cardphyid,
+                expiredate:dateFormat(cardBean.expiredate),
+                cardstatus:updateCardStatus(cardBean.status),
+                bankcardno:cardBean.bankcardno,
+                signstatus: cardBean.signed?'1':'0',
+                username:cardBean.username,
+                sex:cardBean.sex,
+                idtype:cardBean.idtype,
+                idno:cardBean.idno,
+                mobile:cardBean.mobile,
+                email:cardBean.email
+            });
+        }
+
+        function updateCardStatus(stat){
+            if('normal' == stat || 'closed' == stat || 'abnormal'==stat || 'unuse' == stat){
+                return stat;
+            }
+            return 'abnormal';
+        }
+
+        // 表单提交事件
+        form.on('submit(citizencard-modify-form-submit)', function (data) {
+            layer.confirm("卡管系统同步数据，请谨慎修改！确定要保存修改吗？", function () {
+                layer.load(2);
+                var token_name = $("meta[name='_csrf_token']").attr("content");
+                var token = $("meta[name='_csrf_token']").attr("value");
+                data.field[token_name] = token;
+                $.ajax({
+                    type : "POST",
+                    dataType : "json",
+                    url : '[[@{/user/cardupdate}]]',
+                    data : data.field,
+                    success : function(result) {
+                        layer.closeAll('loading');
+                        if (result.code === 200) {
+                            layer.msg(result.msg, {icon: 1});
+                            admin.putTempData('t_updateCityNo', data.field.cardno);
+                            admin.finishPopupCenter();
+                        } else if (result.code === 401) {
+                            layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                                location.replace('[[@{/login}]]');
+                            }, 1000);
+                        } else {
+                            console.log('err:' + result.code);
+                            layer.msg(result.msg, {icon: 2});
+                        }
+                    },
+                    error : function(err) {
+                        admin.errorBack(err);
+                    }
+                });
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
