白名单接口添加,设备审核添加
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 287dde0..2def5f1 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -8,7 +8,8 @@
 #logging.level.org.hibernate.SQL=DEBUG
 # Postgresql settings
 spring.datasource.platform=postgresql
-spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/restauranttest
+#spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/restauranttest
+spring.datasource.url=jdbc:postgresql://172.28.201.101:25432/restauranttest
 spring.datasource.username=payapi
 spring.datasource.password=123456
 database.dbtype=postgresql
diff --git a/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java b/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
index 7322f57..dd01d04 100644
--- a/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
+++ b/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
@@ -45,9 +45,14 @@
             logger.info("业务参数appid或secret未配置");
             return;
         }
-        ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
-        helper.login(appid.getParaval(), secret.getParaval());
-        logger.info("登录成功");
+        try{
+            ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+            helper.login(appid.getParaval(), secret.getParaval());
+            logger.info("登录成功");
+        }catch (Exception e){
+            logger.error("登录失败");
+        }
+
     }
 
 }
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 c5808eb..fa12126 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
@@ -57,7 +57,7 @@
     @Autowired
     private BusinessparaDao businessparaDao;
     @Autowired
-    private DiscountRuleDao discountRuleDao;
+    private WhitelistService whitelistService;
     @Autowired
     private DeviceDiscountRuleService deviceDiscountRuleService;
     @Autowired
@@ -68,6 +68,7 @@
     private ConsumePropxy consumePropxy;
 
 
+
     @Override
     public PosPayLoginResp doLogin(PosPayLoginReq req) {
         PosPayLoginResp resp = new PosPayLoginResp();
@@ -463,26 +464,22 @@
     public PosPayWhitelistResp doGetWhitelist(PosPayWhitelistReq req) {
         PosPayWhitelistResp resp = new PosPayWhitelistResp();
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (null == device) {
-            resp.setRetcode(ErrorCode.E_DB_QRY);
-            resp.setRetmsg("设备物理ID不存在");
-            return resp;
-
-        }
-        if (device.getState() != 1) {
-            resp.setRetcode(ErrorCode.ERRIF_OTHER);
-            resp.setRetmsg("设备状态错误");
-            return resp;
-        }
+        if (checkDevice(resp, device)) return resp;
         device.setCardverno(req.getCardverno());
         deviceService.saveDevice(device);
-
         ArrayList<CardverBean> cardverFlags = new ArrayList<CardverBean>();
         String maxCardverno = cardService.getMaxCarcver();
         Integer count = req.getMaxcount();
-        List<TCardver> blacklistCards = cardService.getCardlistByTCardVer(req.getCardverno());
-        System.out.println("blacksize+++" + blacklistCards.size());
-        if (null == blacklistCards || blacklistCards.size() < 1) {
+        List<TCardver> whitelistCards ;
+        TWhitelistDevbind bind=whitelistService.getWhitelistDevbindByDeviceId(device.getId());
+
+        if(null!=bind){
+            whitelistCards=whitelistService.getDevBindCardver(device.getId());
+        }else{
+            whitelistCards= cardService.getCardlistByTCardVer(req.getCardverno());
+        }
+
+        if (null == whitelistCards || whitelistCards.size() < 1) {
             resp.setCardverno(maxCardverno);
             resp.setRetcode(ErrorCode.ERRIF_OK);
             resp.setRetmsg("下载成功");
@@ -491,12 +488,11 @@
             return resp;
         }
 
-        if (blacklistCards.size() < count) {
-
-            count = blacklistCards.size();
+        if (whitelistCards.size() < count) {
+            count = whitelistCards.size();
         }
         for (int i = 0; i < count; i++) {
-            TCardver cardver = blacklistCards.get(i);
+            TCardver cardver = whitelistCards.get(i);
             CardverBean cardverFlag = new CardverBean();
             cardverFlag.setCardno(cardver.getCardno());
             cardverFlag.setCardphyid(cardver.getCardphyid());
@@ -514,20 +510,30 @@
         return resp;
     }
 
-    @Override
-    public PosPayHeartBeatResp posHeartBeat(PosPayHeartBeatReq req) {
-        PosPayHeartBeatResp resp = new PosPayHeartBeatResp();
-        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+    private boolean checkDevice(APIResp resp, TDevice device) {
         if (null == device) {
             resp.setRetcode(ErrorCode.E_DB_QRY);
             resp.setRetmsg("设备物理ID不存在");
-            return resp;
+            return true;
         }
         if (device.getState() != 1) {
             resp.setRetcode(ErrorCode.ERRIF_OTHER);
             resp.setRetmsg("设备状态错误");
-            return resp;
+            return true;
         }
+        if(!RestaurantConstant.STATUS_CHECKSTATUS_NORMAL.equals(device.getCheckstatus())){
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("设备审核未通过");
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public PosPayHeartBeatResp posHeartBeat(PosPayHeartBeatReq req) {
+        PosPayHeartBeatResp resp = new PosPayHeartBeatResp();
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (checkDevice(resp, device)) return resp;
         String datetime = DateUtil.getNow("yyyyMMddHHmmss");
 
         device.setCardverno(req.getCardverno());
@@ -556,17 +562,7 @@
     public PosPayQuerysalesResp posQuerySales(PosPaySysparaReq req) {
         PosPayQuerysalesResp resp=new PosPayQuerysalesResp();
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (null == device) {
-            resp.setRetcode(ErrorCode.E_DB_QRY);
-            resp.setRetmsg("设备物理ID不存在");
-            return resp;
-
-        }
-        if (device.getState() != 1) {
-            resp.setRetcode(ErrorCode.ERRIF_OTHER);
-            resp.setRetmsg("设备状态错误");
-            return resp;
-        }
+        if (checkDevice(resp, device)) return resp;
 
         SalesAmtBean salesAmtBean=transDtlService.getSalesToday(req.getTermdate(),device.getId());
         ManageFeeAmtBean feeAmtBean=transDtlService.getManageFeeToday(req.getTermdate(),device.getId());
@@ -587,17 +583,7 @@
         PosPayAccqueryResp resp=new PosPayAccqueryResp();
 
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (null == device) {
-            resp.setRetcode(ErrorCode.E_DB_QRY);
-            resp.setRetmsg("设备物理ID不存在");
-            return resp;
-
-        }
-        if (device.getState() != 1) {
-            resp.setRetcode(ErrorCode.ERRIF_OTHER);
-            resp.setRetmsg("设备状态错误");
-            return resp;
-        }
+        if (checkDevice(resp, device)) return resp;
 
         TCard card=cardService.getCardByCardnoAndCardphyid(req.getCardno(),req.getCardphyid());
 
@@ -759,17 +745,7 @@
     public PosPayGolbalParamResp getBusinessParam(PosPayGolbalParamReq req) {
         PosPayGolbalParamResp resp=new PosPayGolbalParamResp();
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (null == device) {
-            resp.setRetcode(ErrorCode.E_DB_QRY);
-            resp.setRetmsg("设备物理ID不存在");
-            return resp;
-
-        }
-        if (device.getState() != 1) {
-            resp.setRetcode(ErrorCode.ERRIF_OTHER);
-            resp.setRetmsg("设备状态错误");
-            return resp;
-        }
+        if (checkDevice(resp, device)) return resp;
         TBusinesspara url=businessparaDao.findByParakey("upgrade_url");
         TBusinesspara version=businessparaDao.findByParakey("upgrade_version");
         if(null==url||null==version){
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CardverWhitelistBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CardverWhitelistBean.java
new file mode 100644
index 0000000..7947635
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CardverWhitelistBean.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+
+
+public class CardverWhitelistBean {
+    private String cardphyid;
+    private String cardno;
+
+    public String getCardphyid() {
+        return cardphyid;
+    }
+
+    public void setCardphyid(String cardphyid) {
+        this.cardphyid = cardphyid;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/DeviceSearchBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/DeviceSearchBean.java
index d9985c0..99f6d2d 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/DeviceSearchBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/DeviceSearchBean.java
@@ -8,6 +8,15 @@
     private String factoryid;
     private Integer devgroupid;
     private String devphyid;
+    private String checkstatus;
+
+    public String getCheckstatus() {
+        return checkstatus;
+    }
+
+    public void setCheckstatus(String checkstatus) {
+        this.checkstatus = checkstatus;
+    }
 
     public String getDevphyid() {
         return devphyid;
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistBindBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistBindBean.java
new file mode 100644
index 0000000..b51a604
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistBindBean.java
@@ -0,0 +1,23 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+public class WhitelistBindBean {
+  private String cardno;
+  private String cardphyid;
+
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getCardphyid() {
+    return cardphyid;
+  }
+
+  public void setCardphyid(String cardphyid) {
+    this.cardphyid = cardphyid;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistBindShowBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistBindShowBean.java
new file mode 100644
index 0000000..e9da88c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistBindShowBean.java
@@ -0,0 +1,77 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+public class WhitelistBindShowBean {
+  private String id;
+  private Integer deviceid;
+  private String devicename;
+  private String devphyid;
+  private Integer whitelistid;
+  private String listname;
+  private String liststatus;
+  private String createtime;
+
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public Integer getDeviceid() {
+    return deviceid;
+  }
+
+  public void setDeviceid(Integer deviceid) {
+    this.deviceid = deviceid;
+  }
+
+  public String getDevicename() {
+    return devicename;
+  }
+
+  public void setDevicename(String devicename) {
+    this.devicename = devicename;
+  }
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public Integer getWhitelistid() {
+    return whitelistid;
+  }
+
+  public void setWhitelistid(Integer whitelistid) {
+    this.whitelistid = whitelistid;
+  }
+
+  public String getListname() {
+    return listname;
+  }
+
+  public void setListname(String listname) {
+    this.listname = listname;
+  }
+
+  public String getListstatus() {
+    return liststatus;
+  }
+
+  public void setListstatus(String liststatus) {
+    this.liststatus = liststatus;
+  }
+
+  public String getCreatetime() {
+    return createtime;
+  }
+
+  public void setCreatetime(String createtime) {
+    this.createtime = createtime;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistShowBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistShowBean.java
new file mode 100644
index 0000000..581ff0f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/WhitelistShowBean.java
@@ -0,0 +1,41 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+public class WhitelistShowBean {
+  private Integer whitelistid;
+  private String listname;
+  private String status;
+  private String remark;
+
+
+  public Integer getWhitelistid() {
+    return whitelistid;
+  }
+
+  public void setWhitelistid(Integer whitelistid) {
+    this.whitelistid = whitelistid;
+  }
+
+  public String getListname() {
+    return listname;
+  }
+
+  public void setListname(String listname) {
+    this.listname = listname;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceCheckController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceCheckController.java
new file mode 100644
index 0000000..8068f11
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceCheckController.java
@@ -0,0 +1,85 @@
+package com.supwisdom.dlpay.restaurant.controller;
+
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.exception.WebCheckException;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
+import com.supwisdom.dlpay.restaurant.domain.TDevice;
+import com.supwisdom.dlpay.restaurant.service.DeviceService;
+import com.supwisdom.dlpay.restaurant.service.ShopSettlementService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+@RequestMapping("/devicecheck")
+public class DeviceCheckController {
+
+    @Autowired
+    private DeviceService deviceService;
+    @Autowired
+    private ShopSettlementService shopSettlementService;
+
+    @RequestMapping("/index")
+    public String indexView(ModelMap model) {
+
+        return "restaurant/devicecheck/index";
+    }
+
+    @RequestMapping("/list")
+    @PreAuthorize("hasPermission('/devicecheck/index','')")
+    @ResponseBody
+    public PageResult<TDevice> getDataList(@RequestParam("page") Integer pageNo,
+                                         @RequestParam("limit") Integer pageSize,
+                                         @RequestParam(value = "status", required = false) String status) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            DeviceSearchBean searchBean = new DeviceSearchBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setCheckstatus(status);
+            searchBean.setPageSize(pageSize);
+            return deviceService.getDeviceByParam(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    @PostMapping("/docheckdevice")
+    @PreAuthorize("hasPermission('/devicecheck/docheckdevice','')")
+    @ResponseBody
+    public JsonResult doCheckDevice(@RequestParam("status") String status,
+                            @RequestParam("datalist[]") List<Integer> deviceIds,
+                            @AuthenticationPrincipal UserDetails operUser ) {
+        if (StringUtil.isEmpty(status)) {
+            return JsonResult.error("参数传递失败");
+        }
+        if(deviceIds.size()<0){
+            return JsonResult.error("设备数量不能小余0");
+        }
+        try {
+            if(deviceService.doCheckdevice(status,deviceIds,operUser)){
+                return JsonResult.ok("审核成功");
+            }else{
+                return JsonResult.error("审核失败");
+            }
+
+        }catch (WebCheckException ex){
+            return JsonResult.error(ex.getMessage());
+        }
+
+    }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java
index 0bcf9dc..6bfbef1 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java
@@ -3,6 +3,7 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.domain.TShopSettlement;
+import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
 import com.supwisdom.dlpay.restaurant.domain.TDevice;
 import com.supwisdom.dlpay.restaurant.service.DeviceService;
@@ -71,6 +72,7 @@
     @ResponseBody
     public JsonResult add(@RequestBody TDevice device) {
         if (device != null) {
+
             return deviceService.saveDevice(device);
         } else {
             return JsonResult.error("添加失败");
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
index ac610bf..7003cb4 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
@@ -28,381 +28,380 @@
 
 @Controller
 public class DeviceDiscountRuleController {
-  @Autowired
-  private DeviceDiscountRuleService deviceDiscountRuleService;
-  @Autowired
-  private DeviceParamService deviceParamService;
+    @Autowired
+    private DeviceDiscountRuleService deviceDiscountRuleService;
+    @Autowired
+    private DeviceParamService deviceParamService;
 
-  @GetMapping("/discountrule/index")
-  public String DiscountRuleView() {
-    return "restaurant/discountrule/rule";
-  }
-
-  @GetMapping("/discountrule/rulelist")
-  @PreAuthorize("hasPermission('/discountrule/index','')")
-  @ResponseBody
-  public PageResult<DiscountRuleShowBean> searchDiscountRules(@RequestParam("page") Integer pageNo,
-                                                              @RequestParam("limit") Integer pageSize,
-                                                              @RequestParam(value = "rulename", required = false) String rulename,
-                                                              @RequestParam(value = "ruletype", required = false) String ruletype) {
-    try {
-      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-      return deviceDiscountRuleService.getDiscountRuleInfos(rulename, ruletype, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
-    }
-  }
-
-  @PostMapping("/discountrule/deleterule")
-  @PreAuthorize("hasPermission('/discountrule/deleterule','')")
-  @ResponseBody
-  public JsonResult deleteDiscountRule(@RequestParam("ruleid") Integer ruleid) {
-    try {
-      if (null == ruleid) {
-        return JsonResult.error("参数传递错误");
-      }
-      if (deviceDiscountRuleService.deleteDiscountRule(ruleid)) {
-        return JsonResult.ok("删除成功!");
-      } else {
-        return JsonResult.error("删除失败!");
-      }
-    }catch (WebCheckException ex){
-      return JsonResult.error(ex.getMessage());
-    }catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/discountrule/closerule")
-  @PreAuthorize("hasPermission('/discountrule/closerule','')")
-  @ResponseBody
-  public JsonResult closeDiscountRule(@RequestParam("ruleid") Integer ruleid) {
-    try {
-      if (null == ruleid) {
-        return JsonResult.error("参数传递错误");
-      }
-      if (deviceDiscountRuleService.closeDiscountRule(ruleid)) {
-        return JsonResult.ok("关闭成功!");
-      } else {
-        return JsonResult.error("关闭失败!");
-      }
-    } catch (WebCheckException ex) {
-      return JsonResult.error(ex.getMessage());
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-
-
-  @GetMapping("/discountrule/load4addrule")
-  @PreAuthorize("hasPermission('/discountrule/load4addrule','')")
-  public String load4addDiscountRule() {
-    return "restaurant/discountrule/ruleform";
-  }
-
-  @GetMapping("/discountrule/checkrulename")
-  @PreAuthorize("hasPermission('/discountrule/load4addrule','')")
-  @ResponseBody
-  public JsonResult checkRulename(@RequestParam("rulename") String rulename,
-                                  @RequestParam(value = "ruleid", required = false) Integer ruleid) {
-    try {
-      if (StringUtil.isEmpty(rulename)) {
-        return JsonResult.error("餐补规则名称不能为空");
-      }
-      if (deviceDiscountRuleService.checkDiscountRulenameExist(rulename.trim(), ruleid)) {
-        return JsonResult.error("餐补规则名称已存在");
-      } else {
-        return JsonResult.ok("success");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/discountrule/addrule")
-  @PreAuthorize("hasPermission('/discountrule/addrule','')")
-  @ResponseBody
-  public JsonResult editDiscountRule(@RequestParam("rulename") String rulename,
-                                     @RequestParam("ruletype") String ruletype,
-                                     @RequestParam("starttime") String starttime,
-                                     @RequestParam("endtime") String endtime,
-                                     @RequestParam("amount") String amount,
-                                     @RequestParam("limitcnt") Integer limitcnt,
-                                     @RequestParam(value = "file", required = false) MultipartFile file,
-                                     @AuthenticationPrincipal UserDetails operUser) {
-    try {
-      if (StringUtil.isEmpty(rulename)
-          || (!RestaurantConstant.RULETYPE_QUOTA.equals(ruletype) && !RestaurantConstant.RULETYPE_REDUCTION.equals(ruletype)&& !RestaurantConstant.RULETYPE_DISCOUNT.equals(ruletype))
-          || !DateUtil.checkDatetimeValid(starttime, "HH:mm")
-          || !DateUtil.checkDatetimeValid(endtime, "HH:mm")
-          || !NumberUtil.isAmount(amount) || null == limitcnt) {
-        return JsonResult.error("参数传递错误");
-      } else if (DateUtil.compareDatetime(endtime, starttime, "HH:mm") <= 0) {
-        return JsonResult.error("时间范围错误,结束时间必须必起始时间大");
-      } else if (Double.valueOf(amount) < 0) {
-        return JsonResult.error("金额不能为负");
-      } else if (limitcnt < 1) {
-        return JsonResult.error("使用次数必须大于零");
-      } else if(null == file){
-        return JsonResult.error("请选择餐补名单");
-      }
-
-      TOperator oper = (TOperator) operUser;
-      if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
-        return JsonResult.error("登录过期,请重新登录");
-      }
-
-      if (deviceDiscountRuleService.saveNewDiscountRule(rulename.trim(), ruletype, DateUtil.unParseToDateFormat(starttime), DateUtil.unParseToDateFormat(endtime), Double.parseDouble(amount), limitcnt, file, oper)) {
-        return JsonResult.ok("新增成功");
-      } else {
-        return JsonResult.error("新增失败");
-      }
-    } catch (WebCheckException ex) {
-      return JsonResult.ok(599, ex.getMessage());
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-
-  @GetMapping("/discountrule/downloadexcel")
-  @PreAuthorize("hasPermission('/discountrule/load4addrule','')")
-  @ResponseBody
-  public void downloadDiscountRuleExcel(HttpServletRequest request, HttpServletResponse response) {
-    try {
-      String[] title = {"市民卡号", "姓名"}; //表头
-      String[][] infos = {{"19045632", "张三"}}; // 示例内容
-      ExportExcel.queryexcel("餐补名单模板", title, infos, request, response);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-
-  @GetMapping("/discountrule/load4detail")
-  public String load4DiscountRuleDetails(@RequestParam("ruleid") Integer ruleid, Model model) {
-    model.addAttribute("detailRuleid", ruleid);
-    return "restaurant/discountrule/ruledetail";
-  }
-
-  @GetMapping("/discountrule/load4detaillist")
-  @PreAuthorize("hasPermission('/discountrule/load4detail','')")
-  @ResponseBody
-  public PageResult<TDiscountDetail> searchDiscountRules(@RequestParam("page") Integer pageNo,
-                                                         @RequestParam("limit") Integer pageSize,
-                                                         @RequestParam("ruleid") Integer ruleid,
-                                                         @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;
-      return deviceDiscountRuleService.getDiscountRuleDetails(searchkey, ruleid, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
-    }
-  }
-
-
-  /**
-   * ====================================================
-   * 餐补规则审核
-   * ====================================================
-   */
-  @GetMapping("/discountrule/check")
-  public String checkDiscountRulesView() {
-    return "restaurant/discountrule/rulecheck";
-  }
-
-  @GetMapping("/discountrule/checklist")
-  @PreAuthorize("hasPermission('/discountrule/check','')")
-  @ResponseBody
-  public PageResult<DiscountRuleShowBean> searchCheckDiscountRules(@RequestParam("page") Integer pageNo,
-                                                                   @RequestParam("limit") Integer pageSize,
-                                                                   @RequestParam(value = "status", required = false) String status) {
-    try {
-      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-      return deviceDiscountRuleService.getCheckDiscountRuleInfos(status, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
-    }
-  }
-
-  @GetMapping("/discountrule/load4checkdetail")
-  @PreAuthorize("hasPermission('/discountrule/load4checkdetail','')")
-  public String load4DiscountRuleCheckDetails(@RequestParam("ruleid") Integer ruleid, Model model) {
-    model.addAttribute("checkDetailRuleid", ruleid);
-    return "restaurant/discountrule/checkdetail";
-  }
-
-  @GetMapping("/discountrule/load4checkdetaillist")
-  @PreAuthorize("hasPermission('/discountrule/load4checkdetail','')")
-  @ResponseBody
-  public PageResult<TDiscountDetail> searchDiscountRulesCheckDetails(@RequestParam("page") Integer pageNo,
-                                                         @RequestParam("limit") Integer pageSize,
-                                                         @RequestParam("ruleid") Integer ruleid,
-                                                         @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;
-      return deviceDiscountRuleService.getDiscountRuleDetails(searchkey, ruleid, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
-    }
-  }
-
-  @PostMapping("/discountrule/checkruledetail")
-  @PreAuthorize("hasPermission('/discountrule/checkruledetail','')")
-  @ResponseBody
-  public JsonResult editDiscountRule(@RequestParam("ruleid") Integer ruleid,
-                                     @RequestParam("checktype") String checktype,
-                                     @RequestParam("reason") String reason,
-                                     @AuthenticationPrincipal UserDetails operUser) {
-    try {
-      if (null == ruleid || (!"pass".equals(checktype) && !"reject".equals(checktype))) {
-        return JsonResult.error("参数传递错误");
-      } else if ("reject".equals(checktype) && StringUtil.isEmpty(reason)) {
-        return JsonResult.error("请填写驳回原因");
-      }
-
-      TOperator oper = (TOperator) operUser;
-      if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
-        return JsonResult.error("登录过期,请重新登录");
-      }
-
-      if (deviceDiscountRuleService.doCheckDiscountRule(ruleid, "pass".equals(checktype), reason, oper)) {
-        return JsonResult.ok("pass".equals(checktype) ? "审核通过" : "驳回成功");
-      } else {
-        return JsonResult.error("操作失败");
-      }
-
-    } catch (WebCheckException ex) {
-      return JsonResult.error(ex.getMessage());
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
+    @GetMapping("/discountrule/index")
+    public String DiscountRuleView() {
+        return "restaurant/discountrule/rule";
     }
 
-  }
-
-  /**
-   * ====================================================
-   * 餐补规则绑定设备
-   * ====================================================
-   */
-  @GetMapping("/discountrule/devbind")
-  public String bindDiscountRuleView() {
-    return "restaurant/discountrule/ruledevbind";
-  }
-
-  @GetMapping("/discountrule/devbindlist")
-  @PreAuthorize("hasPermission('/discountrule/devbind','')")
-  @ResponseBody
-  public PageResult<DiscountRuleBindShowBean> searchDiscountDevbindInfo(@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;
-      return deviceDiscountRuleService.getDiscountRuleDevBindInfo(searchkey, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
+    @GetMapping("/discountrule/rulelist")
+    @PreAuthorize("hasPermission('/discountrule/index','')")
+    @ResponseBody
+    public PageResult<DiscountRuleShowBean> searchDiscountRules(@RequestParam("page") Integer pageNo,
+                                                                @RequestParam("limit") Integer pageSize,
+                                                                @RequestParam(value = "rulename", required = false) String rulename,
+                                                                @RequestParam(value = "ruletype", required = false) String ruletype) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            return deviceDiscountRuleService.getDiscountRuleInfos(rulename, ruletype, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
     }
-  }
 
-  @PostMapping("/discountrule/deletedevbind")
-  @PreAuthorize("hasPermission('/discountrule/deletedevbind','')")
-  @ResponseBody
-  public JsonResult deleteDiscountDevbind(@RequestParam("id") String id) {
-    try {
-      TDiscountDevbind bind = deviceDiscountRuleService.getDiscountDevbindById(id);
-      if (null == bind) {
-        return JsonResult.error("绑定关系不存在!");
-      }
-
-      if (deviceDiscountRuleService.deleteDiscountDevbind(bind)) {
-        return JsonResult.ok("删除成功");
-      } else {
-        return JsonResult.error("删除失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
+    @PostMapping("/discountrule/deleterule")
+    @PreAuthorize("hasPermission('/discountrule/deleterule','')")
+    @ResponseBody
+    public JsonResult deleteDiscountRule(@RequestParam("ruleid") Integer ruleid) {
+        try {
+            if (null == ruleid) {
+                return JsonResult.error("参数传递错误");
+            }
+            if (deviceDiscountRuleService.deleteDiscountRule(ruleid)) {
+                return JsonResult.ok("删除成功!");
+            } else {
+                return JsonResult.error("删除失败!");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
     }
-  }
 
-  @GetMapping("/discountrule/load4binddev")
-  @PreAuthorize("hasPermission('/discountrule/load4binddev','')")
-  public String load4RuleBindDevice(Model model) {
-    model.addAttribute("rulelist", deviceDiscountRuleService.getNormalDiscountRules());
-    return "restaurant/discountrule/rulebind";
-  }
-
-  @GetMapping("/discountrule/devsearch")
-  @PreAuthorize("hasPermission('/discountrule/load4binddev','')")
-  @ResponseBody
-  public PageResult<DevparaBinddevShowBean> searchRuleBindDevices(@RequestParam(value = "devgroupid", required = false) Integer devgroupid,
-                                                                  @RequestParam(value = "searchkey", required = false) String searchkey,
-                                                                  @RequestParam(value = "ruleid", required = false) Integer ruleid){
-    try {
-      if (null == ruleid && null == devgroupid && StringUtil.isEmpty(searchkey)) {
-        return new PageResult<>(99, "请填写条件查询设备");
-      }else if(null==ruleid){
-        return new PageResult<>(99, "请选择餐补规则");
-      }
-
-      return deviceDiscountRuleService.searchRuleBindDevices(devgroupid, searchkey, ruleid);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
+    @PostMapping("/discountrule/closerule")
+    @PreAuthorize("hasPermission('/discountrule/closerule','')")
+    @ResponseBody
+    public JsonResult closeDiscountRule(@RequestParam("ruleid") Integer ruleid) {
+        try {
+            if (null == ruleid) {
+                return JsonResult.error("参数传递错误");
+            }
+            if (deviceDiscountRuleService.closeDiscountRule(ruleid)) {
+                return JsonResult.ok("关闭成功!");
+            } else {
+                return JsonResult.error("关闭失败!");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
     }
-  }
 
-  @GetMapping("/discountrule/devgrouptree")
-  @PreAuthorize("hasPermission('/discountrule/load4binddev','')")
-  @ResponseBody
-  public List<TreeSelectNode> searchDevgroupTree() {
-    List<TreeSelectNode> tree = deviceParamService.getDeviceGroupSelectTree();
-    return tree;
-  }
 
-  @PostMapping("/discountrule/dorulebinddev")
-  @PreAuthorize("hasPermission('/discountrule/dorulebinddev','')")
-  @ResponseBody
-  public JsonResult doBindRuleDevices(@RequestParam("ruleid") Integer ruleid,
-                                      @RequestParam("deviceid[]") List<Integer> deviceIds,
-                                      @AuthenticationPrincipal UserDetails operUser) {
-    try {
-      if (null == ruleid || StringUtil.isEmpty(deviceIds)) {
-        return JsonResult.error("参数传递错误");
-      }
-
-      TOperator oper = (TOperator) operUser;
-      if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
-        return JsonResult.error("登录过期,请重新登录");
-      }
-
-      if (deviceDiscountRuleService.saveRuleBindDevices(ruleid, deviceIds, oper)) {
-        return JsonResult.ok("绑定成功");
-      } else {
-        return JsonResult.error("绑定失败");
-      }
-    } catch (WebCheckException ex) {
-      return JsonResult.error(ex.getMessage());
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
+    @GetMapping("/discountrule/load4addrule")
+    @PreAuthorize("hasPermission('/discountrule/load4addrule','')")
+    public String load4addDiscountRule() {
+        return "restaurant/discountrule/ruleform";
     }
-  }
+
+    @GetMapping("/discountrule/checkrulename")
+    @PreAuthorize("hasPermission('/discountrule/load4addrule','')")
+    @ResponseBody
+    public JsonResult checkRulename(@RequestParam("rulename") String rulename,
+                                    @RequestParam(value = "ruleid", required = false) Integer ruleid) {
+        try {
+            if (StringUtil.isEmpty(rulename)) {
+                return JsonResult.error("餐补规则名称不能为空");
+            }
+            if (deviceDiscountRuleService.checkDiscountRulenameExist(rulename.trim(), ruleid)) {
+                return JsonResult.error("餐补规则名称已存在");
+            } else {
+                return JsonResult.ok("success");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @PostMapping("/discountrule/addrule")
+    @PreAuthorize("hasPermission('/discountrule/addrule','')")
+    @ResponseBody
+    public JsonResult editDiscountRule(@RequestParam("rulename") String rulename,
+                                       @RequestParam("ruletype") String ruletype,
+                                       @RequestParam("starttime") String starttime,
+                                       @RequestParam("endtime") String endtime,
+                                       @RequestParam("amount") String amount,
+                                       @RequestParam("limitcnt") Integer limitcnt,
+                                       @RequestParam(value = "file", required = false) MultipartFile file,
+                                       @AuthenticationPrincipal UserDetails operUser) {
+        try {
+            if (StringUtil.isEmpty(rulename)
+                    || (!RestaurantConstant.RULETYPE_QUOTA.equals(ruletype) && !RestaurantConstant.RULETYPE_REDUCTION.equals(ruletype) && !RestaurantConstant.RULETYPE_DISCOUNT.equals(ruletype))
+                    || !DateUtil.checkDatetimeValid(starttime, "HH:mm")
+                    || !DateUtil.checkDatetimeValid(endtime, "HH:mm")
+                    || !NumberUtil.isAmount(amount) || null == limitcnt) {
+                return JsonResult.error("参数传递错误");
+            } else if (DateUtil.compareDatetime(endtime, starttime, "HH:mm") <= 0) {
+                return JsonResult.error("时间范围错误,结束时间必须必起始时间大");
+            } else if (Double.valueOf(amount) < 0) {
+                return JsonResult.error("金额不能为负");
+            } else if (limitcnt < 1) {
+                return JsonResult.error("使用次数必须大于零");
+            } else if (null == file) {
+                return JsonResult.error("请选择餐补名单");
+            }
+
+            TOperator oper = (TOperator) operUser;
+            if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
+                return JsonResult.error("登录过期,请重新登录");
+            }
+
+            if (deviceDiscountRuleService.saveNewDiscountRule(rulename.trim(), ruletype, DateUtil.unParseToDateFormat(starttime), DateUtil.unParseToDateFormat(endtime), Double.parseDouble(amount), limitcnt, file, oper)) {
+                return JsonResult.ok("新增成功");
+            } else {
+                return JsonResult.error("新增失败");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.ok(599, ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+
+    @GetMapping("/discountrule/downloadexcel")
+    @PreAuthorize("hasPermission('/discountrule/load4addrule','')")
+    @ResponseBody
+    public void downloadDiscountRuleExcel(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            String[] title = {"市民卡号", "姓名"}; //表头
+            String[][] infos = {{"19045632", "张三"}}; // 示例内容
+            ExportExcel.queryexcel("导入名单模板", title, infos, request, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @GetMapping("/discountrule/load4detail")
+    public String load4DiscountRuleDetails(@RequestParam("ruleid") Integer ruleid, Model model) {
+        model.addAttribute("detailRuleid", ruleid);
+        return "restaurant/discountrule/ruledetail";
+    }
+
+    @GetMapping("/discountrule/load4detaillist")
+    @PreAuthorize("hasPermission('/discountrule/load4detail','')")
+    @ResponseBody
+    public PageResult<TDiscountDetail> searchDiscountRules(@RequestParam("page") Integer pageNo,
+                                                           @RequestParam("limit") Integer pageSize,
+                                                           @RequestParam("ruleid") Integer ruleid,
+                                                           @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;
+            return deviceDiscountRuleService.getDiscountRuleDetails(searchkey, ruleid, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    /**
+     * ====================================================
+     * 餐补规则审核
+     * ====================================================
+     */
+    @GetMapping("/discountrule/check")
+    public String checkDiscountRulesView() {
+        return "restaurant/discountrule/rulecheck";
+    }
+
+    @GetMapping("/discountrule/checklist")
+    @PreAuthorize("hasPermission('/discountrule/check','')")
+    @ResponseBody
+    public PageResult<DiscountRuleShowBean> searchCheckDiscountRules(@RequestParam("page") Integer pageNo,
+                                                                     @RequestParam("limit") Integer pageSize,
+                                                                     @RequestParam(value = "status", required = false) String status) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            return deviceDiscountRuleService.getCheckDiscountRuleInfos(status, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/discountrule/load4checkdetail")
+    @PreAuthorize("hasPermission('/discountrule/load4checkdetail','')")
+    public String load4DiscountRuleCheckDetails(@RequestParam("ruleid") Integer ruleid, Model model) {
+        model.addAttribute("checkDetailRuleid", ruleid);
+        return "restaurant/discountrule/checkdetail";
+    }
+
+    @GetMapping("/discountrule/load4checkdetaillist")
+    @PreAuthorize("hasPermission('/discountrule/load4checkdetail','')")
+    @ResponseBody
+    public PageResult<TDiscountDetail> searchDiscountRulesCheckDetails(@RequestParam("page") Integer pageNo,
+                                                                       @RequestParam("limit") Integer pageSize,
+                                                                       @RequestParam("ruleid") Integer ruleid,
+                                                                       @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;
+            return deviceDiscountRuleService.getDiscountRuleDetails(searchkey, ruleid, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @PostMapping("/discountrule/checkruledetail")
+    @PreAuthorize("hasPermission('/discountrule/checkruledetail','')")
+    @ResponseBody
+    public JsonResult editDiscountRule(@RequestParam("ruleid") Integer ruleid,
+                                       @RequestParam("checktype") String checktype,
+                                       @RequestParam("reason") String reason,
+                                       @AuthenticationPrincipal UserDetails operUser) {
+        try {
+            if (null == ruleid || (!"pass".equals(checktype) && !"reject".equals(checktype))) {
+                return JsonResult.error("参数传递错误");
+            } else if ("reject".equals(checktype) && StringUtil.isEmpty(reason)) {
+                return JsonResult.error("请填写驳回原因");
+            }
+
+            TOperator oper = (TOperator) operUser;
+            if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
+                return JsonResult.error("登录过期,请重新登录");
+            }
+
+            if (deviceDiscountRuleService.doCheckDiscountRule(ruleid, "pass".equals(checktype), reason, oper)) {
+                return JsonResult.ok("pass".equals(checktype) ? "审核通过" : "驳回成功");
+            } else {
+                return JsonResult.error("操作失败");
+            }
+
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+
+    }
+
+    /**
+     * ====================================================
+     * 餐补规则绑定设备
+     * ====================================================
+     */
+    @GetMapping("/discountrule/devbind")
+    public String bindDiscountRuleView() {
+        return "restaurant/discountrule/ruledevbind";
+    }
+
+    @GetMapping("/discountrule/devbindlist")
+    @PreAuthorize("hasPermission('/discountrule/devbind','')")
+    @ResponseBody
+    public PageResult<DiscountRuleBindShowBean> searchDiscountDevbindInfo(@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;
+            return deviceDiscountRuleService.getDiscountRuleDevBindInfo(searchkey, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @PostMapping("/discountrule/deletedevbind")
+    @PreAuthorize("hasPermission('/discountrule/deletedevbind','')")
+    @ResponseBody
+    public JsonResult deleteDiscountDevbind(@RequestParam("id") String id) {
+        try {
+            TDiscountDevbind bind = deviceDiscountRuleService.getDiscountDevbindById(id);
+            if (null == bind) {
+                return JsonResult.error("绑定关系不存在!");
+            }
+
+            if (deviceDiscountRuleService.deleteDiscountDevbind(bind)) {
+                return JsonResult.ok("删除成功");
+            } else {
+                return JsonResult.error("删除失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @GetMapping("/discountrule/load4binddev")
+    @PreAuthorize("hasPermission('/discountrule/load4binddev','')")
+    public String load4RuleBindDevice(Model model) {
+        model.addAttribute("rulelist", deviceDiscountRuleService.getNormalDiscountRules());
+        return "restaurant/discountrule/rulebind";
+    }
+
+    @GetMapping("/discountrule/devsearch")
+    @PreAuthorize("hasPermission('/discountrule/load4binddev','')")
+    @ResponseBody
+    public PageResult<DevparaBinddevShowBean> searchRuleBindDevices(@RequestParam(value = "devgroupid", required = false) Integer devgroupid,
+                                                                    @RequestParam(value = "searchkey", required = false) String searchkey,
+                                                                    @RequestParam(value = "ruleid", required = false) Integer ruleid) {
+        try {
+            if (null == ruleid && null == devgroupid && StringUtil.isEmpty(searchkey)) {
+                return new PageResult<>(99, "请填写条件查询设备");
+            } else if (null == ruleid) {
+                return new PageResult<>(99, "请选择餐补规则");
+            }
+
+            return deviceDiscountRuleService.searchRuleBindDevices(devgroupid, searchkey, ruleid);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/discountrule/devgrouptree")
+    @PreAuthorize("hasPermission('/discountrule/load4binddev','')")
+    @ResponseBody
+    public List<TreeSelectNode> searchDevgroupTree() {
+        List<TreeSelectNode> tree = deviceParamService.getDeviceGroupSelectTree();
+        return tree;
+    }
+
+    @PostMapping("/discountrule/dorulebinddev")
+    @PreAuthorize("hasPermission('/discountrule/dorulebinddev','')")
+    @ResponseBody
+    public JsonResult doBindRuleDevices(@RequestParam("ruleid") Integer ruleid,
+                                        @RequestParam("deviceid[]") List<Integer> deviceIds,
+                                        @AuthenticationPrincipal UserDetails operUser) {
+        try {
+            if (null == ruleid || StringUtil.isEmpty(deviceIds)) {
+                return JsonResult.error("参数传递错误");
+            }
+
+            TOperator oper = (TOperator) operUser;
+            if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
+                return JsonResult.error("登录过期,请重新登录");
+            }
+
+            if (deviceDiscountRuleService.saveRuleBindDevices(ruleid, deviceIds, oper)) {
+                return JsonResult.ok("绑定成功");
+            } else {
+                return JsonResult.error("绑定失败");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
 
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
index 1c39779..426c60e 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
@@ -10,6 +10,7 @@
 import com.supwisdom.dlpay.restaurant.service.DeviceService;
 import com.supwisdom.dlpay.framework.util.ExportExcel;import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
@@ -67,6 +68,7 @@
             searchBean.setDevicename(devicename);
             searchBean.setFactoryid(factoryid);
             searchBean.setPageSize(pageSize);
+            searchBean.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
             return deviceService.getDeviceByParam(searchBean);
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
new file mode 100644
index 0000000..7325df8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
@@ -0,0 +1,358 @@
+package com.supwisdom.dlpay.restaurant.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.exception.WebCheckException;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.restaurant.bean.WhitelistBindShowBean;
+import com.supwisdom.dlpay.restaurant.bean.DevparaBinddevShowBean;
+import com.supwisdom.dlpay.restaurant.domain.TWhitelist;
+import com.supwisdom.dlpay.restaurant.domain.TWhitelistDetail;
+import com.supwisdom.dlpay.restaurant.domain.TWhitelistDevbind;
+import com.supwisdom.dlpay.restaurant.service.WhitelistService;
+import com.supwisdom.dlpay.restaurant.service.DeviceParamService;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.service.ParamService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Controller
+public class WhitelistController {
+    @Autowired
+    private WhitelistService whitelistService;
+    @Autowired
+    private DeviceParamService deviceParamService;
+
+
+    @GetMapping("/whitelist/index")
+    public String whitelistView() {
+        return "restaurant/whitelist/whitelist";
+    }
+
+    @GetMapping("/whitelist/list")
+    @PreAuthorize("hasPermission('/whitelist/index','')")
+    @ResponseBody
+    public PageResult<TWhitelist> searchwhitelists(@RequestParam("page") Integer pageNo,
+                                                      @RequestParam("limit") Integer pageSize,
+                                                      @RequestParam(value = "listname", required = false) String listname) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            return whitelistService.getWhitelist(listname, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @PostMapping("/whitelist/deletelist")
+    @ResponseBody
+    public JsonResult deletewhitelist(@RequestParam("whitelistid") Integer whitelistid) {
+        try {
+            if (null == whitelistid) {
+                return JsonResult.error("参数传递错误");
+            }
+            if (whitelistService.deleteWhitelist(whitelistid)) {
+                return JsonResult.ok("删除成功!");
+            } else {
+                return JsonResult.error("删除失败!");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @GetMapping("/whitelist/load4addwhitelist")
+    public String load4addwhitelist() {
+        return "restaurant/whitelist/whitelistform";
+    }
+
+
+
+    @PostMapping("/whitelist/addwhitelist")
+    @PreAuthorize("hasPermission('/whitelist/addwhitelist','')")
+    @ResponseBody
+    public JsonResult editwhitelist(@RequestParam("listname") String listname,
+                                       @RequestParam(value = "file", required = false) MultipartFile file,
+                                       @AuthenticationPrincipal UserDetails operUser) {
+        try {
+            if (StringUtil.isEmpty(listname)){
+                return JsonResult.error("参数传递错误");
+            }
+            if (null == file) {
+                return JsonResult.error("请选择餐补名单");
+            }
+
+
+            TOperator oper = (TOperator) operUser;
+            if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
+                return JsonResult.error("登录过期,请重新登录");
+            }
+
+            if (whitelistService.saveWhitelist(listname.trim(),  file, oper)) {
+                return JsonResult.ok("新增成功");
+            } else {
+                return JsonResult.error("新增失败");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.ok(599, ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @GetMapping("/whitelist/load4detail")
+    public String load4whitelistDetails(@RequestParam("whitelistid") Integer whitelistid, Model model) {
+        model.addAttribute("whitelistDetailid", whitelistid);
+        return "restaurant/whitelist/whitelistdetail";
+    }
+
+    @GetMapping("/whitelist/load4detaillist")
+    @ResponseBody
+    public PageResult<TWhitelistDetail> searchwhitelists(@RequestParam("page") Integer pageNo,
+                                                            @RequestParam("limit") Integer pageSize,
+                                                            @RequestParam("whitelistid") Integer whitelistid,
+                                                            @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;
+            return whitelistService.getWhitelistDetails(searchkey, whitelistid, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+    @PostMapping("/whitelist/closelist")
+    @ResponseBody
+    public JsonResult closewhitelist(@RequestParam("whitelistid") Integer whitelistid) {
+        try {
+            if (null == whitelistid) {
+                return JsonResult.error("参数传递错误");
+            }
+            if (whitelistService.closeWhitelist(whitelistid)) {
+                return JsonResult.ok("关闭成功!");
+            } else {
+                return JsonResult.error("关闭失败!");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+
+
+
+    /**
+     * ====================================================
+     * 白名單审核
+     * ====================================================
+     */
+    @GetMapping("/whitelistcheck/index")
+    public String checkwhitelistView() {
+        return "restaurant/whitelist/whitelistcheck";
+    }
+
+    @GetMapping("/whitelistcheck/checklist")
+    @PreAuthorize("hasPermission('/whitelistcheck/checklist','')")
+    @ResponseBody
+    public PageResult<TWhitelist> searchCheckwhitelists(@RequestParam("page") Integer pageNo,
+                                                                     @RequestParam("limit") Integer pageSize,
+                                                                     @RequestParam(value = "status", required = false) String status) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            return whitelistService.getCheckWhitelist(status, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/whitelistcheck/load4checkdetail")
+    public String load4whitelistCheckDetails(@RequestParam("whitelistid") Integer whitelistid, Model model) {
+        model.addAttribute("checkDetailwhitelistid", whitelistid);
+        return "restaurant/whitelist/checkdetail";
+    }
+
+    @GetMapping("/whitelistcheck/load4checkdetaillist")
+    @PreAuthorize("hasPermission('/whitelistcheck/load4checkdetail','')")
+    @ResponseBody
+    public PageResult<TWhitelistDetail> searchwhitelistsCheckDetails(@RequestParam("page") Integer pageNo,
+                                                                       @RequestParam("limit") Integer pageSize,
+                                                                       @RequestParam("whitelistid") Integer whitelistid,
+                                                                       @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;
+            return whitelistService.getWhitelistDetails(searchkey, whitelistid, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @PostMapping("/whitelistcheck/checkdetail")
+    @ResponseBody
+    public JsonResult editwhitelist(@RequestParam("whitelistid") Integer whitelistid,
+                                       @RequestParam("checktype") String checktype,
+                                       @RequestParam("reason") String reason,
+                                       @AuthenticationPrincipal UserDetails operUser) {
+        try {
+            if (null == whitelistid || (!"pass".equals(checktype) && !"reject".equals(checktype))) {
+                return JsonResult.error("参数传递错误");
+            } else if ("reject".equals(checktype) && StringUtil.isEmpty(reason)) {
+                return JsonResult.error("请填写驳回原因");
+            }
+
+            TOperator oper = (TOperator) operUser;
+            if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
+                return JsonResult.error("登录过期,请重新登录");
+            }
+
+            if (whitelistService.doCheckWhitelist(whitelistid, "pass".equals(checktype), reason, oper)) {
+                return JsonResult.ok("pass".equals(checktype) ? "审核通过" : "驳回成功");
+            } else {
+                return JsonResult.error("操作失败");
+            }
+
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+
+    }
+
+
+    /**
+     * ====================================================
+     * 白名单绑定设备
+     * ====================================================
+     */
+    @GetMapping("/whitelistbind/devbind")
+    public String bindwhitelistbindView() {
+        return "restaurant/whitelist/devbind";
+    }
+
+    @GetMapping("/whitelistbind/devbindlist")
+    @PreAuthorize("hasPermission('/whitelistbind/devbind','')")
+    @ResponseBody
+    public PageResult<WhitelistBindShowBean> searchwhitelistDevbindInfo(@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;
+            return whitelistService.getWhitelistDevBindInfo(searchkey, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @PostMapping("/whitelistbind/deletedevbind")
+    @ResponseBody
+    public JsonResult deletewhitelistDevbind(@RequestParam("id") String id) {
+        try {
+            TWhitelistDevbind bind = whitelistService.getWhitelistDevbindById(id);
+            if (null == bind) {
+                return JsonResult.error("绑定关系不存在!");
+            }
+
+            if (whitelistService.deleteWhitelistDevbind(bind)) {
+                return JsonResult.ok("删除成功");
+            } else {
+                return JsonResult.error("删除失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @GetMapping("/whitelistbind/load4binddev")
+    public String load4RuleBindDevice(Model model) {
+        model.addAttribute("whitelists", whitelistService.getNormalWhitelists());
+        return "restaurant/whitelist/whitelistbind";
+    }
+
+    @GetMapping("/whitelistbind/devsearch")
+    @ResponseBody
+    public PageResult<DevparaBinddevShowBean> searchwhitelistBindDevices(@RequestParam(value = "devgroupid", required = false) Integer devgroupid,
+                                                                         @RequestParam(value = "searchkey", required = false) String searchkey,
+                                                                         @RequestParam(value = "whitelistid", required = false) Integer whitelistid) {
+        try {
+            if (null == whitelistid && null == devgroupid && StringUtil.isEmpty(searchkey)) {
+                return new PageResult<>(99, "请填写条件查询设备");
+            } else if (null == whitelistid) {
+                return new PageResult<>(99, "请选择白名单");
+            }
+
+            return whitelistService.searchWhitelistBindDevices(devgroupid, searchkey, whitelistid);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/whitelistbind/devgrouptree")
+    @ResponseBody
+    public List<TreeSelectNode> searchDevgroupTree() {
+        List<TreeSelectNode> tree = deviceParamService.getDeviceGroupSelectTree();
+        return tree;
+    }
+
+    @PostMapping("/whitelistbind/dobinddev")
+    @PreAuthorize("hasPermission('/whitelistbind/dobinddev','')")
+    @ResponseBody
+    public JsonResult doBindRuleDevices(@RequestParam("whitelistid") Integer whitelistid,
+                                        @RequestParam("deviceid[]") List<Integer> deviceIds,
+                                        @AuthenticationPrincipal UserDetails operUser) {
+        try {
+            if (null == whitelistid || StringUtil.isEmpty(deviceIds)) {
+                return JsonResult.error("参数传递错误");
+            }
+
+            TOperator oper = (TOperator) operUser;
+            if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
+                return JsonResult.error("登录过期,请重新登录");
+            }
+
+
+            if (whitelistService.saveWhitelistBindDevices(whitelistid, deviceIds, oper)) {
+                return JsonResult.ok("绑定成功");
+            } else {
+                return JsonResult.error("绑定失败");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDao.java
new file mode 100644
index 0000000..34b9c1e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDao.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.restaurant.dao;
+
+
+import com.supwisdom.dlpay.restaurant.domain.TWhitelist;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface WhitelistDao extends JpaRepository<TWhitelist, Integer> {
+
+
+    Page<TWhitelist> findAllByListnameContaining(String name, Pageable pageable);
+
+    @Query("select count(t.whitelistid) from TWhitelist t where t.listname=?1 ")
+    long checkListnameExists(String listname);
+
+    Page<TWhitelist> findAllByStatus(String status, Pageable pageable);
+
+    List<TWhitelist> findAllByStatus(String status);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDetailDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDetailDao.java
new file mode 100644
index 0000000..a710163
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDetailDao.java
@@ -0,0 +1,21 @@
+package com.supwisdom.dlpay.restaurant.dao;
+
+import com.supwisdom.dlpay.restaurant.domain.TWhitelistDetail;
+import com.supwisdom.dlpay.restaurant.domain.TDiscountDetail;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface WhitelistDetailDao extends JpaRepository<TWhitelistDetail, String>, JpaSpecificationExecutor<TDiscountDetail> {
+
+  @Modifying
+  @Query("delete from TWhitelistDetail where whitelistid=?1  ")
+  void deleteWhitelistDetailByWhitelistid(int Whitelistid);
+
+  @Modifying
+  @Query("update TWhitelistDetail t set t.status=?1 where t.whitelistid=?2 ")
+  void updateWhitelistDetailStatusByWhitelistid(String status, int Whitelistid);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDevbindDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDevbindDao.java
new file mode 100644
index 0000000..e695e5f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDevbindDao.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.restaurant.dao;
+
+import com.supwisdom.dlpay.restaurant.domain.TWhitelistDevbind;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface WhitelistDevbindDao extends JpaRepository<TWhitelistDevbind, String> {
+
+  @Query("select count(t.id) from TWhitelistDevbind t where t.whitelistid=?1 ")
+  long getBindcntByWhitelistid(int whitelistid);
+
+
+  @Modifying
+  @Query("delete from TWhitelistDevbind where whitelistid=?1  ")
+  void deleteBindByWhitelistid(int whitelistid);
+
+  @Query("from TWhitelistDevbind where id=?1")
+  TWhitelistDevbind getWhitelistDevbindById(String id);
+
+  @Query("from TWhitelistDevbind where deviceid=?1")
+  TWhitelistDevbind findByDeviceid(Integer deviceid);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDevice.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDevice.java
index 63d2ef4..ae2242e 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDevice.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDevice.java
@@ -20,7 +20,8 @@
     private Integer runstatus;
     private String lastlogintime;
     private String lastbeattime;
-
+    private String checkstatus;
+    private String checkername;
 
 
     @Id
@@ -158,6 +159,27 @@
     }
 
     public void setLastbeattime(String lastbeattime) {
+
         this.lastbeattime = lastbeattime;
     }
+
+    @Column(name = "checkstatus", length = 14)
+    public String getCheckstatus() {
+        return checkstatus;
+    }
+
+    public void setCheckstatus(String checkstatus) {
+
+        this.checkstatus = checkstatus;
+    }
+
+
+    @Column(name = "checkername", length = 20)
+    public String getCheckername() {
+        return checkername;
+    }
+
+    public void setCheckername(String checkername) {
+        this.checkername = checkername;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelist.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelist.java
new file mode 100644
index 0000000..01797fb
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelist.java
@@ -0,0 +1,102 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_whiteLIST")
+public class TWhitelist {
+  @Id
+  @SequenceGenerator(name = "whitelist_id", sequenceName = "SEQ_whiteLISTID", allocationSize = 1)
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "whitelist_id")
+  @Column(name="whitelistid", nullable = false, precision = 9)
+  private Integer whitelistid;
+
+  @Column(name = "listname", nullable = false, length = 200)
+  private String listname;
+
+
+  @Column(name = "STATUS", nullable = false, length = 10)
+  private String status;
+
+
+  @Column(name = "CREATE_OPERID", length = 32)
+  private String createOperid;
+
+  @Column(name = "CHECK_OPERID", length = 32)
+  private String checkOperid;
+
+  @Column(name = "CREATETIME", length = 14)
+  private String createtime;
+
+  @Column(name = "LASTSAVED", length = 14)
+  private String lastsaved;
+
+  @Column(name = "REMARK", length = 600)
+  private String remark;
+
+  public Integer getWhitelistid() {
+    return whitelistid;
+  }
+
+  public void setWhitelistid(Integer whitelistid) {
+    this.whitelistid = whitelistid;
+  }
+
+  public String getListname() {
+    return listname;
+  }
+
+  public void setListname(String listname) {
+    this.listname = listname;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getCreateOperid() {
+    return createOperid;
+  }
+
+  public void setCreateOperid(String createOperid) {
+    this.createOperid = createOperid;
+  }
+
+  public String getCheckOperid() {
+    return checkOperid;
+  }
+
+  public void setCheckOperid(String checkOperid) {
+    this.checkOperid = checkOperid;
+  }
+
+  public String getCreatetime() {
+    return createtime;
+  }
+
+  public void setCreatetime(String createtime) {
+    this.createtime = createtime;
+  }
+
+  public String getLastsaved() {
+    return lastsaved;
+  }
+
+  public void setLastsaved(String lastsaved) {
+    this.lastsaved = lastsaved;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDetail.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDetail.java
new file mode 100644
index 0000000..aba06a1
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDetail.java
@@ -0,0 +1,101 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_WHITELIST_DETAIL")
+public class TWhitelistDetail {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
+
+  @Column(name="CARDNO", length = 20)
+  private String cardno;
+
+  @Column(name="USERNAME", length = 60)
+  private String username;
+
+  @Column(name="USERID", length = 32)
+  private String userid;
+
+  @Column(name="STATUS", length = 32)
+  private String status;
+
+  @Column(name="CARDPHYID", length = 20)
+  private String cardphyid;
+
+  @Column(name="WHITELISTID", nullable = false, length = 10)
+  private Integer whitelistid;
+
+  @Column(name="LASTSAVED", length = 14)
+  private String lastsaved;
+
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getUserid() {
+    return userid;
+  }
+
+  public void setUserid(String userid) {
+    this.userid = userid;
+  }
+
+  public Integer getWhitelistid() {
+    return whitelistid;
+  }
+
+  public void setWhitelistid(Integer whitelistid) {
+    this.whitelistid = whitelistid;
+  }
+
+  public String getLastsaved() {
+    return lastsaved;
+  }
+
+  public void setLastsaved(String lastsaved) {
+    this.lastsaved = lastsaved;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getCardphyid() {
+    return cardphyid;
+  }
+
+  public void setCardphyid(String cardphyid) {
+    this.cardphyid = cardphyid;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDevbind.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDevbind.java
new file mode 100644
index 0000000..3cb6a54
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TWhitelistDevbind.java
@@ -0,0 +1,68 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_whiteLIST_DEVBIND",
+    indexes = {@Index(name = "whitelistid_devbind_uk", unique = true, columnList = "deviceid,whitelistid")})
+public class TWhitelistDevbind {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
+
+  @Column(name = "DEVICEID", nullable = false, precision = 9)
+  private Integer deviceid;
+
+  @Column(name = "WHITELISTID", nullable = false, precision = 9)
+  private Integer whitelistid;
+
+  @Column(name = "CREATE_OPERID", length = 32)
+  private String createOperid;
+
+  @Column(name = "CREATETIME", length = 14)
+  private String createtime;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public Integer getDeviceid() {
+    return deviceid;
+  }
+
+  public void setDeviceid(Integer deviceid) {
+    this.deviceid = deviceid;
+  }
+
+  public Integer getWhitelistid() {
+    return whitelistid;
+  }
+
+  public void setWhitelistid(Integer whitelistid) {
+    this.whitelistid = whitelistid;
+  }
+
+  public String getCreateOperid() {
+    return createOperid;
+  }
+
+  public void setCreateOperid(String createOperid) {
+    this.createOperid = createOperid;
+  }
+
+  public String getCreatetime() {
+    return createtime;
+  }
+
+  public void setCreatetime(String createtime) {
+    this.createtime = createtime;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
index a1197e1..25e1cab 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
@@ -2,10 +2,12 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.restaurant.bean.CustomerSaveBean;
 import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
 import com.supwisdom.dlpay.restaurant.bean.CustomerShowBean;
 import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
+import com.supwisdom.dlpay.restaurant.domain.TCard;
 import com.supwisdom.dlpay.restaurant.domain.TCustomer;
 import com.supwisdom.dlpay.restaurant.domain.TDevice;
 import org.springframework.transaction.annotation.Propagation;
@@ -15,6 +17,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
+import java.util.Optional;
 
 public interface CustomerService {
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
@@ -38,5 +41,6 @@
 
     JsonResult export( HttpServletRequest request, HttpServletResponse response);
 
+    TCustomer getCustomerByCardno(String cardno) ;
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
index 302f677..dd9bc16 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
@@ -5,6 +5,7 @@
 import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
 import com.supwisdom.dlpay.restaurant.domain.TDevice;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -16,6 +17,8 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TDevice> getDeviceByKey(DeviceSearchBean param);
 
+
+
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TDevice> getDeviceByDevicename(String devicename);
 
@@ -38,6 +41,10 @@
     JsonResult saveDevice(TDevice device);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    Boolean doCheckdevice(String status, List<Integer> deviceIds, UserDetails operUser ) throws WebCheckException;
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     JsonResult deleteGroup(Integer id);
 
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java
new file mode 100644
index 0000000..639b108
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java
@@ -0,0 +1,67 @@
+package com.supwisdom.dlpay.restaurant.service;
+
+import com.supwisdom.dlpay.exception.WebCheckException;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.restaurant.bean.CardverWhitelistBean;
+import com.supwisdom.dlpay.restaurant.bean.WhitelistBindShowBean;
+import com.supwisdom.dlpay.restaurant.bean.DevparaBinddevShowBean;
+import com.supwisdom.dlpay.restaurant.domain.TCardver;
+import com.supwisdom.dlpay.restaurant.domain.TWhitelist;
+import com.supwisdom.dlpay.restaurant.domain.TWhitelistDetail;
+import com.supwisdom.dlpay.restaurant.domain.TWhitelistDevbind;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+public interface WhitelistService {
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<TWhitelist> getWhitelist(String listname,  int pageNo, int pageSize);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean saveWhitelist(String listname,  MultipartFile file, TOperator oper) throws Exception;
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<TWhitelistDetail> getWhitelistDetails(String searchkey, int ruleid, int pageNo, int pageSize);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean closeWhitelist(int ruleid) throws WebCheckException;
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean deleteWhitelist(int whitelistid) throws WebCheckException;
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<TWhitelist> getCheckWhitelist(String status,  int pageNo, int pageSize);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean doCheckWhitelist(int whitelistid, boolean passflag, String reason, TOperator oper) throws Exception;
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<WhitelistBindShowBean> getWhitelistDevBindInfo(String searchkey, int pageNo, int pageSize);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    TWhitelistDevbind getWhitelistDevbindById(String id);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    TWhitelistDevbind getWhitelistDevbindByDeviceId(Integer id);
+
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean deleteWhitelistDevbind(TWhitelistDevbind bind);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<DevparaBinddevShowBean> searchWhitelistBindDevices(Integer devgroupid, String searchkey, int whitelistid);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean saveWhitelistBindDevices(int whitelistid, List<Integer> deviceIds, TOperator oper) throws WebCheckException;
+
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    List<TWhitelist> getNormalWhitelists();
+
+
+    @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 b5cd08d..ca3c217 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
@@ -282,4 +282,19 @@
         return list;
     }
 
+    public TCustomer getCustomerByCardno(String cardno) {
+        if (!StringUtil.isEmpty(cardno)) {
+            List<TCard> clst=cardDao.findAllByCardnoAndStatus(cardno,"normal");
+            if(clst.size()<=0){
+                return null;
+            }
+
+            Optional<TCustomer> list = customerDao.findById(clst.get(0).getCustid());
+            if (list.isPresent()) {
+                return list.get();
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
index 7e069e2..ae15d55 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
@@ -9,6 +9,7 @@
 import com.supwisdom.dlpay.restaurant.bean.*;
 import com.supwisdom.dlpay.restaurant.dao.*;
 import com.supwisdom.dlpay.restaurant.domain.*;
+import com.supwisdom.dlpay.restaurant.service.CustomerService;
 import com.supwisdom.dlpay.restaurant.service.DeviceDiscountRuleService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
 import org.apache.commons.lang3.StringUtils;
@@ -52,6 +53,9 @@
     @Autowired
     private CardDao cardDao;
 
+    @Autowired
+    private CustomerService customerService;
+
     @PersistenceContext
     private EntityManager entityManager;
 
@@ -150,16 +154,7 @@
         return false;
     }
 
-    private TCustomer getCustomerByCardno(String cardno) {
-        if (!StringUtil.isEmpty(cardno)) {
-            TCard clst=cardDao.findAllByCardnoAndStatus(cardno,"normal").get(0);
-            Optional<TCustomer> list = customerDao.findById(clst.getCustid());
-            if (list.isPresent()) {
-                return list.get();
-            }
-        }
-        return null;
-    }
+
 
     private boolean checkRuleTimeError(String starttime, String endtime, String cardno, String custid) {
         Query query = entityManager.createNativeQuery("select count(a.id) from tb_discount_detail a, tb_discount_rule b where a.ruleid=b.ruleid and (b.status='uncheck' or b.status='normal') " +
@@ -247,7 +242,7 @@
                 if (StringUtil.isEmpty(name)) {
                     msg += ",姓名为空";
                 }
-                TCustomer customer = getCustomerByCardno(cardno);
+                TCustomer customer = customerService.getCustomerByCardno(cardno);
                 if (!StringUtil.isEmpty(cardno)) {
                     if (null == customer) {
                         msg += ",市民卡用户不存在";
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
index 9a4685d..fe65a84 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.exception.WebCheckException;
+import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
 import com.supwisdom.dlpay.restaurant.dao.DeviceDao;
 import com.supwisdom.dlpay.restaurant.dao.DeviceGroupDao;
@@ -15,6 +16,7 @@
 import com.supwisdom.dlpay.framework.util.ImportExcelUtil;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
 import org.apache.commons.lang3.StringUtils;
 import org.hibernate.query.internal.NativeQueryImpl;
 import org.hibernate.transform.Transformers;
@@ -22,6 +24,7 @@
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
+import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.multipart.MultipartFile;
@@ -70,6 +73,9 @@
                     if (!StringUtil.isEmpty(param.getFactoryid())) {
                         list.add(cb.equal(root.get("factoryid").as(String.class), param.getFactoryid()));
                     }
+                    if (!StringUtil.isEmpty(param.getCheckstatus())) {
+                        list.add(cb.equal(root.get("checkstatus").as(String.class), param.getCheckstatus()));
+                    }
                     if (null!=param.getId()) {
                         list.add(cb.like(root.get("id").as(String.class), param.getId().toString()));
                     }
@@ -144,7 +150,8 @@
         String operid=OperUtil.getCurrentOperid();
         device.setOperid(operid);
         device.setDevicename(device.getDevphyid());
-
+        device.setLastsaved(DateUtil.getNow());
+        device.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
       /*  TDevice d = deviceDao.save(device);
         TShopDevice shopDevice = new TShopDevice();
         shopDevice.setDeviceid(d.getId());
@@ -156,6 +163,20 @@
     }
 
     @Override
+    public Boolean doCheckdevice(String status, List<Integer> deviceIds, UserDetails operUser) throws WebCheckException {
+        for(Integer id:deviceIds){
+            TDevice device = deviceDao.findTDeviceById(id);
+            if(null==device){
+                throw new WebCheckException(device.getDevicename()+"设备不存在");
+            }
+            device.setCheckstatus(status);
+            device.setOperid(operUser.getUsername());
+            deviceDao.save(device);
+        }
+        return true;
+    }
+
+    @Override
     public JsonResult updateDevice(TDevice device) {
         TDevice d = deviceDao.findTDeviceById(device.getId());
         d.setDevicename(device.getDevicename());
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
new file mode 100644
index 0000000..03c7ab7
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java
@@ -0,0 +1,418 @@
+package com.supwisdom.dlpay.restaurant.service.impl;
+
+import com.supwisdom.dlpay.exception.WebCheckException;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.ImportExcelUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.restaurant.bean.CardverWhitelistBean;
+import com.supwisdom.dlpay.restaurant.bean.WhitelistBindShowBean;
+import com.supwisdom.dlpay.restaurant.bean.DevparaBinddevShowBean;
+import com.supwisdom.dlpay.restaurant.dao.*;
+import com.supwisdom.dlpay.restaurant.domain.*;
+import com.supwisdom.dlpay.restaurant.service.WhitelistService;
+import com.supwisdom.dlpay.restaurant.service.CardService;
+import com.supwisdom.dlpay.restaurant.service.CustomerService;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+
+@Service
+public class WhitelistServiceImpl implements WhitelistService {
+
+    @Autowired
+    private WhitelistDao WhitelistDao;
+    @Autowired
+    private CardService cardService;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private CustomerService customerService;
+    @Autowired
+    private WhitelistDetailDao WhitelistDetailDao;
+    @Autowired
+    private WhitelistDevbindDao WhitelistDevbindDao;
+    @Autowired
+    private DeviceDao deviceDao;
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    @Override
+    public PageResult<TWhitelist> getWhitelist(String listname, int pageNo, int pageSize) {
+        Pageable pageable = PageRequest.of(pageNo - 1, pageSize
+                , Sort.by("Whitelistid"));
+        if (!StringUtil.isEmpty(listname)) {
+            return new PageResult<>(WhitelistDao.findAllByListnameContaining(listname, pageable));
+        }
+        return new PageResult<>(WhitelistDao.findAll(pageable));
+    }
+
+    @Override
+    public boolean saveWhitelist(String listname, MultipartFile file, TOperator oper) throws Exception {
+        TWhitelist list = new TWhitelist();
+        if (WhitelistDao.checkListnameExists(listname) > 0) {
+            throw new WebCheckException("白名单名称已经存在!");
+        }
+        list.setListname(listname);
+        list.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK);
+        list.setCreateOperid(oper.getOperid());
+        String systime = systemUtilService.getSysdatetime().getHostdatetime();
+        list.setCreatetime(systime);
+        list.setLastsaved(systime);
+        WhitelistDao.save(list);
+
+        String filename = file.getOriginalFilename();
+        if (!filename.endsWith(".xls") && !filename.endsWith(".xlsx")) {
+            throw new WebCheckException("文件格式错误,请选择excel文件");
+        }
+
+        List<Object[][]> excelData = null;
+        try {
+            if (filename.endsWith(".xls")) {
+                excelData = ImportExcelUtil.getIntegralData(file.getInputStream());//2003版本
+            } else {
+                excelData = ImportExcelUtil.getIntegralData07(file.getInputStream());//2007版本以上
+            }
+            if (null == excelData || excelData.size() < 1) {
+                throw new WebCheckException("excel文件解析错误");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new WebCheckException("模板格式错误,请重新下载模板");
+        }
+
+        int index_cardno = -1;
+        int index_name = -1;
+        Object[] titleRow = excelData.get(0)[0]; //sheet1表头
+        for (int i = 0; i < titleRow.length; i++) {
+            if ("市民卡号".equals(titleRow[i])) {
+                index_cardno = i;
+                continue;
+            } else if ("姓名".equals(titleRow[i])) {
+                index_name = i;
+                continue;
+            }
+        }
+        if (index_cardno == -1 || index_name == -1 || excelData.get(0).length < 2) {
+            throw new WebCheckException("名单模板表头不能修改,且必须包含数据!");
+        }
+
+        List<String> successCardnos = new ArrayList<>(0);
+        List<String> errmsgList = new ArrayList<>(0);
+
+        try {
+            for (int n = 1; n < excelData.get(0).length; n++) {
+                String msg = "";
+                Object[] row = excelData.get(0)[n];
+                String cardno = row[index_cardno] == null ? null : row[index_cardno].toString().trim();
+                String name = row[index_name] == null ? null : row[index_name].toString().trim();
+                if (StringUtil.isEmpty(cardno)) {
+                    msg += ",市民卡号为空";
+                }
+                if (StringUtil.isEmpty(name)) {
+                    msg += ",姓名为空";
+                }
+                TCustomer customer = customerService.getCustomerByCardno(cardno);
+                if (!StringUtil.isEmpty(cardno)) {
+                    if (null == customer) {
+                        msg += ",市民卡用户不存在";
+                    } else if (!customer.getCustname().equals(name)) {
+                        msg += ",市民卡号与姓名不匹配!";
+                    }
+                }
+                if (!StringUtil.isEmpty(cardno) && successCardnos.contains(cardno)) {
+                    msg += ",市民卡号重复!";
+                }
+
+                TCard card = cardService.getCardByCardno(cardno);
+
+                if (!StringUtil.isEmpty(msg)) {
+                    errmsgList.add("第" + (n + 1) + "行数据错误" + msg);
+                } else {
+                    TWhitelistDetail detail = new TWhitelistDetail();
+                    detail.setWhitelistid(list.getWhitelistid());
+                    detail.setCardno(cardno);
+                    detail.setUsername(name);
+                    detail.setUserid(customer.getCustid() + "");
+                    detail.setStatus("uncheck");
+                    detail.setCardphyid(card.getCardphyid());
+                    detail.setLastsaved(systime);
+                    WhitelistDetailDao.save(detail); //保存明细
+
+                    successCardnos.add(cardno);
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new WebCheckException("模板格式有误,请确保卡号为文本格式");
+        }
+
+        if (!StringUtil.isEmpty(errmsgList)) {
+            StringBuffer errmsg = new StringBuffer("导入失败,名单存在错误!");
+            for (int j = 0; j < errmsgList.size(); j++) {
+                errmsg.append("<br/>" + errmsgList.get(j));
+                if (j > 10) {
+                    errmsg.append("<br/>错误太多,请仔细核对名单后再上传!");
+                }
+            }
+            throw new WebCheckException(errmsg.toString());
+        }
+        return true;
+    }
+
+    @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 ");
+        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) ");
+        }
+        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);
+        if (!StringUtil.isEmpty(searchkey)) {
+            query.setParameter("str", "%" + searchkey.trim() + "%");
+            countQuery.setParameter("str", "%" + searchkey.trim() + "%");
+        }
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize); //分页显示
+        List<TWhitelistDetail> list = query.getResultList();
+        Long count = (Long) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+
+    @Override
+    public boolean closeWhitelist(int Whitelistid) throws WebCheckException {
+        Optional<TWhitelist> olist = WhitelistDao.findById(Whitelistid);
+        if (!olist.isPresent()) {
+            throw new WebCheckException("白名单不存在!");
+        }
+        TWhitelist list = olist.get();
+        if (RestaurantConstant.STATUS_DISCOUNTRULE_CLOSED.equals(list.getStatus())) {
+            throw new WebCheckException("白名单已经失效!");
+        } else if (!RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL.equals(list.getStatus())) {
+            throw new WebCheckException("白名单未审核通过,不能关闭");
+        }
+
+
+        list.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_CLOSED);
+        list.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+        WhitelistDao.save(list);
+        return true;
+    }
+
+
+    @Override
+    public boolean deleteWhitelist(int Whitelistid) throws WebCheckException {
+        Optional<TWhitelist> list = WhitelistDao.findById(Whitelistid);
+        if (!list.isPresent()) {
+            throw new WebCheckException("白名单不存在!");
+        }
+        TWhitelist tWhitelist = list.get();
+        if (!RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK.equals(tWhitelist.getStatus()) && !RestaurantConstant.STATUS_DISCOUNTRULE_REJECT.equals(tWhitelist.getStatus())) {
+            throw new WebCheckException("待审核或驳回的白名单才能删除!");
+        }
+
+        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"));
+        if (StringUtil.isEmpty(status)) {
+            return new PageResult<>(WhitelistDao.findAll());
+        }
+        return new PageResult<>(WhitelistDao.findAllByStatus(status, pageable));
+
+    }
+
+    @Override
+    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("白名单不存在!");
+        }
+        TWhitelist tWhitelist = list.get();
+        if (!RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK.equals(tWhitelist.getStatus()) && !RestaurantConstant.STATUS_DISCOUNTRULE_REJECT.equals(tWhitelist.getStatus())) {
+            throw new WebCheckException("白名单非审核状态!");
+        }
+
+        tWhitelist.setCheckOperid(oper.getOperid());
+        tWhitelist.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+        if (passflag) {
+            tWhitelist.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL);
+            tWhitelist.setRemark(null);
+        } else {
+            tWhitelist.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_REJECT);
+            tWhitelist.setRemark(reason);
+        }
+        WhitelistDao.save(tWhitelist);
+        WhitelistDetailDao.updateWhitelistDetailStatusByWhitelistid(tWhitelist.getStatus(), tWhitelist.getWhitelistid());
+        return true;
+    }
+
+
+    @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 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 ");
+        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) ");
+        }
+        querySql.append(" order by t.createtime desc ");
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
+        if (!StringUtil.isEmpty(searchkey)) {
+            query.setParameter("str", "%" + searchkey.trim() + "%");
+            countQuery.setParameter("str", "%" + searchkey.trim() + "%");
+        }
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(WhitelistBindShowBean.class));
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize); //分页显示
+        List<WhitelistBindShowBean> list = query.getResultList();
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+
+    @Override
+    public TWhitelistDevbind getWhitelistDevbindById(String id) {
+        if (!StringUtil.isEmpty(id)) {
+            return WhitelistDevbindDao.getWhitelistDevbindById(id.trim());
+        }
+        return null;
+    }
+
+    @Override
+    public TWhitelistDevbind getWhitelistDevbindByDeviceId(Integer id) {
+        if (null != id) {
+            return WhitelistDevbindDao.findByDeviceid(id);
+        }
+        return null;
+    }
+
+    @Override
+    public boolean deleteWhitelistDevbind(TWhitelistDevbind bind) {
+        if (null != bind) {
+            WhitelistDevbindDao.delete(bind);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    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 ( " +
+                    " SELECT * FROM tb_devicegroup WHERE devgroupid = :gid " +
+                    " union ALL " +
+                    " SELECT a.* FROM tb_devicegroup a, r WHERE a.pid = r.devgroupid ) " +
+                    " SELECT devgroupid FROM r ORDER BY devgroupid ");
+            chirdGroupQuery.setParameter("gid", devgroupid.intValue());
+            chirdGroupids = chirdGroupQuery.getResultList(); //递归查询所有的子节点
+        }
+
+        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 ");
+        if (!StringUtil.isEmpty(chirdGroupids)) {
+            sql.append(" and t.devgroupid in (" + StringUtils.join(chirdGroupids.toArray(), ",") + ") ");
+        }
+        if (!StringUtil.isEmpty(searchkey)) {
+            sql.append(" and (t.devicename like :str or t.devphyid like :str) ");
+        }
+        sql.append(" order by t.id ");
+        Query query = entityManager.createNativeQuery(sql.toString());
+        if (!StringUtil.isEmpty(searchkey)) {
+            query.setParameter("str", "%" + searchkey.trim() + "%");
+        }
+        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);
+        if (!olist.isPresent()) {
+            throw new WebCheckException("所选白名单不存在");
+        }
+        TWhitelist list = olist.get();
+        if (!RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL.equals(list.getStatus())) {
+            throw new WebCheckException("所选白名单状态异常");
+        }
+
+        for (Integer id : deviceIds) {
+            TDevice device = deviceDao.findTDeviceById(id);
+            if (null == device) {
+                throw new WebCheckException("终端编号为[" + id + "]的设备不存在");
+            } else if (1 != device.getState()) {
+                throw new WebCheckException("终端编号为[" + id + "]的设备状态异常");
+            }
+            TWhitelistDevbind obind = WhitelistDevbindDao.findByDeviceid(id);
+            if (null != obind) {
+                throw new WebCheckException("终端编号为[" + id + "]的设备已有绑定关系");
+            }
+
+            TWhitelistDevbind bind = new TWhitelistDevbind();
+            bind.setWhitelistid(list.getWhitelistid());
+            bind.setDeviceid(device.getId());
+            bind.setCreateOperid(oper == null ? null : oper.getOperid());
+            bind.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
+            WhitelistDevbindDao.save(bind);
+        }
+        return true;
+    }
+
+    @Override
+    public List<TWhitelist> getNormalWhitelists() {
+        List<TWhitelist> lists = WhitelistDao.findAllByStatus(RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL);
+        if (lists.size() > 0) {
+            return lists;
+        }
+        return new ArrayList<>(0);
+    }
+
+    @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 " +
+                "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.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/util/RestaurantConstant.java b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
index beb84bc..a28c797 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
@@ -8,7 +8,8 @@
 
   public static final String STATUS_CHECKSTATUS_UNCHECK = "uncheck"; //待审核
   public static final String STATUS_CHECKSTATUS_NORMAL = "normal";  //有效
-  public static final String STATUS_CHECKSTATUS_FAIL = "fail";  //有效
+  public static final String STATUS_CHECKSTATUS_FAIL = "fail";  //无效
+  public static final String STATUS_CHECKSTATUS_REJECT = "reject";   //驳回
 
   public static final String TRANSMODE_CARD = "card";  //卡消费
   public static final String TRANSMODE_CODE = "code";  //二维码消费
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 94e2492..e53e5c2 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -115,6 +115,14 @@
 INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (17, NULL, 1, NULL, 'layui-icon-util', '/param/apiclientpara', '应用参数配置', 3, 10);
 --INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (2, NULL, 1, NULL, '', '/custmeallist/index', '就餐名单管理', 3, 22);
 --INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (7, NULL, 1, NULL, '', '/custmealcheck/index', '就餐名单审核', 4, 22);
+INSERT INTO "tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (8, NULL, 1, NULL, '', '/devicecheck/index', '设备审核', 2, 14);
+INSERT INTO "tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (13, NULL, 1, NULL, '', '/whitelist/index', '就餐白名单维护', 1, 11);
+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_mealtype" (mealtype,endtime,lastsaved,mealname) VALUES ('dinner', '200000', '20190709102922', '晚餐');
@@ -129,163 +137,167 @@
 INSERT INTO "tb_paytype_config" (paytype,configid,config_name,config_value) VALUES ('yktpay', 'orderurl', NULL, 'http://172.28.201.101:9116/epayapi/services/thirdparty/common/pay');
 INSERT INTO "tb_paytype_config" (paytype,configid,config_name,config_value) VALUES ('yktpay', 'reverseurl', NULL, 'http://172.28.201.101:9116/epayapi/services/thirdparty/common/payreverse');
 
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b30009', 16, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b3000a', 17, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b3000b', 19, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b4000c', 20, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b4000d', 21, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b4000f', 6, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b40010', 7, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b50011', 8, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b50012', 9, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0b50013', 22, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0bd0015', 4, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0bd0016', 5, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0be0017', 10, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0be0018', 11, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0be0019', 12, NULL, '402890866be40f77016be4c848b9002f');
-
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0bf001a', 13, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0bf001b', 14, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0bf001c', 15, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0bf001e', 24, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c00021', 23, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c00022', 25, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c00023', 31, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c10024', 38, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c10025', 42, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c10026', 44, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c10027', 86, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c20029', 45, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c2002a', 46, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c2002b', 47, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0c3002c', 48, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0e3002d', 49, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0e3002f', 50, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0e30030', 52, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0e30031', 53, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c0e40033', 54, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1030034', 55, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1030035', 56, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1040036', 57, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1040038', 58, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1040039', 59, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c104003a', 60, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c105003b', 65, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c105003e', 61, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c105003f', 62, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1060040', 63, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1060041', 64, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1060042', 66, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1060043', 67, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1060044', 68, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1070047', 71, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1070048', 80, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1070049', 81, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c108004b', 70, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c108004c', 74, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c109004d', 75, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c109004e', 76, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c109004f', 77, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1090050', 78, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c1090052', 69, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10a0053', 82, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10a0054', 83, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10a0055', 84, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10a0058', 79, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10b0059', 85, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10b005a', 87, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10b005c', 88, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10b005d', 89, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10c005e', 90, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10c005f', 1, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10c0060', 2, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10c0061', 3, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('402890866bf9ea0d016bfde2c10c0062', 18, NULL, '402890866be40f77016be4c848b9002f');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('ff8080816aaf2ec3016aaf4edaac009f', 27, NULL, '2c9cab836a8af5d5016a8af6ece20000');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f56001d', 16, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f57001e', 17, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f57001f', 19, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f570020', 20, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f570021', 21, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f580023', 6, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f580024', 7, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f580025', 8, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f580026', 9, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f590027', 22, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f590029', 4, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f59002a', 5, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f59002b', 10, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f59002c', 11, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5a002d', 12, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5a002e', 13, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5b002f', 14, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5b0030', 15, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5b0032', 24, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5f0044', 23, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5f0045', 25, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5f0046', 31, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5f0047', 38, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f5f0048', 42, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f600049', 44, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f60004a', 86, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f60004c', 45, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f60004d', 46, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f60004e', 47, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f61004f', 48, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f610050', 49, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f610052', 50, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f610053', 52, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f610054', 53, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f620056', 55, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f620057', 54, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f620058', 57, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f630059', 56, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f63005b', 59, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f63005c', 58, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f64005d', 60, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f64005e', 65, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f660066', 61, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f660067', 62, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f660068', 63, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f670069', 64, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f68006a', 66, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f68006b', 67, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f68006c', 68, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f68006e', 27, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f69006f', 32, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f690070', 28, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f690071', 29, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f690072', 30, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6c007e', 71, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6c007f', 80, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6c0080', 81, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6d0082', 77, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6d0083', 78, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6d0084', 76, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6e0085', 74, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6e0086', 70, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6e0087', 75, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6f0089', 82, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f6f008a', 83, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f70008b', 69, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f70008c', 84, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f720095', 85, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f720096', 79, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f720097', 87, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f720099', 89, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f72009a', 90, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f73009b', 88, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-
-INSERT INTO "tb_permission" (id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb14005f', 33, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission" (id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150061', 39, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission" (id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150062', 34, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission" (id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150063', 40, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission" (id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150064', 37, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission" (id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150065', 36, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission" (id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150066', 35, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_permission" (id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbca060016cbca3a983006a', 27, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b30009', 16, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b3000a', 17, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b3000b', 19, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b4000c', 20, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b4000d', 21, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b4000f', 6, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b40010', 7, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b50011', 8, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b50012', 9, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0b50013', 22, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0bd0015', 4, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0bd0016', 5, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0be0017', 10, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0be0018', 11, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0be0019', 12, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0bf001a', 13, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0bf001b', 14, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0bf001c', 15, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0bf001e', 24, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c00021', 23, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c00022', 25, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c00023', 31, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c10024', 38, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c10025', 42, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c10026', 44, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c10027', 86, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c20029', 45, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c2002a', 46, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c2002b', 47, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0c3002c', 48, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0e3002d', 49, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0e3002f', 50, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0e30030', 52, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0e30031', 53, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c0e40033', 54, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1030034', 55, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1030035', 56, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1040036', 57, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1040038', 58, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1040039', 59, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c104003a', 60, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c105003b', 65, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c105003e', 61, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c105003f', 62, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1060040', 63, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1060041', 64, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1060042', 66, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1060043', 67, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1060044', 68, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1070047', 71, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1070048', 80, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1070049', 81, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c108004b', 70, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c108004c', 74, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c109004d', 75, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c109004e', 76, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c109004f', 77, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1090050', 78, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c1090052', 69, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10a0053', 82, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10a0054', 83, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10a0055', 84, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10a0058', 79, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10b0059', 85, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10b005a', 87, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10b005c', 88, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10b005d', 89, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10c005e', 90, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10c005f', 1, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10c0060', 2, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10c0061', 3, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('402890866bf9ea0d016bfde2c10c0062', 18, NULL, '402890866be40f77016be4c848b9002f');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('ff8080816aaf2ec3016aaf4edaac009f', 27, NULL, '2c9cab836a8af5d5016a8af6ece20000');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a330002', 16, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a330003', 17, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a340004', 19, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a340005', 20, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a340006', 21, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a340008', 6, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a350009', 7, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a35000a', 8, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a36000b', 9, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a36000c', 22, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a36000e', 4, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a37000f', 5, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a370010', 10, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a370011', 11, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a370012', 12, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a370013', 13, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a380014', 14, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a380015', 15, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a380017', 24, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a39001a', 23, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a39001b', 25, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a39001c', 31, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a39001d', 38, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a39001e', 42, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a39001f', 44, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a390020', 86, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3a0022', 45, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3a0023', 46, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3a0024', 47, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3a0025', 48, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3a0026', 49, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3b0028', 50, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3b0029', 52, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3b002a', 53, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3b002c', 54, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3b002d', 55, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3b002e', 56, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3c002f', 57, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3c0031', 58, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3c0032', 59, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3c0033', 60, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3c0034', 65, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3d0036', 1, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3d0037', 2, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3d003a', 91, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3e003c', 61, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3e003d', 62, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3e003e', 63, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3e003f', 64, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3e0040', 66, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3e0041', 67, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3f0042', 68, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a3f0045', 80, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a400046', 81, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a400047', 71, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a400049', 70, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a40004a', 74, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a41004b', 75, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a41004c', 76, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a41004d', 77, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a41004e', 78, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a410050', 82, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a410051', 83, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a420052', 84, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a420053', 69, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a420056', 79, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a420057', 85, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a420058', 87, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a43005a', 88, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a43005b', 89, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a43005c', 90, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a44005f', 28, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a440060', 29, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a440061', 30, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a450062', 32, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a460063', 33, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a460065', 34, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a460066', 35, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a460067', 36, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a460068', 37, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a470069', 39, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a47006a', 40, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a47006d', 51, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a47006e', 72, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a470070', 41, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ee5316d240e8e016d24101a480071', 43, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+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');
 
 
 
@@ -311,8 +323,8 @@
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (23, '', 15, '查询', '/device/index');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (25, '', 15, '添加页面', '/device/loadadd');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (31, '', 15, '添加', '/device/add');
-INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (26, '', 11, '修改', '/param/sysparaupdate');
-INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (27, '', 11, '查询', '/param/syspara');
+--INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (26, '', 11, '修改', '/param/sysparaupdate');
+--INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (27, '', 11, '查询', '/param/syspara');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (28, '', 12, '查询', '/param/businesspara');
 INSERT INTO "tb_resource"  (id,code,function_id,name,uri) VALUES (29, '', 12, '删除', '/param/deletebusinesspara');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (30, '', 12, '修改', '/param/businessparaupdate');
@@ -374,6 +386,17 @@
 --INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (92, '', 1, '添加', '/custtype/add');
 --INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (93, '', 1, '修改', '/custtype/update');
 --INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (94, '', 1, '删除', '/custtype/delete');
+INSERT INTO "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (1, '', 8, '查询', '/devicecheck/index');
+INSERT INTO "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (2, '', 8, '审核', '/devicecheck/docheckdevice');
+INSERT INTO  "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (3, '', 13, '查询', '/whitelist/index');
+INSERT INTO  "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (18, '', 13, '添加', '/whitelist/addwhitelist');
+INSERT INTO  "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (41, '', 18, '查询', '/whitelistcheck/checklist');
+INSERT INTO  "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (43, '', 18, '审核', '/whitelistcheck/load4checkdetail');
+INSERT INTO  "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (51, '', 31, '查询', '/whitelistbind/devbind');
+INSERT INTO  "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (72, '', 31, '绑定', '/whitelistbind/dobinddev');
+
+
+
 
 INSERT INTO "tb_role" (roleid,createtime,editflag,lastsaved,rolecode,roledesc,rolename) VALUES ('d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '20190101000000', 0, '', 'ROLE_ADMIN', '超级管理员', '超级管理员');
 INSERT INTO "tb_role" (roleid,createtime,editflag,lastsaved,rolecode,roledesc,rolename) VALUES ('2c9cab836a8af5d5016a8af6ece20000', '20190506102639', 1, '', 'ROLE_ADMIN', '系统管理员', '系统管理员');
@@ -413,6 +436,13 @@
 INSERT INTO "tb_role_function" (id,functionid,permissions,roleid) VALUES ('297e0a7e6bd65d7c016bd67401e10086', 28, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO "tb_role_function" (id,functionid,permissions,roleid) VALUES ('297e0a7e6bd65d7c016bd67401e10087', 29, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO "tb_role_function" (id,functionid,permissions,roleid) VALUES ('297e0a7e6bd65d7c016bd67401e2008b', 30, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function"("id", "functionid", "permissions", "roleid") VALUES ('297ee5316d2438ba016d243a95b400d6', 13, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function"("id", "functionid", "permissions", "roleid") VALUES ('297ee5316d2438ba016d243a95b500d9', 18, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_role_function"("id", "functionid", "permissions", "roleid") VALUES ('297ee5316d2438ba016d243a95b600dc', 31, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+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_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/device/index.html b/src/main/resources/templates/restaurant/device/index.html
index a63f279..ed3ff48 100644
--- a/src/main/resources/templates/restaurant/device/index.html
+++ b/src/main/resources/templates/restaurant/device/index.html
@@ -46,6 +46,27 @@
                     {field: 'factoryid', sort: true, width: 200, title: '设备厂商'},
                     {field: 'state', title: '状态', sort: true, width: 100, templet: '#device-dev-tpl-state'},
                     {
+                        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 if ('reject' == d.checkstatus) {
+                                return '<span class="layui-badge">驳回</span>';
+                            } else {
+                                return d.status;
+                            }
+                        }
+                    },
+
+                    {
                         field: 'id', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
                             return ' <a class="layui-btn  layui-btn-xs" lay-event="device-edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ';
                         }
diff --git a/src/main/resources/templates/restaurant/devicecheck/index.html b/src/main/resources/templates/restaurant/devicecheck/index.html
new file mode 100644
index 0000000..76ba2b0
--- /dev/null
+++ b/src/main/resources/templates/restaurant/devicecheck/index.html
@@ -0,0 +1,152 @@
+<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">
+            搜索:
+            <select id="search-devicecheck-check-status">
+                <option value=""> 选择设备审核状态</option>
+                <option value="uncheck" selected> 待审核</option>
+                <option value="normal"> 有效</option>
+                <option value="fail"> 无效</option>
+                <option value="reject"> 驳回</option>
+            </select>&emsp;
+            <button id="btn-search-devicecheck-check" class="layui-btn icon-btn" data-type="search"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+        </div>
+        <table class="layui-table" id="devicecheckTable" lay-filter="devicecheckTable-filter"></table>
+    </div>
+</div>
+
+
+<!-- 表格操作列 -->
+<script type="text/html" id="deviceCheckToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" lay-event="doChecked">审核通过</button>
+        <button class="layui-btn layui-btn-sm" lay-event="doReject">审核驳回</button>
+    </div>
+</script>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+
+        form.render("select");
+
+        table.render({
+            elem: '#devicecheckTable',
+            url: '[[@{/devicecheck/list}]]',
+            page: true,
+            toolbar:'#deviceCheckToolbar',
+            where:{
+                status:'uncheck'
+            },
+            cols: [
+                [
+                    {type:'checkbox'},
+                    {field: 'id', title: '终端编号', sort: true},
+                    {field: 'devphyid', sort: true, width: 200, title: '设备物理id'},
+                    {field: 'shopid', sort: true, width: 200, title: '商户id'},
+                    {field: 'factoryid', sort: true, width: 200, title: '设备厂商'},
+                    {field: 'state', title: '状态', sort: true, width: 100, templet: '#device-dev-tpl-state'},
+                    {
+                        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 if ('reject' == d.checkstatus) {
+                                return '<span class="layui-badge">驳回</span>';
+                            } else {
+                                return d.status;
+                            }
+                        }
+                    },
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-search-devicecheck-check').click(function () {
+            var state = $("#search-devicecheck-check-status").val();
+            table.reload('devicecheckTable', {where: {status: state}, page: {curr: 1}});
+        });
+
+        table.on('toolbar(devicecheckTable-filter)', function(obj){
+            var checkStatus = table.checkStatus(obj.config.id);
+            var data = checkStatus.data;
+            if(data.length<=0){
+                layer.msg("请选择需要审核的设备", {icon: 2});
+                return;
+            }
+            var status;
+            switch(obj.event){
+                case 'doChecked':
+                    status='normal';
+                    break;
+                case 'doReject':
+                    status='reject';
+                    break;
+            };
+            doDeviceCheck(data,status);
+        });
+        function doDeviceCheck(data,status){
+            layer.load(2);
+            var token = $("meta[name='_csrf_token']").attr("value");
+            var deviceids = [];
+            for (var i = 0; i < data.length; i++) {
+                deviceids.push(data[i].id);
+            }
+            console.log(status);
+            console.log(deviceids);
+           // debugger
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: '[[@{/devicecheck/docheckdevice}]]',
+                data: {
+                    "status": status,
+                    "datalist[]": deviceids,
+                    "_csrf": token
+                },
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        table.reload('devicecheckTable'); //刷新表格
+                        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 (err) {
+                    admin.errorBack(err);
+                }
+            });
+
+        }
+
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/whitelist/checkdetail.html b/src/main/resources/templates/restaurant/whitelist/checkdetail.html
new file mode 100644
index 0000000..368ec94
--- /dev/null
+++ b/src/main/resources/templates/restaurant/whitelist/checkdetail.html
@@ -0,0 +1,94 @@
+<div id="whitelist-checkdetail-form" lay-filter="whitelist-checkdetail-form-filter" class="layui-form model-form" style="padding: 10px 25px;">
+    <input type="hidden" name="whitelistid" id="search-form-whitelist-checkdetail-whitelistid" th:value="${checkDetailwhitelistid}" />
+    <div class="layui-form-item">
+        <label class="layui-form-label" style="color: red;">审核意见</label>
+        <div class="layui-input-block">
+            <input type="radio" name="checktype" id="form-whitelist-checkdetail-pass" lay-filter="whitelist-checkdetail-filter" value="pass" title="通过" checked/>
+            <input type="radio" name="checktype" id="form-whitelist-checkdetail-reject" lay-filter="whitelist-checkdetail-filter" value="reject" title="驳回"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item" id="form-whitelist-checkdetail-reason-div" style="display: none;">
+        <label class="layui-form-label">驳回原因</label>
+        <div class="layui-input-block">
+            <textarea name="reason" id="form-whitelist-checkdetail-reason" placeholder="请输入内容" class="layui-textarea"></textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <table class="layui-table" id="whitelistCheckdetailTable" lay-filter="whitelistCheckdetailTable-filter"></table>
+    </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="whitelist-checkdetail-form-submit" lay-submit>确认</button>
+    </div>
+</div>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'table'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var table = layui.table;
+
+        // 表单提交事件
+        form.render("radio");
+        form.on('radio(whitelist-checkdetail-filter)', function (data) {
+            if ('pass' == data.value) {
+                $("#form-whitelist-checkdetail-reason-div").hide();
+            } else {
+                $("#form-whitelist-checkdetail-reason").val('');
+                $("#form-whitelist-checkdetail-reason-div").show();
+            }
+        });
+
+        // 渲染表格
+        var renderDetailTable = function (obj) {
+            table.render({
+                elem: '#whitelistCheckdetailTable',
+                url: '[[@{whitelistcheck/load4checkdetaillist}]]',
+                where: obj,
+                page: true,
+                size: 'sm',
+                height: 384,
+                cols: [
+                    [
+                        {field: 'cardno', title: '市民卡号', align: 'center'},
+                        {field: 'username', title: '姓名', align: 'center'}
+                    ]
+                ]
+            });
+        }
+        renderDetailTable({whitelistid: $("#search-form-whitelist-checkdetail-whitelistid").val()});
+
+        form.on('submit(whitelist-checkdetail-form-submit)', function (data) {
+            var vdata = data.field;
+            console.log(vdata);
+            if ('reject' == vdata.checktype) {
+                if (undefined == vdata.reason || "" == vdata.reason || "" == $.trim(vdata.reason)) {
+                    layer.msg("请填写驳回原因", {icon: 2, time: 1500});
+                    return;
+                }
+            }
+            vdata["_csrf"] = $("meta[name='_csrf_token']").attr("value");
+            admin.go('[[@{/whitelistcheck/checkdetail}]]', vdata, 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});
+                }
+            }, function (err) {
+                admin.errorBack(err);
+            })
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/whitelist/devbind.html b/src/main/resources/templates/restaurant/whitelist/devbind.html
new file mode 100644
index 0000000..3d8e000
--- /dev/null
+++ b/src/main/resources/templates/restaurant/whitelist/devbind.html
@@ -0,0 +1,120 @@
+<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="search-whitelist-devbind-searchkey" class="layui-input search-input" maxlength="20" type="text" style="width: 300px;" placeholder="输入名称、设备名称或设备物理ID"/>&emsp;
+            <button id="btn-whitelist-devbind-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-whitelist-devbind-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
+        </div>
+        <table class="layui-table" id="whitelist-devbind-table" lay-filter="whitelist-devbind-table-filter"></table>
+    </div>
+</div>
+
+
+<!-- 表格操作列 -->
+<script type="text/html" id="whitelist-devbind-table-bar">
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+</script>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        // 渲染表格
+        table.render({
+            elem: '#whitelist-devbind-table',
+            url: '[[@{/whitelistbind/devbindlist}]]',
+            page: true,
+            cols: [
+                [
+                    {field: 'deviceid', title: '设备编号', align: 'center', fixed: 'left', sort: true},
+                    {field: 'devicename', title: '设备名称', align: 'center', fixed: 'left'},
+                    {field: 'devphyid', title: '设备物理ID', align: 'center'},
+                    {field: 'listname', title: '白名单名称', align: 'center', sort: true},
+                    {
+                        field: 'liststatus', title: '白名单状态', align: 'center', templet: function (d) {
+                            if ('uncheck' == d.liststatus) {
+                                return '<span class="layui-badge layui-bg-orange">待审核</span>'
+                            } else if ('normal' == d.liststatus) {
+                                return '<span class="layui-badge layui-bg-green">有效</span>';
+                            } else if ('closed' == d.liststatus) {
+                                return '<span class="layui-badge layui-bg-gray">无效</span>';
+                            } else if ('reject' == d.liststatus) {
+                                return '<span class="layui-badge">驳回</span>';
+                            } else {
+                                return d.liststatus;
+                            }
+                        }
+                    },
+                    {
+                        field: 'createtime', title: '绑定时间', align: 'center', templet: function (d) {
+                            return admin.formatDate(d.createtime);
+                        }
+                    },
+                    {align: 'center', title: '操作', width: 100, toolbar: '#whitelist-devbind-table-bar', fixed: 'right'}
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-whitelist-devbind-search').click(function () {
+            var searchkey = $("#search-whitelist-devbind-searchkey").val();
+            table.reload('whitelist-devbind-table', {where: {searchkey: searchkey}, page: {curr: 1}});
+        });
+
+        $('#btn-whitelist-devbind-add').click(function () {
+            admin.popupCenter({
+                title: "新增白名单绑定关系",
+                path: '[[@{/whitelistbind/load4binddev}]]',
+                area: '900px',
+                finish: function () {
+                    table.reload('whitelist-devbind-table');
+                }
+            });
+        });
+
+        //监听单元格
+        table.on('tool(whitelist-devbind-table-filter)', function (obj) {
+            var data = obj.data;
+
+            if('del' == obj.event){
+                layer.confirm('确定要删除设备绑定的白名单【'+data.listname+'】吗?', {
+                    btn: ['确定', '取消']
+                },function(){
+                    layer.closeAll('dialog');
+                    layer.load(2);
+                    admin.go('[[@{/whitelistbind/deletedevbind}]]', {
+                        id: data.id,
+                        _csrf: $("meta[name='_csrf_token']").attr("value")
+                    }, 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('whitelist-devbind-table');
+                    }, function (err) {
+                        admin.errorBack(err);
+                    });
+                });
+            }
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/whitelist/whitelist.html b/src/main/resources/templates/restaurant/whitelist/whitelist.html
new file mode 100644
index 0000000..1e07511
--- /dev/null
+++ b/src/main/resources/templates/restaurant/whitelist/whitelist.html
@@ -0,0 +1,156 @@
+<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="search-whitelist-listname" class="layui-input search-input" maxlength="20" type="text" placeholder="输入名称查询"/>&emsp;
+            <button id="btn-search-whitelist" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-whitelist-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
+        </div>
+        <table class="layui-table" id="whitelistTable" lay-filter="whitelistTable-filter"></table>
+    </div>
+</div>
+
+
+<!-- 表格操作列 -->
+<script type="text/html" id="whitelist-table-bar">
+    <a class="layui-btn layui-btn layui-btn-xs" lay-event="detail">查看名单</a>
+    {{# if(d.status=='uncheck' || d.status=='reject'){ }}
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+    {{# } else if(d.status=='normal'){ }}
+        <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="closed">关闭</a>
+    {{# } }}
+</script>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        var element = layui.element;
+
+        form.render("select");
+        // 渲染表格
+        table.render({
+            elem: '#whitelistTable',
+            url: '[[@{/whitelist/list}]]',
+            page: true,
+            cols: [
+                [
+                    {field: 'listname', title: '白名单名称', align: 'center', fixed: 'left' },
+                    {
+                        field: 'status', title: '状态', align: 'center', width: 120, sort: true, templet: function (d) {
+                            if ('uncheck' == d.status) {
+                                return '<span class="layui-badge layui-bg-orange">待审核</span>'
+                            } else if ('normal' == d.status) {
+                                return '<span class="layui-badge layui-bg-green">有效</span>';
+                            } else if ('closed' == d.status) {
+                                return '<span class="layui-badge layui-bg-gray">无效</span>';
+                            } else if ('reject' == d.status) {
+                                return '<span class="layui-badge">驳回</span>';
+                            } else {
+                                return d.status;
+                            }
+                        }
+                    },
+                    {field: 'remark', title: '备注',  align: 'center'},
+                    {align: 'center', title: '操作', width: 250, toolbar: '#whitelist-table-bar',  fixed: 'right'}
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-search-whitelist').click(function () {
+            var listname = $("#search-whitelist-listname").val();
+            table.reload('whitelistTable', {where: { listname: listname}, page: {curr: 1}});
+        });
+
+        $('#btn-whitelist-add').click(function () {
+            admin.popupCenter({
+                title: "新增就餐白名单",
+                path: '[[@{/whitelist/load4addwhitelist}]]',
+                area: '500px',
+                finish: function () {
+                    table.reload('whitelistTable');
+                }
+            });
+        });
+
+        //监听单元格
+        table.on('tool(whitelistTable-filter)', function (obj) {
+            var data = obj.data;
+            if('del' == obj.event){
+                layer.confirm('确定直接删除就餐白名单【'+data.listname+'】吗?', {
+                    btn: ['确定', '取消']
+                },function(){
+                    layer.load(2);
+                    admin.go('[[@{/whitelist/deletelist}]]', {
+                        whitelistid: data.whitelistid,
+                        _csrf: $("meta[name='_csrf_token']").attr("value")
+                    }, 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('whitelistTable');
+                    }, function (err) {
+                        admin.errorBack(err)
+                    });
+                });
+
+            }else if('closed' == obj.event){
+                layer.confirm('确定关闭就餐白名单【'+data.listname+'】吗?', {
+                    btn: ['确定', '取消']
+                },function(){
+                    layer.load(2);
+                    admin.go('[[@{/whitelist/closelist}]]', {
+                        whitelistid: data.whitelistid,
+                        _csrf: $("meta[name='_csrf_token']").attr("value")
+                    }, 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('whitelistTable');
+                    }, function (err) {
+                        admin.errorBack(err)
+                    });
+                });
+
+            }else if('detail' == obj.event){
+                admin.popupCenter({
+                    title: "查看名单",
+                    path: '[[@{/whitelist/load4detail}]]?whitelistid=' + data.whitelistid,
+                    area: '600px',
+                    finish: function () {
+                        table.reload('whitelistTable');
+                    }
+                });
+            }
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/whitelist/whitelistbind.html b/src/main/resources/templates/restaurant/whitelist/whitelistbind.html
new file mode 100644
index 0000000..54caad0
--- /dev/null
+++ b/src/main/resources/templates/restaurant/whitelist/whitelistbind.html
@@ -0,0 +1,178 @@
+<div id="whitelist-devbind-form" lay-filter="whitelist-devbind-filter" class="layui-form model-form"
+     style="padding: 30px 25px 10px 25px;">
+    <div class="layui-form-item">
+        <div class="layui-input-inline" style="width: 450px;">
+            <label class="layui-form-label">白名单</label>
+            <div class="layui-input-block">
+                <select lay-verify="required" class="layui-select" id="whitelist-devbind-form-select-whitelistid">
+                    <option th:each="rl:${whitelists}" th:value="${rl.whitelistid}"
+                            th:text="${rl.listname}"></option>
+                </select>&emsp;
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">选择设备</label>
+        <div class="layui-input-block" style="border: 1px solid #ddd;border-radius: 4px;padding: 10px;">
+            <div class="layui-card-body">
+                <div class="layui-form toolbar">
+                    <div class="layui-input-inline">
+                        <input id="search-whitelist-devbind-form-devgroupid" type="text"
+                               lay-filter="search-whitelist-devbind-form-devgroupid-filter" autocomplete="off"
+                               class="layui-input"/>
+                    </div>
+                    设备:
+                    <input id="search-whitelist-devbind-form-searchkey" type="text" class="layui-input search-input"
+                           maxlength="20" style="width: 200px;" placeholder="输入设备名称或设备物理ID"/>&emsp;
+                    <button id="btn-search-whitelist-devbind-form" class="layui-btn icon-btn"><i
+                            class="layui-icon">&#xe615;</i>搜索
+                    </button>
+                    <button id="btn-reset-whitelist-devbind-form" class="layui-btn layui-btn-primary"><i
+                            class="layui-icon"></i>清空
+                    </button>
+
+                    <table class="layui-table" id="whitelist-devbind-form-table"
+                           lay-filter="whitelist-devbind-form-table-filter"></table>
+                </div>
+            </div>
+        </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="whitelist-devbind-form-submit" lay-submit id="submitbtn">保存</button>
+    </div>
+</div>
+
+<style type="text/css" id="whitelist-devbind-form-css">
+    .layui-form-item .layui-form-checkbox[lay-skin=primary] {
+        margin-top: 0;
+    }
+</style>
+
+<script>
+    layui.use(['layer', 'table', 'admin', 'form', 'treeSelect'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var table = layui.table;
+        var treeSelect = layui.treeSelect;
+        var $ = layui.$
+
+        form.render("select");
+        treeSelect.render({
+            elem: '#search-whitelist-devbind-form-devgroupid',
+            data: '[[@{/whitelistbind/devgrouptree}]]',
+            type: 'get',
+            placeholder: '选择设备组',
+            search: false,
+            style: {
+                folder: {
+                    enable: false
+                },
+                line: {
+                    enable: true
+                }
+            },
+            // 点击回调
+            click: function (d) {
+                var treeNode = d.current;
+                console.log(treeNode);
+                return true;
+            },
+            success: function (d) {
+                console.log(d); // 加载完成后的回调函数
+            }
+        });
+
+        // 渲染表格
+        table.render({
+            elem: '#whitelist-devbind-form-table',
+            url: '[[@{/whitelistbind/devsearch}]]',
+            size: 'sm',
+            height: 350,
+            page: false,
+            cols: [
+                [
+                    {type: 'checkbox', style: "#whitelist-devbind-form-css", fixed: 'left'},
+                    {field: 'deviceid', title: '设备编号', align: 'center'},
+                    {field: 'devicename', title: '设备名称', align: 'center'},
+                    {field: 'devphyid', title: '设备物理ID', align: 'center'},
+                    {field: 'devgroupname', title: '设备组', align: 'center'}
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-search-whitelist-devbind-form').click(function () {
+            var whitelistid = $("#whitelist-devbind-form-select-whitelistid").val();
+            var devgroupid = $("#search-whitelist-devbind-form-devgroupid").val();
+            var searchkey = $("#search-whitelist-devbind-form-searchkey").val();
+            table.reload('whitelist-devbind-form-table', {
+                where: {
+                    devgroupid: devgroupid,
+                    searchkey: searchkey,
+                    whitelistid: whitelistid
+                }
+            });
+        });
+
+        $("#btn-reset-whitelist-devbind-form").click(function () {
+            $("#search-whitelist-devbind-form-devgroupid").val("");
+            $("#search-whitelist-devbind-form-searchkey").val("");
+            treeSelect.revokeNode('search-whitelist-devbind-form-devgroupid-filter');
+        });
+
+        form.on('submit(whitelist-devbind-form-submit)', function (el) {
+            var whitelistid = $("#whitelist-devbind-form-select-whitelistid").val();
+            var checkStatus = table.checkStatus('whitelist-devbind-form-table');
+            var data = checkStatus.data;
+            var deviceids = [];
+            if ("" == whitelistid) {
+                layer.msg("请选择白名单", {icon: 2, time: 1500});
+                return;
+            }
+            for (var i = 0; i < data.length; i++) {
+                deviceids.push(data[i].deviceid);
+            }
+            if (deviceids.length < 1) {
+                layer.msg("请选择设备", {icon: 2, time: 1500});
+                return;
+            }
+            debugger
+            console.log(whitelistid, deviceids);
+            layer.load(2);
+            var token = $("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: '[[@{/whitelistbind/dobinddev}]]',
+                data: {
+                    "whitelistid": whitelistid,
+                    "deviceid[]": deviceids,
+                    "_csrf": token
+                },
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        table.reload('whitelist-devbind-form-table'); //刷新表格
+                        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 (err) {
+                    admin.errorBack(err);
+                }
+            });
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/whitelist/whitelistcheck.html b/src/main/resources/templates/restaurant/whitelist/whitelistcheck.html
new file mode 100644
index 0000000..d0136ed
--- /dev/null
+++ b/src/main/resources/templates/restaurant/whitelist/whitelistcheck.html
@@ -0,0 +1,111 @@
+<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">
+            搜索:
+            <select id="search-whitelist-check-status">
+                <option value=""> 选择就餐白名单状态</option>
+                <option value="uncheck" selected> 待审核</option>
+                <option value="normal"> 有效</option>
+                <option value="closed"> 无效</option>
+                <option value="reject"> 驳回</option>
+            </select>&emsp;
+            <button id="btn-search-whitelist-check" class="layui-btn icon-btn" data-type="search"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+        </div>
+        <table class="layui-table" id="whitelistcheckTable" lay-filter="whitelistcheckTable-filter"></table>
+    </div>
+</div>
+
+
+<!-- 表格操作列 -->
+<script type="text/html" id="whitelist-check-table-bar">
+    {{# if(d.status =='uncheck'){ }}
+        <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="check">审核</a>
+    {{# } else { }}
+        <a class="layui-btn layui-btn-disabled layui-btn-xs">审核</a>
+    {{# } }}
+</script>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+
+        form.render("select");
+
+        var renderCheckRuleTable = function(obj){
+            table.render({
+                elem: '#whitelistcheckTable',
+                url: '[[@{/whitelistcheck/checklist}]]',
+                where: obj,
+                page: true,
+                cols: [
+                    [
+                        {field: 'listname', title: '餐白名單名称', align: 'center', fixed: 'left'},
+                        {
+                            field: 'status',
+                            title: '状态',
+                            align: 'center',
+                            width: 120,
+                            sort: true,
+                            templet: function (d) {
+                                if ('uncheck' == d.status) {
+                                    return '<span class="layui-badge layui-bg-orange">待审核</span>'
+                                } else if ('normal' == d.status) {
+                                    return '<span class="layui-badge layui-bg-green">有效</span>';
+                                } else if ('closed' == d.status) {
+                                    return '<span class="layui-badge layui-bg-gray">无效</span>';
+                                } else if ('reject' == d.status) {
+                                    return '<span class="layui-badge">驳回</span>';
+                                } else {
+                                    return d.status;
+                                }
+                            }
+                        },
+                        {
+                            align: 'center',
+                            title: '操作',
+                            width: 250,
+                            toolbar: '#whitelist-check-table-bar',
+                            fixed: 'right'
+                        }
+                    ]
+                ]
+            });
+        }
+        renderCheckRuleTable({status: "uncheck"});
+
+        // 搜索按钮点击事件
+        $('#btn-search-whitelist-check').click(function () {
+            var state = $("#search-whitelist-check-status").val();
+            table.reload('whitelistcheckTable', {where: {status: state}, page: {curr: 1}});
+        });
+
+        //监听单元格
+        table.on('tool(whitelistcheckTable-filter)', function (obj) {
+            var data = obj.data;
+
+            if('check' == obj.event){
+                admin.popupCenter({
+                    title: "查看名单",
+                    path: '[[@{/whitelistcheck/load4checkdetail}]]?whitelistid=' + data.whitelistid,
+                    area: '600px',
+                    finish: function () {
+                        table.reload('whitelistcheckTable', {where: {status: ""}, page: {curr: 1}});
+                    }
+                });
+
+            }
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/whitelist/whitelistdetail.html b/src/main/resources/templates/restaurant/whitelist/whitelistdetail.html
new file mode 100644
index 0000000..ad45b92
--- /dev/null
+++ b/src/main/resources/templates/restaurant/whitelist/whitelistdetail.html
@@ -0,0 +1,48 @@
+<div class="layui-card">
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索:
+            <input type="hidden" id="search-whitelist-detail-whitelistid" th:value="${whitelistDetailid}" />
+            <input id="search-whitelist-detail-searchkey" class="layui-input search-input" maxlength="20" type="text" style="width: 200px;"
+                   placeholder="输入市民卡号或姓名查询"/>&emsp;
+            <button id="btn-search-whitelist-detail" class="layui-btn icon-btn" data-type="search"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+        </div>
+        <table class="layui-table" id="whitelistDetailTable" lay-filter="whitelistDetailTable-filter"></table>
+    </div>
+</div>
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        var element = layui.element;
+
+        // 渲染表格
+        var renderDetailTable = function (obj) {
+            table.render({
+                elem: '#whitelistDetailTable',
+                url: '[[@{/whitelist/load4detaillist}]]',
+                where: obj,
+                page: true,
+                height: 472,
+                cols: [
+                    [
+                        {field: 'cardno', title: '市民卡号', align: 'center'},
+                        {field: 'username', title: '姓名', align: 'center'}
+                    ]
+                ]
+            });
+        }
+        renderDetailTable({whitelistid: $("#search-whitelist-detail-whitelistid").val()});
+
+        // 搜索按钮点击事件
+        $('#btn-search-whitelist-detail').click(function () {
+            var whitelistid = $("#search-whitelist-detail-whitelistid").val();
+            var searchkey = $("#search-whitelist-detail-searchkey").val();
+            table.reload('whitelistDetailTable', {where: {whitelistid: whitelistid, searchkey: searchkey}, page: {curr: 1}});
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/whitelist/whitelistform.html b/src/main/resources/templates/restaurant/whitelist/whitelistform.html
new file mode 100644
index 0000000..23e4133
--- /dev/null
+++ b/src/main/resources/templates/restaurant/whitelist/whitelistform.html
@@ -0,0 +1,136 @@
+<div id="whitelist-form" lay-filter="whitelist-form-filter" class="layui-form model-form" style="padding: 10px 25px;">
+
+    <div class="layui-form-item">
+        <label class="layui-form-label"><span style="color: red">* </span>白名单名称</label>
+        <div class="layui-input-block">
+           <input type="text" class="layui-input" name="listname" id="form-whitelist-listname" maxlength="20" style="width: 90%;"
+                  autocomplete="off" lay-verify="required|listname"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label"><span style="color: red">* </span>白名单对象</label>
+        <div class="layui-input-inline" style="width: auto;">
+            <button type="button" class="layui-btn upoadfile-btn"  >
+                <i class="layui-icon">&#xe67c;</i>上传名单
+                <input type="file" name="file" id="form-whitelist-records" style="width:auto;"/>
+            </button>
+        </div>
+        <div class="layui-input-inline" style="padding-top: 15px;">
+            <a th:href="@{/discountrule/downloadexcel}" style="color: blue;text-decoration: none;cursor: pointer;">下载名单模板</a>
+        </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="whitelist-form-submit" lay-submit id="submitbtn">保存</button>
+    </div>
+</div>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'laydate', 'upload'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var laydate = layui.laydate;
+        var upload = layui.upload;
+
+
+        // 表单提交事件
+        form.verify({
+            "listname": function (e) {
+                if(""==e|| ""==$.trim(e)){
+                    return "白名单名称不能为空";
+                }
+/*
+                var msg = "";
+                $.ajax({
+                    type: "GET",
+                    url: '[[@{/whitelist/checklistname}]]',
+                    async: false, //同步提交。不设置则默认异步,异步的话,最后执行ajax
+                    data: {
+                        listname: e,
+                        ruleid: $("#form-whitelist-ruleid").val()
+                    },
+                    success: function (result) {
+                        if (result.code != 200) {
+                            msg = result.msg;
+                        }
+                    },
+                    error: function (error) {
+                        msg = "请求服务器校验账号失败";
+                    }
+                });
+                if (msg != "") {
+                    return msg;
+                }*/
+            }
+        });
+
+        form.on('submit(whitelist-form-submit)', function (data) {
+            debugger
+            var token = $("meta[name='_csrf_token']").attr("value");
+            var vdata = data.field;
+
+            var formData = new FormData();
+            formData.append("listname", vdata.listname);
+
+            var flag = false;
+            var files = $('#form-whitelist-records').prop('files');
+            for (var i = 0; i < files.length; i++) {
+                var filename = files[i].name;
+                var suffix = filename.substr(filename.lastIndexOf("."));
+                if ('.xls' != suffix && '.xlsx' != suffix) {
+                    layer.msg("请选择excel文件", {icon: 2, time: 1500});
+                    return;
+                }
+                formData.append('file', files[i]);
+                flag = true;
+            }
+            if (!flag) {
+                layer.msg("请选择名单", {icon: 2, time: 1500});
+                return;
+            }
+            layer.load(2);
+            $.ajax({
+                type: "POST",
+                url: '[[@{/whitelist/addwhitelist}]]',
+                dataType: 'json',
+                processData:false,
+                contentType: false,
+                data: formData,
+                headers: {
+                    'Accept': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1, time: 1500});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('[[@{/login}]]');
+                        }, 1000);
+                        return;
+                    } else if(result.code == 599){
+                        //自定义错误
+                        layer.open({
+                            type: 0,
+                            title: "错误信息",
+                            icon: 2,
+                            area: ['600px', '400px'],
+                            content: result.msg
+                        });
+
+                    } else {
+                        layer.msg(result.msg, {icon: 2, time: 1500});
+                    }
+                },
+                error: function (err) {
+                    admin.errorBack(err);
+                }
+            });
+        });
+    });
+</script>
\ No newline at end of file