diff --git a/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java b/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
index 278ac6d..6abecf8 100644
--- a/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
@@ -49,8 +49,6 @@
     @Autowired
     private DevparaBindDao devparaBindDao;
     @Autowired
-    private CustTypeService custTypeService;
-    @Autowired
     private DeviceParamService deviceParamService;
     @Autowired
     private ShopSettlementService shopSettlementService;
@@ -471,10 +469,14 @@
         Integer count = req.getMaxcount();
         List<TCardver> whitelistCards ;
         TWhitelistDevbind bind=whitelistService.getWhitelistDevbindByDeviceId(device.getId());
-
+        TWhitelist whitelist=null;
         if(null!=bind){
+            whitelist=whitelistService.getWhitelistById(bind.getWhitelistid());
+
+        }
+        if(null!=whitelist&&RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL.equals(whitelist.getStatus())){
             whitelistCards=whitelistService.getDevBindCardver(device.getId());
-        }else{
+        } else{
             whitelistCards= cardService.getCardlistByTCardVer(req.getCardverno());
         }
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java
index c053e2e..e5cdc1a 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java
@@ -11,6 +11,7 @@
     private String cardno;
     private String cardphyid;
     private String bankcardno;
+    private String checkstatus;
 
     public CustomerShowBean(){
 
@@ -79,6 +80,15 @@
     }
 
     public void setBankcardno(String bankcardno) {
+
         this.bankcardno = bankcardno;
     }
+
+    public String getCheckstatus() {
+        return checkstatus;
+    }
+
+    public void setCheckstatus(String checkstatus) {
+        this.checkstatus = checkstatus;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDao.java
index 34b9c1e..b6bf047 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDao.java
@@ -22,4 +22,6 @@
     Page<TWhitelist> findAllByStatus(String status, Pageable pageable);
 
     List<TWhitelist> findAllByStatus(String status);
+
+    TWhitelist findByWhitelistidAndStatus(Integer whitelistid,String status);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDiscountDetail.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDiscountDetail.java
index 2e580ff..c959c1d 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDiscountDetail.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDiscountDetail.java
@@ -5,7 +5,8 @@
 import javax.persistence.*;
 
 @Entity
-@Table(name = "TB_DISCOUNT_DETAIL")
+@Table(name = "TB_DISCOUNT_DETAIL",
+        indexes = {@Index(name = "discountdetail_ruleid_idx", columnList = "ruleid")})
 public class TDiscountDetail {
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDetail.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDetail.java
index aba06a1..241c246 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDetail.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDetail.java
@@ -5,7 +5,8 @@
 import javax.persistence.*;
 
 @Entity
-@Table(name = "TB_WHITELIST_DETAIL")
+@Table(name = "TB_WHITELIST_DETAIL" ,
+        indexes = {@Index(name = "whitelistdetail_whitelistid_idx", columnList = "whitelistid")})
 public class TWhitelistDetail {
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java
index 639b108..55aff30 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java
@@ -60,6 +60,8 @@
     @Transactional(rollbackFor = Exception.class, readOnly = true)
     List<TWhitelist> getNormalWhitelists();
 
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    TWhitelist getWhitelistById(Integer whitelistid);
 
     @Transactional(rollbackFor = Exception.class,readOnly = true)
     List<TCardver>  getDevBindCardver(Integer deviceid) ;
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
index ca3c217..c85ca25 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
@@ -34,15 +34,11 @@
 
     @Autowired
     private CustomerDao customerDao;
-
     @Autowired
     private SystemUtilService systemUtilService;
     @Autowired
     private CardDao cardDao;
     @Autowired
-    private CardService cardService;
-
-    @Autowired
     private CardverDao cardverDao;
 
     @PersistenceContext
@@ -51,10 +47,10 @@
     @Override
     public PageResult<CustomerShowBean> getCustomerPage(CustomerSearchBean param) {
         StringBuffer querySql = new StringBuffer("select t.cardno,t.custid,c.custname, " +
-                "t.bankcardno,t.cardphyid,c.phone,c.custtype from Tb_card t " +
-                "left join tb_customer c on t.custid=c.custid where 1=1 ");
-        StringBuffer countSql = new StringBuffer("select count(*) as cnt from Tb_card t " +
-                "left join tb_customer c on t.custid=c.custid where 1=1 ");
+                "t.bankcardno,t.cardphyid,c.phone,c.custtype,c.checkstatus from tb_customer c " +
+                "left join Tb_card t on t.custid=c.custid where 1=1 ");
+        StringBuffer countSql = new StringBuffer("select count(*) as cnt from tb_customer c " +
+                "left join Tb_card t on t.custid=c.custid where 1=1 ");
         if (!StringUtil.isEmpty(param.getCustname())) {
             querySql.append(" and  c.custname like :str ");
             countSql.append(" and  c.custname like :str ");
@@ -128,20 +124,20 @@
             card.setBankcardno(customer.getBankcardno());
             card.setExpiredate("");
             card = cardDao.save(card);
-            saveCardver(cardverno, date, card, card.getStatus(), RestaurantConstant.STATUS_CARD_NORMAL);
+            saveCardver(cardverno, date, card, card.getStatus(), RestaurantConstant.STATUS_CARD_NORMAL,1);
         }
 
         return JsonResult.ok("成功");
     }
 
 
-    private void saveCardver(String cardverno, String date, TCard card, String status, String optype) {
+    private void saveCardver(String cardverno, String date, TCard card, String status, String optype,Integer addderflag) {
         TCardver tCardver = new TCardver();
         tCardver.setAccdate(date);
         tCardver.setCardno(card.getCardno());
         tCardver.setCardphyid(card.getCardphyid());
 
-        tCardver.setAdderflag(1);
+        tCardver.setAdderflag(addderflag);
         tCardver.setOptype(optype);
         tCardver.setStatus(status);
         tCardver.setCustid(card.getCustid());
@@ -153,7 +149,6 @@
     @Override
     public JsonResult deleteCustomer(String custid) {
 
-        TCustomer customer = customerDao.findById(custid).get();
         String cardverno = systemUtilService.getCardverno();
         List<TCard> card = cardDao.findAllByCustid(custid);
         for (TCard c : card) {
@@ -161,7 +156,7 @@
             c.setCardverno(cardverno);
             cardDao.save(c);
             String date = DateUtil.getNow("yyyyMMdd");
-            saveCardver(cardverno, date, c, c.getStatus(), RestaurantConstant.STATUS_CARD_LOGOUT);
+            saveCardver(cardverno, date, c, c.getStatus(), RestaurantConstant.STATUS_CARD_LOGOUT,0);
         }
 
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java
index 03c7ab7..465f1c8 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java
@@ -58,7 +58,7 @@
     @Override
     public PageResult<TWhitelist> getWhitelist(String listname, int pageNo, int pageSize) {
         Pageable pageable = PageRequest.of(pageNo - 1, pageSize
-                , Sort.by("Whitelistid"));
+                , Sort.by("whitelistid"));
         if (!StringUtil.isEmpty(listname)) {
             return new PageResult<>(WhitelistDao.findAllByListnameContaining(listname, pageable));
         }
@@ -180,9 +180,9 @@
     }
 
     @Override
-    public PageResult<TWhitelistDetail> getWhitelistDetails(String searchkey, int Whitelistid, int pageNo, int pageSize) {
-        StringBuffer querySql = new StringBuffer("from TWhitelistDetail t where t.Whitelistid=:Whitelistid ");
-        StringBuffer countSql = new StringBuffer("select count(t.id) as cnt from TWhitelistDetail t where t.Whitelistid=:Whitelistid ");
+    public PageResult<TWhitelistDetail> getWhitelistDetails(String searchkey, int whitelistid, int pageNo, int pageSize) {
+        StringBuffer querySql = new StringBuffer("from TWhitelistDetail t where t.whitelistid=:whitelistid ");
+        StringBuffer countSql = new StringBuffer("select count(t.id) as cnt from TWhitelistDetail t where t.whitelistid=:whitelistid ");
         if (!StringUtil.isEmpty(searchkey)) {
             querySql.append(" and (t.cardno like :str or t.username like :str) ");
             countSql.append(" and (t.cardno like :str or t.username like :str) ");
@@ -190,8 +190,8 @@
         querySql.append(" order by t.cardno ");
         Query query = entityManager.createQuery(querySql.toString());
         Query countQuery = entityManager.createQuery(countSql.toString());
-        query.setParameter("Whitelistid", Whitelistid);
-        countQuery.setParameter("Whitelistid", Whitelistid);
+        query.setParameter("whitelistid", whitelistid);
+        countQuery.setParameter("whitelistid", whitelistid);
         if (!StringUtil.isEmpty(searchkey)) {
             query.setParameter("str", "%" + searchkey.trim() + "%");
             countQuery.setParameter("str", "%" + searchkey.trim() + "%");
@@ -204,8 +204,8 @@
     }
 
     @Override
-    public boolean closeWhitelist(int Whitelistid) throws WebCheckException {
-        Optional<TWhitelist> olist = WhitelistDao.findById(Whitelistid);
+    public boolean closeWhitelist(int whitelistid) throws WebCheckException {
+        Optional<TWhitelist> olist = WhitelistDao.findById(whitelistid);
         if (!olist.isPresent()) {
             throw new WebCheckException("白名单不存在！");
         }
@@ -225,8 +225,8 @@
 
 
     @Override
-    public boolean deleteWhitelist(int Whitelistid) throws WebCheckException {
-        Optional<TWhitelist> list = WhitelistDao.findById(Whitelistid);
+    public boolean deleteWhitelist(int whitelistid) throws WebCheckException {
+        Optional<TWhitelist> list = WhitelistDao.findById(whitelistid);
         if (!list.isPresent()) {
             throw new WebCheckException("白名单不存在！");
         }
@@ -235,15 +235,15 @@
             throw new WebCheckException("待审核或驳回的白名单才能删除！");
         }
 
-        WhitelistDetailDao.deleteWhitelistDetailByWhitelistid(Whitelistid); //名单
-        WhitelistDevbindDao.deleteBindByWhitelistid(Whitelistid); //绑定设备
+        WhitelistDetailDao.deleteWhitelistDetailByWhitelistid(whitelistid); //名单
+        WhitelistDevbindDao.deleteBindByWhitelistid(whitelistid); //绑定设备
         WhitelistDao.delete(tWhitelist);
         return true;
     }
 
     @Override
     public PageResult<TWhitelist> getCheckWhitelist(String status, int pageNo, int pageSize) {
-        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "Whitelistid"));
+        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "whitelistid"));
         if (StringUtil.isEmpty(status)) {
             return new PageResult<>(WhitelistDao.findAll());
         }
@@ -252,8 +252,8 @@
     }
 
     @Override
-    public boolean doCheckWhitelist(int Whitelistid, boolean passflag, String reason, TOperator oper) throws Exception {
-        Optional<TWhitelist> list = WhitelistDao.findById(Whitelistid);
+    public boolean doCheckWhitelist(int whitelistid, boolean passflag, String reason, TOperator oper) throws Exception {
+        Optional<TWhitelist> list = WhitelistDao.findById(whitelistid);
         if (!list.isPresent()) {
             throw new WebCheckException("白名单不存在！");
         }
@@ -279,10 +279,10 @@
 
     @Override
     public PageResult<WhitelistBindShowBean> getWhitelistDevBindInfo(String searchkey, int pageNo, int pageSize) {
-        StringBuffer querySql = new StringBuffer("select t.id,t.deviceid,b.devicename,b.devphyid,t.Whitelistid,a.listname,a.status as liststatus,t.createtime " +
-                " from TB_WhiteLIST_DEVBIND t left join TB_WhiteLIST a on t.Whitelistid=a.Whitelistid left join TB_DEVICE b on t.deviceid=b.id where 1=1 ");
+        StringBuffer querySql = new StringBuffer("select t.id,t.deviceid,b.devicename,b.devphyid,t.whitelistid,a.listname,a.status as liststatus,t.createtime " +
+                " from TB_WhiteLIST_DEVBIND t left join TB_WhiteLIST a on t.whitelistid=a.whitelistid left join TB_DEVICE b on t.deviceid=b.id where 1=1 ");
         StringBuffer countSql = new StringBuffer("select count(t.id) as cnt " +
-                " from TB_WhiteLIST_DEVBIND t left join TB_WhiteLIST a on t.Whitelistid=a.Whitelistid left join TB_DEVICE b on t.deviceid=b.id where 1=1 ");
+                " from TB_WhiteLIST_DEVBIND t left join TB_WhiteLIST a on t.whitelistid=a.whitelistid left join TB_DEVICE b on t.deviceid=b.id where 1=1 ");
         if (!StringUtil.isEmpty(searchkey)) {
             querySql.append(" and (a.listname like :str or b.devicename like :str or b.devphyid like :str) ");
             countSql.append(" and (a.listname like :str or b.devicename like :str or b.devphyid like :str) ");
@@ -328,7 +328,7 @@
     }
 
     @Override
-    public PageResult<DevparaBinddevShowBean> searchWhitelistBindDevices(Integer devgroupid, String searchkey, int Whitelistid) {
+    public PageResult<DevparaBinddevShowBean> searchWhitelistBindDevices(Integer devgroupid, String searchkey, int whitelistid) {
         List<Integer> chirdGroupids = null;
         if (null != devgroupid) {
             Query chirdGroupQuery = entityManager.createNativeQuery(" WITH  RECURSIVE  r  AS ( " +
@@ -342,7 +342,7 @@
 
         StringBuffer sql = new StringBuffer("select t.id as deviceid,t.devicename,t.devphyid,t.devgroupid,a.groupname as devgroupname " +
                 " from TB_DEVICE t left join TB_DEVICEGROUP a on t.devgroupid=a.devgroupid " +
-                " left join TB_WhiteLIST_DEVBIND b on t.id=b.deviceid and b.Whitelistid=:lid where b.id is null and t.state=1 ");
+                " left join TB_WhiteLIST_DEVBIND b on t.id=b.deviceid and b.whitelistid=:lid where b.id is null and t.state=1 ");
         if (!StringUtil.isEmpty(chirdGroupids)) {
             sql.append(" and t.devgroupid in (" + StringUtils.join(chirdGroupids.toArray(), ",") + ") ");
         }
@@ -354,15 +354,15 @@
         if (!StringUtil.isEmpty(searchkey)) {
             query.setParameter("str", "%" + searchkey.trim() + "%");
         }
-        query.setParameter("lid", Whitelistid);
+        query.setParameter("lid", whitelistid);
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(DevparaBinddevShowBean.class));
         List<DevparaBinddevShowBean> list = query.getResultList();
         return new PageResult<>(list);
     }
 
     @Override
-    public boolean saveWhitelistBindDevices(int Whitelistid, List<Integer> deviceIds, TOperator oper) throws WebCheckException {
-        Optional<TWhitelist> olist = WhitelistDao.findById(Whitelistid);
+    public boolean saveWhitelistBindDevices(int whitelistid, List<Integer> deviceIds, TOperator oper) throws WebCheckException {
+        Optional<TWhitelist> olist = WhitelistDao.findById(whitelistid);
         if (!olist.isPresent()) {
             throw new WebCheckException("所选白名单不存在");
         }
@@ -403,13 +403,22 @@
     }
 
     @Override
+    public TWhitelist getWhitelistById(Integer whitelistid) {
+        Optional<TWhitelist> olist=WhitelistDao.findById(whitelistid);
+        if(olist.isPresent()){
+            return olist.get();
+        }
+        return null;
+    }
+
+    @Override
     public List<TCardver> getDevBindCardver(Integer deviceid) {
-        StringBuffer sql = new StringBuffer("SELECT t.cardno,t.cardphyid FROM tb_whitelist_detail w " +
-                "left join tb_cardver t on t.cardno=w.cardno " +
+        StringBuffer sql = new StringBuffer("SELECT t.cardno,t.cardphyid,t.optype FROM tb_whitelist_detail w " +
+                "left join tb_cardver t on t.cardno=w.cardno and t.cardphyid=w.cardphyid " +
                 "left join tb_whitelist_devbind d on d.whitelistid=w.whitelistid " +
                 "where d.deviceid=:id");
         Query query = entityManager.createNativeQuery(sql.toString());
-        query.setParameter("str", deviceid);
+        query.setParameter("id", deviceid);
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(TCardver.class));
         List<TCardver> list = query.getResultList();
         return list;
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
index bd5dae2..deeeac2 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
@@ -40,7 +40,7 @@
     @Autowired
     private UserProxy userProxy;
 
-    @Scheduled(cron = "0 0/5 * * * ? ")
+    @Scheduled(cron = "0 0/1 * * * ? ")
     private void CustomerCheckTask(){
         CustomerSearchBean searchBean=new CustomerSearchBean();
         searchBean.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
@@ -57,15 +57,19 @@
                 if(resp.getRetcode()==0){
                     TCard card=cardService.getCardByCardno(dtl.getCardno());
                     if(null!=card){
+                        card.setCardphyid(resp.getCardphyid());
+                        card.setExpiredate(resp.getExpiredate());
+                        card.setBankcardno(resp.getBankcardno());
                         card.setStatus(resp.getCardstatus());
                         card.setTransstatus(resp.getTransstatus());
                         cardService.saveCard(card);
                     }
+                    customer.setPhone(resp.getPhone());
                     customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
                     customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
                 }else{
                     customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_FAIL);
-                    customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                    customer.setStatus(RestaurantConstant.STATUS_CHECKSTATUS_FAIL);
                 }
                 customerDao.save(customer);
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
index a28c797..786f0a8 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
@@ -34,9 +34,12 @@
   public static final String STATUS_CARD_LOGOUT= "logout";   //注销
   public static final String STATUS_CARD_LOST= "lost";   //挂失
   public static final String STATUS_CARD_FROZEN = "frozen";   //冻结
-  public static final String STATUS_CARD_LOCK= "LOCK";   //锁卡
+  public static final String STATUS_CARD_LOCK= "lock";   //锁卡
   public static final String STATUS_CARD_EXPIRE= "expire";   //过期
 
+  public static final String OPTYPE_CARD_OPEN= "open";   //开卡
+  public static final String OPTYPE_CARD_DELETE= "delete";   //过期
+
 
   public static final String RULETYPE_QUOTA = "quota"; //定额
   public static final String RULETYPE_REDUCTION = "reduction"; //减免
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index 4eb8794..24567ce 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -93,7 +93,7 @@
                 it.loginTimestamp = now
                 it.roles = api.roles
                 it.tenantId = tetantId
-                it.token = HmacUtil.HMACSHA256( token,api.secret)
+                it.token = HmacUtil.HMACSHA256( api.secret,token)
             }.also {
                 apiClientRepository.save(it)
             }
diff --git a/src/main/resources/templates/restaurant/customer/index.html b/src/main/resources/templates/restaurant/customer/index.html
index bfb9aa9..715a708 100644
--- a/src/main/resources/templates/restaurant/customer/index.html
+++ b/src/main/resources/templates/restaurant/customer/index.html
@@ -40,13 +40,25 @@
             minWidth: 80,
             cols: [
                 [
-                    {field: 'custid', title: '客户号', sort: true},
-                    {field: 'custname', sort: true,  title: '客户姓名'},
-                    {field: 'cardno', sort: true,width: 200, title: '市名卡号'},
+                    {field: 'custname', sort: true, width: 120, title: '客户姓名'},
+                    {field: 'cardno', sort: true,width: 120, title: '市名卡号'},
                     {field: 'cardphyid', sort: true, title: '物理卡号'},
                     {field: 'phone',  title: '联系电话'},
                     {field: 'bankcardno', sort: true, width: 200, title: '银行卡号'},
                     {
+                        field: 'checkstatus', title: '审核状态', align: 'center', width: 120, sort: true, templet: function (d) {
+                            if ('uncheck' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-orange">待审核</span>'
+                            } else if ('normal' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-green">成功</span>';
+                            } else if ('fail' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-gray">失败</span>';
+                            } else {
+                                return d.checkstatus;
+                            }
+                        }
+                    },
+                    {
                         field: 'custtype', width:100, title: '人员类别', templet: function (item) {
                             if(item.custtype==null){
                                 return ''
