前台添加商户维护页面,删除卡物理id判断,新增人员是不再添加cardver,消费限额添加判断
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>