diff --git a/build.gradle b/build.gradle
index 431798f..0fea5bd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,9 +1,9 @@
 plugins {
     id 'java'
     id 'org.springframework.boot'
-    id 'org.jetbrains.kotlin.jvm'
-    id 'org.jetbrains.kotlin.plugin.jpa'
-    id 'org.jetbrains.kotlin.plugin.spring'
+    id 'org.jetbrains.kotlin.jvm' 
+    id 'org.jetbrains.kotlin.plugin.jpa' 
+    id 'org.jetbrains.kotlin.plugin.spring' 
     id "com.palantir.git-version" version "0.12.0-rc2"
     id 'com.palantir.docker' version '0.22.1'
 }
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 65c3151..476c4a4 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -14,9 +14,9 @@
 spring.datasource.password=123456
 database.dbtype=postgresql
 # Redis settings
-spring.redis.host=172.28.201.101
-spring.redis.port=16379
-spring.redis.password=kingstar
+spring.redis.host=172.28.201.70
+spring.redis.port=6379
+spring.redis.password=
 # jwt settings
 jwt.secret=Zj5taLomEbrM0lk+NMQZbHfSxaDU1wekjT+kiC3YzDw=
 # timeout seconds
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 9e73c0e..b0aa58b 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
@@ -191,8 +191,8 @@
             resp.setRetmsg("该pos当日流水重复");
             return resp;
         }
-        TTransDtl tTransdtl = new TTransDtl();
 
+        TTransDtl tTransdtl = new TTransDtl();
 
         tTransdtl.setTermid(tDevice.getId());
         tTransdtl.setBillno(systemUtilService.getRefno());
@@ -294,13 +294,36 @@
             return resp;
         }
         Double amount = req.getAmount() / 100.0;
-
+        Double cntamount=0.0;
         DiscountBean bean = deviceDiscountRuleService.getCustomerDiscount(tDevice.getId(), req.getTermtime(), cus.getCustid());
         if (null != bean) {
             tTransdtl.setRuleid(bean.getRuleid());
-            amount = getDiscountAmount(req.getTermdate(), cus.getCustid(), amount, bean);
+            cntamount = getDiscountAmount(req.getTermdate(), cus.getCustid(), amount, bean);
+            tTransdtl.setManagefee(amount-cntamount);
+            tTransdtl.setManagefeetype(bean.getRuletype());
+            tTransdtl.setAmount(cntamount);
+        }else{
+            tTransdtl.setAmount(amount);
+            tTransdtl.setManagefee(cntamount);
         }
-        tTransdtl.setAmount(amount);
+
+        TDevparaGroup group = null;
+        TDevparaBind bind = deviceParamService.getDevparaBindByDeviceid(tDevice.getId());
+        if (null == bind) {
+            group = deviceParamService.getDefaultDevparaGroup();
+        } else {
+            group = deviceParamService.getDevparaGroupByGroupid(bind.getGroupid());
+        }
+        TDevpara para=deviceParamService.getDevparaInfoByParaname(group.getGroupid(),"once_limit_amt");
+        if(null!=para){
+            Double oncelimit=Double.parseDouble(para.getParaval())/100;
+            if(amount>oncelimit&&cntamount>oncelimit){
+                resp.setRetcode("99");
+                resp.setRetmsg("消费金额超出单笔消费限额");
+                return resp;
+            }
+        }
+
         tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
         TTransDtl dtl = transDtlService.saveTransdtl(tTransdtl);
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopSettlementDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopSettlementDao.java
index d1abdb0..26b11cc 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopSettlementDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopSettlementDao.java
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.framework.dao;
 
 import com.supwisdom.dlpay.framework.domain.TShopSettlement;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
@@ -8,8 +10,11 @@
 
 
 @Repository
-public interface ShopSettlementDao extends JpaRepository<TShopSettlement, String> {
+public interface ShopSettlementDao extends JpaRepository<TShopSettlement, Integer> {
     int countByShopid(String shopid);
 
     List<TShopSettlement> findByShopid(String shopid);
+
+
+    Page<TShopSettlement> findAllByShopidContaining(String shopid, Pageable pageable);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TShopSettlement.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TShopSettlement.java
index a7bab95..b2a80da 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TShopSettlement.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TShopSettlement.java
@@ -8,7 +8,7 @@
   @Id
   @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_SETTLEMENT")
   @Column(name="SHOPSettlementno",unique = true, nullable = false, length = 9)
-  private String shopsettlementno;
+  private Integer shopsettlementno;
 
   @Column(name="SHOPID", precision = 15,unique = true)
   private String shopid;
@@ -20,12 +20,12 @@
   private String operno;
 
 
-  public String getShopSettlementno() {
+  public Integer getShopSettlementno() {
     return shopsettlementno;
   }
 
-  public void setShopSettlementno(String SHOPSettlementno) {
-    this.shopsettlementno = SHOPSettlementno;
+  public void setShopSettlementno(Integer ShopSettlementno) {
+    this.shopsettlementno = ShopSettlementno;
   }
 
   public String getShopid() {
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 e5cdc1a..b03083d 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java
@@ -12,6 +12,7 @@
     private String cardphyid;
     private String bankcardno;
     private String checkstatus;
+    private String status;
 
     public CustomerShowBean(){
 
@@ -89,6 +90,15 @@
     }
 
     public void setCheckstatus(String checkstatus) {
+
         this.checkstatus = checkstatus;
     }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopSettlementSearchBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopSettlementSearchBean.java
new file mode 100644
index 0000000..2a35f4f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopSettlementSearchBean.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+import com.supwisdom.dlpay.system.bean.PageBean;
+
+public class ShopSettlementSearchBean extends PageBean {
+    private String shopid;
+
+    public String getShopid() {
+        return shopid;
+    }
+
+    public void setShopid(String shopid) {
+        this.shopid = shopid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/ShopSettlementController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/ShopSettlementController.java
new file mode 100644
index 0000000..30cfe24
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/ShopSettlementController.java
@@ -0,0 +1,82 @@
+package com.supwisdom.dlpay.restaurant.controller;
+
+
+import com.google.gson.Gson;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TShop;
+import com.supwisdom.dlpay.framework.domain.TShopSettlement;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.restaurant.bean.AreaSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.ShopSettlementSearchBean;
+import com.supwisdom.dlpay.restaurant.domain.TArea;
+import com.supwisdom.dlpay.restaurant.service.AreaService;
+import com.supwisdom.dlpay.restaurant.service.ShopSettlementService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/shopsettlement")
+public class ShopSettlementController {
+
+    @Autowired
+    private ShopSettlementService shopSettlementService;
+
+    @RequestMapping("/index")
+    public String indexView(ModelMap model) {
+        return "restaurant/shopsettlement/index";
+    }
+
+    @RequestMapping("/list")
+    @PreAuthorize("hasPermission('/shopsettlement/index','')")
+    @ResponseBody
+    public PageResult<TShopSettlement> getDataList(@RequestParam("page") Integer pageNo,
+                                         @RequestParam("limit") Integer pageSize,
+                                         @RequestParam(value = "searchkey", required = false) String searchKey) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            ShopSettlementSearchBean searchBean = new ShopSettlementSearchBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setShopid(searchKey);
+            searchBean.setPageSize(pageSize);
+            return shopSettlementService.getAreaByKey(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    @GetMapping("/loadadd")
+    @PreAuthorize("hasPermission('/shopsettlement/loadadd','')")
+    public String loadadd(Model model) {
+        return "restaurant/shopsettlement/form";
+    }
+
+    @PostMapping("/add")
+    @ResponseBody
+    public JsonResult add(@RequestBody TShopSettlement shopSettlement) {
+        if (shopSettlement != null) {
+            return shopSettlementService.saveShopSettlement(shopSettlement);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+
+    @PostMapping("/delete")
+    @PreAuthorize("hasPermission('/shopsettlement/delete','')")
+    @ResponseBody
+    public JsonResult delfunc(@RequestParam Integer id) {
+        return shopSettlementService.deleteShopSettlement(id);
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
index 1136ace..088564c 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
@@ -19,6 +19,8 @@
 
     List<TCard> findAllByCustid(String custid);
 
+    List<TCard> findAllByCustidAndStatus(String custid,String status);
+
     List<TCard> findAllByCardnoAndStatus(String cardno,String status);
 
     Integer countByCardno(String cardno);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DevparaDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DevparaDao.java
index 68af28a..6891e58 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DevparaDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DevparaDao.java
@@ -15,9 +15,15 @@
   @Query("from TDevpara t where t.groupid=?1 order by t.paraname ")
   List<TDevpara> findAllByGroupid(int groupid);
 
+  @Query("from TDevpara t where t.groupid=?1 and t.paraname=?2 order by t.paraname ")
+  List<TDevpara> findByGroupidAndParaname(int groupid,String paraname);
+
   @Query("select t from TDevpara t,TDevparaGroup g where t.groupid=g.groupid and g.globalflag=true order by t.paraname ")
   List<TDevpara> findSystemDefaultDevpara();
 
+  @Query("select t from TDevpara t,TDevparaGroup g where t.groupid=g.groupid and g.globalflag=true and t.paraname=?1 order by t.paraname ")
+  List<TDevpara> findSystemDefaultDevparaByParaname(String paraname);
+
   @Query("from TDevpara t where t.groupid=?1 and t.paraname=?2")
   TDevpara findById(Integer groupid, String paraname);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
index a839940..03686d8 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
@@ -27,7 +27,7 @@
     public void setCardno(String cardno) {
         this.cardno = cardno;
     }
-    @Column(name = "cardphyid" ,nullable = false,length = 8)
+    @Column(name = "cardphyid" ,length = 8)
     public String getCardphyid() {
         return cardphyid;
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java
index b14dc93..bda2bea 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java
@@ -36,6 +36,7 @@
   private String refno;
   private String coreAccdate;
   private String coreStatus;
+  private String managefeetype;
 
 
   @Id
@@ -270,4 +271,13 @@
   public void setRuleid(Integer ruleid) {
     this.ruleid = ruleid;
   }
+
+  @Column(name = "managefeetype", length = 15)
+  public String getManagefeetype() {
+    return managefeetype;
+  }
+
+  public void setManagefeetype(String managefeetype) {
+    this.managefeetype = managefeetype;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
index 94b18ca..0a729f4 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
@@ -30,6 +30,9 @@
   @Transactional(rollbackFor = Exception.class, readOnly = true)
   List<TDevpara> getDevparaInfo(Integer groupid);
 
+  @Transactional(rollbackFor = Exception.class, readOnly = true)
+  TDevpara getDevparaInfoByParaname(Integer groupid,String paraname);
+
   @Transactional(rollbackFor = Exception.class)
   boolean saveOrUpdateDevpara(int groupid, String groupname, Map<String, String> param) throws WebCheckException;
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/ShopSettlementService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/ShopSettlementService.java
index 7360907..dc506bb 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/ShopSettlementService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/ShopSettlementService.java
@@ -1,6 +1,9 @@
 package com.supwisdom.dlpay.restaurant.service;
 
+import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.domain.TShopSettlement;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.restaurant.bean.ShopSettlementSearchBean;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -15,5 +18,14 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     List<TShopSettlement> getShopByShopid(String shopid);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    PageResult<TShopSettlement> getAreaByKey(ShopSettlementSearchBean param);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult saveShopSettlement(TShopSettlement area);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult deleteShopSettlement(Integer id);
 
 }
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 8687c15..7c1e5d3 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
@@ -47,7 +47,7 @@
     @Override
     public PageResult<CustomerShowBean> getCustomerPage(CustomerSearchBean param) {
         StringBuffer querySql = new StringBuffer("select t.cardno,c.custid,c.custname, " +
-                "t.bankcardno,t.cardphyid,c.phone,c.custtype,c.checkstatus from tb_customer c " +
+                "t.bankcardno,t.cardphyid,c.phone,c.custtype,c.checkstatus,t.status 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 ");
@@ -59,7 +59,7 @@
             querySql.append(" and  c.checkstatus = :checkstatus ");
             countSql.append(" and  c.checkstatus = :checkstatus ");
         }
-        querySql.append(" order by t.cardno ");
+        querySql.append("and t.status='normal' order by t.cardno ");
         Query query = entityManager.createNativeQuery(querySql.toString());
         Query countQuery = entityManager.createNativeQuery(countSql.toString());
         if (!StringUtil.isEmpty(param.getCustname())) {
@@ -67,7 +67,7 @@
             countQuery.setParameter("str", "%" + param.getCustname().trim() + "%");
         }
         if (!StringUtil.isEmpty(param.getCheckstatus())) {
-            query.setParameter("checkstatus",  param.getCheckstatus().trim() );
+            query.setParameter("checkstatus", param.getCheckstatus().trim());
             countQuery.setParameter("checkstatus", param.getCheckstatus().trim());
         }
         query.setFirstResult((param.getPageNo() - 1) * param.getPageSize());
@@ -89,17 +89,14 @@
 
     @Override
     public JsonResult saveCustomer(CustomerSaveBean customer) {
-        TCard card = new TCard();
+
         TCustomer cus = new TCustomer();
         if (!StringUtil.isEmpty(customer.getCustid())) {
             Optional<TCustomer> opt1 = customerDao.findById(customer.getCustid());
             if (opt1.isPresent()) {
                 cus = opt1.get();
             }
-            List<TCard> cardlist=cardDao.findAllByCustid(customer.getCustid());
-            if(cardlist.size()>0){
-                card=cardlist.get(0);
-            }
+
         }
         cus.setCusttype(customer.getCusttype());
         cus.setBatchno(customer.getBatchno());
@@ -112,26 +109,36 @@
         cus.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
         cus = customerDao.save(cus);
         if (null != cus) {
-            String cardverno = systemUtilService.getCardverno();
+
             String date = DateUtil.getNow("yyyyMMdd");
+            List<TCard> cardlist = cardDao.findAllByCustidAndStatus(customer.getCustid(),RestaurantConstant.STATUS_CARD_NORMAL);
+            if (cardlist.size() > 0) {
+                TCard ocard = cardlist.get(0);
+                String cardverno=systemUtilService.getCardverno();
+                ocard.setStatus(RestaurantConstant.STATUS_CARD_LOGOUT);
+                cardDao.save(ocard);
+                saveCardver(cardverno, date, ocard, ocard.getStatus(), ocard.getStatus(), 1);
+            }
+            TCard card = new TCard();
+            String cardverno = systemUtilService.getCardverno();
             card.setCardno(customer.getCardno());
             card.setOpendate(date);
             card.setCustid(cus.getCustid());
             card.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
             card.setTransstatus(RestaurantConstant.STATUS_CARD_NORMAL);
-            card.setCardphyid(customer.getCardphyid());
+            //       card.setCardphyid(customer.getCardphyid());
             card.setCardverno(cardverno);
             card.setBankcardno(customer.getBankcardno());
             card.setExpiredate("");
             card = cardDao.save(card);
-            saveCardver(cardverno, date, card, card.getStatus(), RestaurantConstant.STATUS_CARD_NORMAL,1);
+     //       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,Integer addderflag) {
+    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());
@@ -156,7 +163,7 @@
             c.setCardverno(cardverno);
             cardDao.save(c);
             String date = DateUtil.getNow("yyyyMMdd");
-            saveCardver(cardverno, date, c, c.getStatus(), RestaurantConstant.STATUS_CARD_LOGOUT,0);
+            saveCardver(cardverno, date, c, c.getStatus(), RestaurantConstant.STATUS_CARD_LOGOUT, 0);
         }
 
 
@@ -208,7 +215,7 @@
                     d.setBankcardno((String) data[i][2]);
                     String custtype = (String) data[i][3];
                     d.setCusttype(Integer.parseInt(custtype));
-                    d.setCardphyid((String) data[i][4]);
+                    //                  d.setCardphyid((String) data[i][4]);
                     if (null != data[i][5]) {
                         d.setPhone((String) data[i][5]);
                     }
@@ -279,8 +286,8 @@
 
     public TCustomer getCustomerByCardno(String cardno) {
         if (!StringUtil.isEmpty(cardno)) {
-            List<TCard> clst=cardDao.findAllByCardnoAndStatus(cardno,"normal");
-            if(clst.size()<=0){
+            List<TCard> clst = cardDao.findAllByCardnoAndStatus(cardno, "normal");
+            if (clst.size() <= 0) {
                 return null;
             }
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
index 3a18889..15187d1 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
@@ -103,6 +103,21 @@
   }
 
   @Override
+  public TDevpara getDevparaInfoByParaname(Integer groupid,String paraname) {
+   TDevpara result;
+    if (null != groupid && groupid > 0) {
+      result = devparaDao.findByGroupidAndParaname(groupid,paraname).get(0);
+    } else {
+      result = devparaDao.findSystemDefaultDevparaByParaname(paraname).get(0); //默认
+    }
+    if (null!=result) {
+      return result;
+    } else {
+      return null;
+    }
+  }
+
+  @Override
   public boolean saveOrUpdateDevpara(int groupid, String groupname, Map<String, String> param) throws WebCheckException {
     TDevparaGroup group;
     if (groupid == 0) {
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/ShopSettlementServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/ShopSettlementServiceImpl.java
index c4195b3..aa78766 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/ShopSettlementServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/ShopSettlementServiceImpl.java
@@ -6,6 +6,7 @@
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.restaurant.bean.AreaSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.ShopSettlementSearchBean;
 import com.supwisdom.dlpay.restaurant.dao.AreaDao;
 import com.supwisdom.dlpay.restaurant.domain.TArea;
 import com.supwisdom.dlpay.restaurant.service.AreaService;
@@ -32,4 +33,26 @@
     public List<TShopSettlement> getShopByShopid(String shopid) {
         return  shopSettlementDao.findByShopid(shopid);
     }
+
+    @Override
+    public PageResult<TShopSettlement> getAreaByKey(ShopSettlementSearchBean param) {
+        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+                , Sort.by("shopid"));
+        if (!StringUtil.isEmpty(param.getShopid())) {
+            return new PageResult<>(shopSettlementDao.findAllByShopidContaining(param.getShopid(), pageable));
+        }
+        return new PageResult<>(shopSettlementDao.findAll(pageable));
+    }
+
+    @Override
+    public JsonResult saveShopSettlement(TShopSettlement shop) {
+        shopSettlementDao.save(shop);
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public JsonResult deleteShopSettlement(Integer id) {
+        shopSettlementDao.deleteById(id);
+        return JsonResult.ok("成功");
+    }
 }
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index c819258..44cc25b 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -121,7 +121,7 @@
 INSERT INTO "tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (18, NULL, 1, NULL, '', '/whitelistcheck/index', '就餐白名单审核', 2, 11);
 INSERT INTO "tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (31, NULL, 1, NULL, '', '/whitelistbind/devbind', '就餐白名单设备绑定', 3, 11);
 INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (11, NULL, 0, NULL, 'layui-icon-util', '#', '就餐白名单管理', 7, -1);
-
+INSERT INTO  tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (32, NULL, 1, NULL, '', '/shopsettlement/index', '商户管理', 2, 22);
 
 
 
@@ -300,6 +300,10 @@
 INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a480073', 3, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a480074', 18, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ea57c6e26421b016e264517d40044', 93, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ea57c6e26421b016e264517d40045', 73, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ea57c6e26421b016e264517d40046', 92, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+
 
 
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (4, '1', 4, '添加功能', '/function/add');
@@ -443,7 +447,7 @@
 INSERT INTO "tb_role_function"("id", "functionid", "permissions", "roleid") VALUES ('297ee5316d2446b3016d2447fc74006a', 11, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO "tb_role_function"("id", "functionid", "permissions", "roleid") VALUES ('297ee5316d24bd0e016d24c02e250039', 8, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
-
+INSERT INTO "tb_role_function"("id", "functionid", "permissions", "roleid") VALUES ('297ea57c6e26421b016e264517d30043', 32, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
 INSERT INTO "tb_shopsettlement" (shopsettlementno,operno,shopid,shopname) VALUES ('1', '1234', '2000000012', '测试商户');
 INSERT INTO "tb_subject" (subjno,balflag,displayflag,endflag,fsubjno,opendate,subjlevel,subjname,subjtype) VALUES ('1001', 1, 'y', 1, NULL, 20190604, 1, '库存现金', 1);
diff --git a/src/main/resources/templates/restaurant/customer/form.html b/src/main/resources/templates/restaurant/customer/form.html
index 748db9d..0ae132f 100644
--- a/src/main/resources/templates/restaurant/customer/form.html
+++ b/src/main/resources/templates/restaurant/customer/form.html
@@ -16,13 +16,13 @@
         </div>
     </div>
 
-    <div class="layui-form-item">
+ <!--   <div class="layui-form-item">
         <label class="layui-form-label"><span style="color: red">* </span>物理卡号</label>
         <div class="layui-input-block">
             <input name="cardphyid" placeholder="请输入" type="text" class="layui-input" maxlength="20"
                    lay-verify="required" required/>
         </div>
-    </div>
+    </div>-->
 
     <div class="layui-form-item">
         <label class="layui-form-label">人员类别</label>
diff --git a/src/main/resources/templates/restaurant/customer/index.html b/src/main/resources/templates/restaurant/customer/index.html
index 715a708..085f88e 100644
--- a/src/main/resources/templates/restaurant/customer/index.html
+++ b/src/main/resources/templates/restaurant/customer/index.html
@@ -59,6 +59,19 @@
                         }
                     },
                     {
+                        field: 'status', title: '卡状态', align: 'center', width: 120, sort: true, templet: function (d) {
+                            if ('normal' == d.status) {
+                                return '<span class="layui-badge layui-bg-green">正常</span>';
+                            } else if ('logout' == d.status) {
+                                return '<span class="layui-badge layui-bg-gray">注销</span>';
+                            } else if ('fail' == d.status) {
+                                return '<span class="layui-badge layui-bg-gray">失败</span>';
+                            } else {
+                                return d.status;
+                            }
+                        }
+                    },
+                    {
                         field: 'custtype', width:100, title: '人员类别', templet: function (item) {
                             if(item.custtype==null){
                                 return ''
diff --git a/src/main/resources/templates/restaurant/shopsettlement/form.html b/src/main/resources/templates/restaurant/shopsettlement/form.html
new file mode 100644
index 0000000..76e8d79
--- /dev/null
+++ b/src/main/resources/templates/restaurant/shopsettlement/form.html
@@ -0,0 +1,79 @@
+<!-- operator表单弹窗 -->
+<form id="shopsettle-form" lay-filter="shopsettle-form" class="layui-form model-form">
+    <input name="shopSettlementno" id="shopSettlementno" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label">商户名称</label>
+        <div class="layui-input-block">
+            <input name="shopname" placeholder="商户名不能重复" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|shopname" required/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">商户号</label>
+        <div class="layui-input-block">
+            <input name="shopid" placeholder="请输入" type="text" class="layui-input"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="shopsettle-form-submit" lay-submit id="shopsettle-submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+
+
+        var url = '[[@{/shopsettlement/add}]]';
+        // 回显user数据
+        var func = admin.getTempData('t_shopsettle');
+        if (func) {
+            $('input[name="shopsettlementno"]').attr('readonly', 'readonly');
+            form.val('shopsettle-form', func);
+        }
+
+        // 表单提交事件
+        form.on('submit(shopsettle-form-submit)', function (data) {
+            console.log(data.field);
+            debugger
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                data: JSON.stringify(data.field),
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error: function () {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/shopsettlement/index.html b/src/main/resources/templates/restaurant/shopsettlement/index.html
new file mode 100644
index 0000000..80cf02e
--- /dev/null
+++ b/src/main/resources/templates/restaurant/shopsettlement/index.html
@@ -0,0 +1,112 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">商户维护</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">商户维护</a>
+          <a><cite>商户维护</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索：
+            <input id="shopsettle-search-value" class="layui-input search-input" type="text" placeholder="输入功能名称"/>&emsp;
+            <button id="shopsettle-btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="shopsettle-btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加商户</button>
+        </div>
+        <table class="layui-table" id="shopsettle-table" lay-filter="shopsettle-table"></table>
+    </div>
+</div>
+<script>
+
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
+
+        form.render('select');
+
+        // 渲染表格
+        table.render({
+            elem: '#shopsettle-table',
+            url: '[[@{/shopsettlement/list}]]',
+            page: true,
+            cols: [
+                [
+                 /*   {field: 'id', title: '商户号', width: 80, fixed: 'left', sort: true},*/
+                    {field: 'shopname', title: '商户名称', sort: true},
+
+                    {field: 'shopid', sort: true,  title: '商户号'},
+                    {
+                        field: 'shopsettlementno', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                            return ' <a class="layui-btn  layui-btn-xs" lay-event="shopsettle-edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +
+                                ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="shopsettle-del"><i class="layui-icon layui-icon-delete"></i>删除</a>'
+                        }
+                    }
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#shopsettle-btn-search').click(function () {
+            let key = $('#shopsettle-search-value').val();
+            table.reload('shopsettle-table', {where: {searchkey: key}, page: {curr: 1}});
+        });
+        $('#shopsettle-btn-add').click(function () {
+            showModel();
+        });
+        let showModel = function (data) {
+            console.log(data);
+            let title = data ? '修改商户' : '添加商户';
+            admin.putTempData('t_shopsettle', data);
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/shopsettlement/loadadd}]]',
+                finish: function () {
+                    table.reload('shopsettle-table', {});
+                }
+            });
+        };
+
+
+        // 工具条点击事件
+        table.on('tool(shopsettle-table)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            console.log(data);
+            if (layEvent === 'shopsettle-edit') {
+                showModel(data);
+            } else if (layEvent === 'shopsettle-del') {
+                showDelete(data);
+            }
+        });
+        let showDelete = function (data) {
+            layer.confirm('确定要删除吗？', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('[[@{/shopsettlement/delete}]]', {
+                    id: data.shopSettlementno,
+                    _csrf: token
+                }, function (data) {
+                    console.log(data.code);
+                    layer.closeAll('loading');
+                    if (data.code == 200) {
+                        layer.msg(data.msg, {icon: 1});
+                    } else if (data.code == 401) {
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        layer.msg(data.msg, {icon: 2});
+                    }
+                    table.reload('shopsettle-table', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    layer.msg('请求失败了，请稍后再试', {icon: 2});
+                });
+            });
+        }
+    });
+</script>
