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 22db50d..f05e285 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
@@ -2,27 +2,27 @@
 
 import com.supwisdom.dlpay.api.bean.*;
 import com.supwisdom.dlpay.api.service.PosPayService;
+import com.supwisdom.dlpay.api.util.ErrorCode;
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TShopSettlement;
-import com.supwisdom.dlpay.framework.util.DateUtil;
-import com.supwisdom.dlpay.api.util.ErrorCode;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.MoneyUtil;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
 import com.supwisdom.dlpay.paysdk.proxy.ConsumePropxy;
 import com.supwisdom.dlpay.paysdk.proxy.TransactionProxy;
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
 import com.supwisdom.dlpay.restaurant.bean.DiscountBean;
 import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
 import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
-import com.supwisdom.dlpay.restaurant.dao.DevparaBindDao;
-import com.supwisdom.dlpay.restaurant.dao.DiscountDetailDao;
-import com.supwisdom.dlpay.restaurant.dao.DiscountRuleDao;
-import com.supwisdom.dlpay.restaurant.dao.MealTypeDao;
+import com.supwisdom.dlpay.restaurant.dao.*;
 import com.supwisdom.dlpay.restaurant.domain.*;
 import com.supwisdom.dlpay.restaurant.service.*;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -33,6 +33,9 @@
 
 @Service
 public class PosPayServiceImpl implements PosPayService {
+    private static final Logger logger = LoggerFactory.getLogger(PosPayServiceImpl.class);
+
+
     @Autowired
     private DeviceService deviceService;
     @Autowired
@@ -65,6 +68,14 @@
     private TransactionProxy transactionProxy;
     @Autowired
     private ConsumePropxy consumePropxy;
+    @Autowired
+    private UserProxy userProxy;
+    @Autowired
+    private CustomerDao customerDao;
+    @Autowired
+    private CardDao cardDao;
+    @Autowired
+    private CardverDao cardverDao;
 
 
     @Override
@@ -140,8 +151,10 @@
             resp.setRetmsg(apiResp.getRetmsg());
             return resp;
         }
+
         String cardno;
-        String cardphyid;
+        TCustomer customer;
+        TCard tCard;
 
         if (RestaurantConstant.TRANSMODE_CODE.equals(req.getTranstype())) {
             DoorQRCodeParam qrparam = new DoorQRCodeParam();
@@ -149,39 +162,118 @@
             DoorQrcodeResponse qrcoderesp = consumePropxy.qrcodequery(qrparam);
             if (qrcoderesp.getRetcode() == 0) {
                 cardno = qrcoderesp.getCitycardno();
-                cardphyid = qrcoderesp.getCardphyid();
             } else {
-                resp.setRetcode(qrcoderesp.getRetcode().toString());
-                resp.setRetmsg(qrcoderesp.getRetmsg());
+                resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
+                resp.setRetmsg("解析二维码失败");
                 return resp;
             }
         } else {
             cardno = req.getCardno();
-            cardphyid = req.getCardphyid();
         }
 
-        TCard tCard = cardService.getCardByCardno(cardno);
-        if (null == tCard) {
-            resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
-            resp.setRetmsg("卡号[" + req.getCardno() + "]不存在");
-            return resp;
-        }
-        if (!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getStatus())) {
+        TBusinesspara ignoreflag=businessparaDao.findByParakey("customer.ignore");
+        if(null!=(ignoreflag)&&"true".equalsIgnoreCase(ignoreflag.getParaval())){
+                tCard = cardService.getCardByCardno(cardno);
+                customer=customerService.getCustomerByCardno(cardno);
+                if(null==tCard||null==customer){
+                    logger.info("用户未在用户表中");
+                    QueryUserParam param=new QueryUserParam();
+                    param.setCitizencardno(cardno);
+                    UserInforResponse usrresp=userProxy.querybycardno(param);
+
+                    logger.info(usrresp.getRetcode()+"|||"+usrresp.getRetmsg());
+                    if(usrresp.getRetcode()==0){
+
+                        /*CustomerSaveBean customer=new CustomerSaveBean();
+                        customer.setCusttype(2);
+                        customer.setCardno(usrresp.getCardno());
+                        customer.setCardphyid(usrresp.getCardphyid());
+                        customer.setBankcardno(usrresp.getBankcardno());
+                        customer.setPhone(usrresp.getPhone());
+                        customer.setCustname(usrresp.getUsername());
+                        customer.setIdno(usrresp.getIdno());
+                        customer.setIdtype(usrresp.getIdtype());
+                        customer.setSavecardflag(0);
+                        customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                        customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
+                        customerService.saveCustomer(customer);*/
+                        customer=new TCustomer();
+                        customer.setCusttype(2);
+                        customer.setLastsaved(DateUtil.getNow("yyyyMMddHHmmss"));
+                        customer.setPhone(usrresp.getPhone());
+                        customer.setCustname(usrresp.getUsername());
+                        customer.setIdno(usrresp.getIdno());
+                        customer.setIdtype(usrresp.getIdtype());
+                        customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                        customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
+
+                        customer = customerDao.save(customer);
+                        if(null!=customer){
+                            String cardverno = systemUtilService.getCardverno();
+                            tCard=new TCard();
+                            tCard.setCardno(cardno);
+                            tCard.setOpendate(DateUtil.getNow("yyyyMMdd"));
+                            tCard.setCustid(customer.getCustid());
+                            tCard.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                            tCard.setTransstatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                            if(null!=usrresp.getCardphyid()){
+                                tCard.setCardphyid(usrresp.getCardphyid());
+                            }
+                            tCard.setCardverno(cardverno);
+                            tCard.setBankcardno(usrresp.getBankcardno());
+                            tCard.setExpiredate(usrresp.getExpiredate());
+                            tCard = cardDao.save(tCard);
+
+                            TCardver tCardver = new TCardver();
+                            tCardver.setAccdate(DateUtil.getNow("yyyyMMdd"));
+                            tCardver.setCardno(tCard.getCardno());
+                            tCardver.setCardphyid(tCard.getCardphyid());
+                            tCardver.setAdderflag(1);
+                            tCardver.setOptype(RestaurantConstant.OPTYPE_CARD_OPEN);
+                            tCardver.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                            tCardver.setCustid(tCard.getCustid());
+                            tCardver.setCreatetime(DateUtil.getNow("yyyyMMddHHmmss"));
+                            tCardver.setCardverno(cardverno);
+                            cardverDao.save(tCardver);
+                        }else{
+                            resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
+                            resp.setRetmsg("保存客户出错");
+                            return resp;
+                        }
+
+                    }else{
+                        resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
+                        resp.setRetmsg("卡号[" + cardno + "]未在核心平台查询到");
+                        return resp;
+                    }
+                }
+        }else{
+
+            tCard = cardService.getCardByCardno(cardno);
+            if (null == tCard) {
+                resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
+                resp.setRetmsg("卡号[" + cardno + "]不存在");
+                return resp;
+            }
+      /*  if (!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getStatus())) {
             resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
             resp.setRetmsg("卡号[" + req.getCardno() + "]已注销");
             return resp;
+        }*/
+            if (!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getTransstatus())) {
+                resp.setRetmsg("卡号[" + cardno + "]状态异常;");
+                resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
+                return resp;
+            }
+            customer = customerService.getCustomerByCustid(tCard.getCustid());
+            if (null == customer) {
+                resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+                resp.setRetmsg("卡对应客户不存在");
+                return resp;
+            }
+
         }
-        if (!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getTransstatus())) {
-            resp.setRetmsg("卡号[" + req.getCardno() + "]状态异常;");
-            resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
-            return resp;
-        }
-        TCustomer customer = customerService.getCustomerByCustid(tCard.getCustid());
-        if (null == customer) {
-            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
-            resp.setRetmsg("卡对应客户不存在");
-            return resp;
-        }
+
         Double managefee = 0.0;
 
         TTransDtl odtl = transDtlService.getPosTransdtl(tDevice.getId(), req.getTermseqno(), req.getTermdate());
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java
index 6c6691e..6602f8a 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java
@@ -9,7 +9,7 @@
 @Table(name = "TB_BUSINESSPARA")
 public class TBusinesspara {
   @Id
-  @Column(name="PARAKEY", nullable = false, length = 60)
+  @Column(name="PARAKEY", nullable = false, length = 200)
   private String parakey;
 
   @Column(name="PARAVAL", length = 1000)
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerListSearchBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerListSearchBean.java
new file mode 100644
index 0000000..eb7b167
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerListSearchBean.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+import com.supwisdom.dlpay.system.bean.PageBean;
+
+public class CustomerListSearchBean extends PageBean {
+    private String listname;
+    private String listid;
+
+    public String getListname() {
+        return listname;
+    }
+
+    public void setListname(String listname) {
+        this.listname = listname;
+    }
+
+    public String getListid() {
+        return listid;
+    }
+
+    public void setListid(String listid) {
+        this.listid = listid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerListSelectBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerListSelectBean.java
new file mode 100644
index 0000000..b71ad09
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerListSelectBean.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+public class CustomerListSelectBean {
+  private String listid;
+  private String listname;
+
+  public String getListid() {
+    return listid;
+  }
+
+  public void setListid(String listid) {
+    this.listid = listid;
+  }
+
+  public String getListname() {
+    return listname;
+  }
+
+  public void setListname(String listname) {
+    this.listname = listname;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSaveBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSaveBean.java
index 6d50341..d4d4f97 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSaveBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSaveBean.java
@@ -16,6 +16,7 @@
     private String cardno;
     private String cardphyid;
     private String bankcardno;
+    private String checkstatus;
     private Integer savecardflag;
 
     public String getCustid() {
@@ -131,6 +132,14 @@
         this.savecardflag = savecardflag;
     }
 
+    public String getCheckstatus() {
+        return checkstatus;
+    }
+
+    public void setCheckstatus(String checkstatus) {
+        this.checkstatus = checkstatus;
+    }
+
     @Override
     public String toString() {
         return "CustomerSaveBean{" +
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
index 8497b6f..42cc705 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
@@ -13,6 +13,7 @@
 import com.supwisdom.dlpay.restaurant.domain.TCustomer;
 import com.supwisdom.dlpay.restaurant.service.CustTypeService;
 import com.supwisdom.dlpay.restaurant.service.CustomerService;
+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;
@@ -88,6 +89,8 @@
     public JsonResult add(@RequestBody CustomerSaveBean customer) {
         if (customer != null) {
             customer.setSavecardflag(0);
+            customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+            customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
             return customerService.saveCustomer(customer);
         } else {
             return JsonResult.error("添加失败");
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerListController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerListController.java
new file mode 100644
index 0000000..74ae4b6
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerListController.java
@@ -0,0 +1,183 @@
+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.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.restaurant.bean.AreaSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerListSearchBean;
+import com.supwisdom.dlpay.restaurant.domain.TArea;
+import com.supwisdom.dlpay.restaurant.domain.TCustomerList;
+import com.supwisdom.dlpay.restaurant.service.CustomerListService;
+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.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/customerlist")
+public class CustomerListController {
+
+    @Autowired
+    private CustomerListService customerListService;
+
+    @RequestMapping("/index")
+    public String indexView(ModelMap model) {
+
+        return "restaurant/customerlist/index";
+    }
+
+    @RequestMapping("/list")
+    @PreAuthorize("hasPermission('/customerlist/index','')")
+    @ResponseBody
+    public PageResult<TCustomerList> getDataList(@RequestParam("page") Integer pageNo,
+                                                 @RequestParam("limit") Integer pageSize,
+                                                 @RequestParam(value = "searchkey", required = false) String searchKey) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            CustomerListSearchBean searchBean = new CustomerListSearchBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setListname(searchKey);
+            searchBean.setPageSize(pageSize);
+            return customerListService.getCustomerListByKey(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/checklistid")
+    @ResponseBody
+    public JsonResult checklistid(@RequestParam("listid") String listid) {
+        try {
+            if (StringUtil.isEmpty(listid)) {
+                return JsonResult.error("编号不能为空");
+            }
+            if (!customerListService.checkListidExist(listid.trim())) {
+                return JsonResult.error("名单名称已存在");
+            } else {
+                return JsonResult.ok("success");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @GetMapping("/loadadd")
+    public String loadadd(Model model) {
+        return "restaurant/customerlist/form";
+    }
+
+
+
+    @PostMapping("/addcustomerlist")
+    @ResponseBody
+    public JsonResult editwhitelist(@RequestParam("listid") String listid,
+                                    @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 (customerListService.saveCustomerlist(listid.trim(),listname.trim(),  file)) {
+                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);
+        }
+    }
+
+    @PostMapping("/deletelist")
+    @ResponseBody
+    public JsonResult delete(@RequestParam String  listid) {
+        try {
+            if (null == listid) {
+                return JsonResult.error("参数传递错误");
+            }
+            if (customerListService.deleteCustomerlist(listid)) {
+                return JsonResult.ok("删除成功！");
+            } else {
+                return JsonResult.error("删除失败！");
+            }
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @GetMapping("/load4detail")
+    public String load4ListDetails(@RequestParam("listid") Integer listid, Model model) {
+        model.addAttribute("listDetailid", listid);
+        return "restaurant/customerlist/listdetail";
+    }
+
+    @GetMapping("/load4detaillist")
+    @ResponseBody
+    public PageResult<TCustomerList> searchwhitelists(@RequestParam("page") Integer pageNo,
+                                                         @RequestParam("limit") Integer pageSize,
+                                                         @RequestParam("listid") String listid,
+                                                         @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 customerListService.getlistDetails(searchkey, listid, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+
+
+
+   /*
+
+    @PostMapping("/add")
+    @PreAuthorize("hasPermission('/area/add','')")
+    @ResponseBody
+    public JsonResult add(@RequestBody TArea area) {
+        System.out.println(area);
+        if (area != null) {
+            return areaService.saveArea(area);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+
+    @PostMapping("/delete")
+    @PreAuthorize("hasPermission('/area/delete','')")
+    @ResponseBody
+    public JsonResult delfunc(@RequestParam Integer id) {
+        return areaService.deleteArea(id);
+    }
+*/
+}
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 fca1b27..e62d925 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
@@ -4,11 +4,13 @@
 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.CustomerListSelectBean;
 import com.supwisdom.dlpay.restaurant.bean.DevparaBinddevShowBean;
 import com.supwisdom.dlpay.restaurant.bean.DiscountRuleBindShowBean;
 import com.supwisdom.dlpay.restaurant.bean.DiscountRuleShowBean;
 import com.supwisdom.dlpay.restaurant.domain.TDiscountDetail;
 import com.supwisdom.dlpay.restaurant.domain.TDiscountDevbind;
+import com.supwisdom.dlpay.restaurant.service.CustomerListService;
 import com.supwisdom.dlpay.restaurant.service.DeviceDiscountRuleService;
 import com.supwisdom.dlpay.restaurant.service.DeviceParamService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
@@ -32,6 +34,8 @@
     private DeviceDiscountRuleService deviceDiscountRuleService;
     @Autowired
     private DeviceParamService deviceParamService;
+    @Autowired
+    private CustomerListService customerListService;
 
     @GetMapping("/discountrule/index")
     public String DiscountRuleView() {
@@ -100,7 +104,9 @@
 
     @GetMapping("/discountrule/load4addrule")
     @PreAuthorize("hasPermission('/discountrule/load4addrule','')")
-    public String load4addDiscountRule() {
+    public String load4addDiscountRule(Model model) {
+        List<CustomerListSelectBean> bean = customerListService.getCustomerListSelectBean();
+        model.addAttribute("listbeans", bean);
         return "restaurant/discountrule/ruleform";
     }
 
@@ -133,7 +139,8 @@
                                        @RequestParam("endtime") String endtime,
                                        @RequestParam("amount") String amount,
                                        @RequestParam("limitcnt") Integer limitcnt,
-                                       @RequestParam(value = "file", required = false) MultipartFile file,
+                                       @RequestParam("listid") String listid,
+                                  //     @RequestParam(value = "file", required = false) MultipartFile file,
                                        @AuthenticationPrincipal UserDetails operUser) {
         try {
             if (StringUtil.isEmpty(rulename)
@@ -148,7 +155,7 @@
                 return JsonResult.error("金额不能为负");
             } else if (limitcnt < 1) {
                 return JsonResult.error("使用次数必须大于零");
-            } else if (null == file) {
+            } else if (StringUtil.isEmpty(listid) ) {
                 return JsonResult.error("请选择餐补名单");
             }
 
@@ -157,7 +164,7 @@
                 return JsonResult.error("登录过期，请重新登录");
             }
 
-            if (deviceDiscountRuleService.saveNewDiscountRule(rulename.trim(), ruletype, DateUtil.unParseToDateFormat(starttime), DateUtil.unParseToDateFormat(endtime), Double.parseDouble(amount), limitcnt, file, oper)) {
+            if (deviceDiscountRuleService.saveNewDiscountRule(rulename.trim(), ruletype, DateUtil.unParseToDateFormat(starttime), DateUtil.unParseToDateFormat(endtime), Double.parseDouble(amount), limitcnt, listid, oper)) {
                 return JsonResult.ok("新增成功");
             } else {
                 return JsonResult.error("新增失败");
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
index 4b618cb..4cc73c7 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
@@ -362,7 +362,7 @@
         try {
             String[] title = {"市民卡号", "姓名"}; //表头
             String[][] infos = {{"19045632", "张三"}}; // 示例内容
-            ExportExcel.queryexcel("白名单导入模板", title, infos, request, response);
+            ExportExcel.queryexcel("名单导入模板", title, infos, request, response);
         } catch (Exception e) {
             e.printStackTrace();
         }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/AreaDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/AreaDao.java
index b24da89..1bd0430 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/AreaDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/AreaDao.java
@@ -10,7 +10,6 @@
 @Repository
 public interface AreaDao extends JpaRepository<TArea, Integer> {
 
-
     Page<TArea> findAllByAreanameContaining(String name, Pageable pageable);
 
     TArea findByAreaname(String areaname);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
index 1f672d8..846bf24 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
@@ -25,6 +25,8 @@
 
     Integer countByCardno(String cardno);
 
+    TCard findByCardno(String cardno);
+
     Integer countByBankcardno(String bankcardno);
 
     List<TCard>  findAllByCardnoAndCardphyidAndStatus(String cardno,String cardphyid,String status);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerListDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerListDao.java
new file mode 100644
index 0000000..1e6b262
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerListDao.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.restaurant.dao;
+
+
+import com.supwisdom.dlpay.restaurant.bean.CustomerListSelectBean;
+import com.supwisdom.dlpay.restaurant.domain.TCustomerList;
+import com.supwisdom.dlpay.restaurant.domain.TCustomerListPk;
+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 CustomerListDao extends JpaRepository<TCustomerList, TCustomerListPk> {
+
+
+    @Query("select count(t.listid) from TCustomerList t where t.listid=?1 ")
+    long checkListidExists(String listid);
+
+    void deleteAllByListid(String listid);
+
+    List<TCustomerList> findAllByListid(String listid);
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
index 03686d8..6091237 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
@@ -2,6 +2,7 @@
 
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_CARD")
@@ -9,7 +10,7 @@
     private String cardno;
     private String custid;
     private String cardphyid;
-    private String  status;
+    private String status;
     private String transstatus;
     private String opendate;
     private String closedate;
@@ -17,9 +18,18 @@
     private String expiredate;
     private String bankcardno;
 
-
     @Id
-    @Column(name = "cardno", nullable = false, length =32)
+    @NotNull
+    @Column(name = "bankcardno" ,length = 20 ,unique = true)
+    public String getBankcardno() {
+        return bankcardno;
+    }
+
+    public void setBankcardno(String bankcardno) {
+        this.bankcardno = bankcardno;
+    }
+
+    @Column(name = "cardno",  length =32,unique = true)
     public String getCardno() {
         return cardno;
     }
@@ -98,12 +108,4 @@
         this.expiredate = expiredate;
     }
 
-    @Column(name = "bankcardno" ,length = 20)
-    public String getBankcardno() {
-        return bankcardno;
-    }
-
-    public void setBankcardno(String bankcardno) {
-        this.bankcardno = bankcardno;
-    }
-}
+  }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomerList.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomerList.java
new file mode 100644
index 0000000..807b813
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomerList.java
@@ -0,0 +1,65 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "TB_CUSTOMERLIST")
+@IdClass(TCustomerListPk.class)
+public class TCustomerList implements Serializable {
+    private String listid;
+    private String listname;
+    private String cardno;
+    private String custname;
+    private String lastsaved;
+
+    @Id
+    @Column(name = "listid", nullable = false, length = 12)
+    public String getListid() {
+        return listid;
+    }
+
+    public void setListid(String listid) {
+        this.listid = listid;
+    }
+
+    @Column(name = "listname", length = 50)
+    public String getListname() {
+        return listname;
+    }
+
+    public void setListname(String listname) {
+        this.listname = listname;
+    }
+
+    @Id
+    @Column(name = "cardno", length = 10)
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    @Column(name = "custname", length = 100)
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    @Column(name = "lastsaved", length = 14)
+    public String getLastsaved() {
+        return lastsaved;
+    }
+
+    public void setLastsaved(String lastsaved) {
+        this.lastsaved = lastsaved;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomerListPk.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomerListPk.java
new file mode 100644
index 0000000..861e0dc
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomerListPk.java
@@ -0,0 +1,39 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TCustomerListPk implements Serializable {
+  @Id
+  @Column(name = "listid", nullable = false, precision = 9)
+  private String listid;
+
+  @Id
+  @Column(name = "cardno", nullable = false, length = 10)
+  private String cardno;
+
+  public TCustomerListPk() {
+  }
+
+  public TCustomerListPk(String listid, String cardno) {
+    this.listid = listid;
+    this.cardno = cardno;
+  }
+
+  public String getListid() {
+    return listid;
+  }
+
+  public void setListid(String listid) {
+    this.listid = listid;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TMealsDtl.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TMealsDtl.java
new file mode 100644
index 0000000..85ea576
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TMealsDtl.java
@@ -0,0 +1,117 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_MEALSDTL",
+        indexes = {@Index(name = "mealsdtl_idx",
+                columnList = "checkdate,mealtype,deptcode,devgroupid,deviceid")})
+public class TMealsDtl {
+    private String id;
+    private String checkdate;
+    private String mealtype;
+    private String deptcode;
+    private String deviceid;
+    private Integer devgroupid;
+    private Double amount;
+    private Integer count;
+    private Double feeamount;
+    private Integer feecount;
+
+    @Id
+    @SequenceGenerator(name = "mealsdtl_id", sequenceName = "SEQ_MEALSDTL", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mealsdtl_id")
+    @NotNull
+    @Column(name = "id", unique = true,  length = 15)
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+    @NotNull
+    @Column(name = "checkdate",  length = 8)
+    public String getCheckdate() {
+        return checkdate;
+    }
+
+    public void setCheckdate(String checkdate) {
+        this.checkdate = checkdate;
+    }
+    @NotNull
+    @Column(name = "mealtype",  length = 10)
+    public String getMealtype() {
+        return mealtype;
+    }
+
+    public void setMealtype(String mealtype) {
+        this.mealtype = mealtype;
+    }
+    @NotNull
+    @Column(name = "deptcode",  length =9)
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+    @NotNull
+    @Column(name = "devgroupid",  length = 9)
+    public Integer getDevgroupid() {
+        return devgroupid;
+    }
+
+    public void setDevgroupid(Integer devgroupid) {
+        this.devgroupid = devgroupid;
+    }
+
+    @Column(name = "amount", precision = 15)
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    @Column(name = "count",length = 9)
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    @Column(name = "feeamount", precision = 15)
+    public Double getFeeamount() {
+        return feeamount;
+    }
+
+    public void setFeeamount(Double feeamount) {
+        this.feeamount = feeamount;
+    }
+
+
+    @Column(name = "feecount",length = 9)
+    public Integer getFeecount() {
+        return feecount;
+    }
+
+    public void setFeecount(Integer feecount) {
+        this.feecount = feecount;
+    }
+
+    @Column(name = "deviceid",length = 9)
+    public String getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(String deviceid) {
+        this.deviceid = deviceid;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerListService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerListService.java
new file mode 100644
index 0000000..cee081a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerListService.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.restaurant.service;
+
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.restaurant.bean.CustomerListSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerListSelectBean;
+import com.supwisdom.dlpay.restaurant.domain.TCustomerList;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+public interface CustomerListService {
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    PageResult<TCustomerList> getCustomerListByKey(CustomerListSearchBean param);
+
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    boolean checkListidExist(String listid);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean saveCustomerlist(String listid,String listname, MultipartFile file) throws Exception;
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    boolean deleteCustomerlist(String listid);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<TCustomerList> getlistDetails(String searchkey, String listid, int pageNo, int pageSize);
+
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    List<CustomerListSelectBean> getCustomerListSelectBean();
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    List<TCustomerList> getCustomerListByListid(String listid);
+
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceDiscountRuleService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceDiscountRuleService.java
index 7ddd9cc..bf3baef 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceDiscountRuleService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceDiscountRuleService.java
@@ -26,7 +26,7 @@
 
   @Transactional(rollbackFor = Exception.class)
   boolean saveNewDiscountRule(String rulename, String ruletype, String starttime,
-                                   String endtime, Double amount, Integer limitcnt, MultipartFile file, TOperator oper) throws Exception;
+                                   String endtime, Double amount, Integer limitcnt, String listid, TOperator oper) throws Exception;
 
   @Transactional(rollbackFor = Exception.class, readOnly = true)
   PageResult<TDiscountDetail> getDiscountRuleDetails(String searchkey, int ruleid, int pageNo, int pageSize);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CardServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CardServiceImpl.java
index 5e64630..76c57f2 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CardServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CardServiceImpl.java
@@ -49,10 +49,9 @@
 
     @Override
     public TCard getCardByCardno(String cardno) {
-        Optional<TCard> card=cardDao.findById(cardno);
-        if(card.isPresent()){
-            return card.get();
-
+        TCard card=cardDao.findByCardno(cardno);
+        if(null!=card){
+            return card;
         }
         return null;
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerListServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerListServiceImpl.java
new file mode 100644
index 0000000..7b2c77f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerListServiceImpl.java
@@ -0,0 +1,249 @@
+package com.supwisdom.dlpay.restaurant.service.impl;
+
+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.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.AreaSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerListSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerListSelectBean;
+import com.supwisdom.dlpay.restaurant.dao.AreaDao;
+import com.supwisdom.dlpay.restaurant.dao.CustomerListDao;
+import com.supwisdom.dlpay.restaurant.domain.TArea;
+import com.supwisdom.dlpay.restaurant.domain.TCard;
+import com.supwisdom.dlpay.restaurant.domain.TCustomer;
+import com.supwisdom.dlpay.restaurant.domain.TCustomerList;
+import com.supwisdom.dlpay.restaurant.service.AreaService;
+import com.supwisdom.dlpay.restaurant.service.CardService;
+import com.supwisdom.dlpay.restaurant.service.CustomerListService;
+import com.supwisdom.dlpay.restaurant.service.CustomerService;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+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 CustomerListServiceImpl implements CustomerListService {
+    @Autowired
+    private CustomerListDao customerListDao;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private CustomerService customerService;
+    @Autowired
+    private CardService cardService;
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    @Override
+    public PageResult<TCustomerList> getCustomerListByKey(CustomerListSearchBean param) {
+        StringBuffer querySql = new StringBuffer("select  t.listid,t.listname,t.lastsaved from " +
+                "Tb_CustomerList t where 1=1 ");
+        StringBuffer countSql = new StringBuffer("select count(*) as cnt from " +
+                "(select distinct listid from Tb_CustomerList t where 1=1 ");
+        if (!StringUtil.isEmpty(param.getListname())) {
+            querySql.append(" and  t.custname like :str ");
+            countSql.append(" and  t.custname like :str ");
+        }
+
+        querySql.append(" group by t.listid,t.listname,t.lastsaved order by t.listname ");
+        countSql.append(") b");
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
+        if (!StringUtil.isEmpty(param.getListname())) {
+            query.setParameter("str", "%" + param.getListname().trim() + "%");
+            countQuery.setParameter("str", "%" + param.getListname().trim() + "%");
+        }
+
+        query.setFirstResult((param.getPageNo() - 1) * param.getPageSize());
+        query.setMaxResults(param.getPageSize()); //分页显示
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(TCustomerList.class));
+        List<TCustomerList> list = query.getResultList();
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+
+    @Override
+    public boolean checkListidExist(String listid) {
+        long cnt=customerListDao.checkListidExists(listid);
+        if(cnt>0){
+            return false;
+        }
+       return true;
+    }
+
+    @Override
+    public boolean saveCustomerlist(String listid,String listname, MultipartFile file) throws Exception {
+
+
+        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("名单模板表头不能修改，且必须包含数据！");
+        }
+        String systime = systemUtilService.getSysdatetime().getHostdatetime();
+
+        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 {
+                    TCustomerList list=new TCustomerList();
+                    list.setListname(listname);
+                    list.setLastsaved(systime);
+                    list.setListid(listid);
+                    list.setCardno(card.getCardno());
+                    list.setCustname(customer.getCustname());
+                    customerListDao.save(list); //保存明细
+                    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 boolean deleteCustomerlist(String listid) {
+        customerListDao.deleteAllByListid(listid);
+        return true;
+    }
+
+    @Override
+    public PageResult<TCustomerList> getlistDetails(String searchkey, String listid, int pageNo, int pageSize) {
+        StringBuffer querySql = new StringBuffer("from TCustomerList t where t.listid=:listid ");
+        StringBuffer countSql = new StringBuffer("select count(t.listid) as cnt from TCustomerList t where t.listid=:listid ");
+        if (!StringUtil.isEmpty(searchkey)) {
+            querySql.append(" and (t.cardno like :str or t.custname like :str) ");
+            countSql.append(" and (t.cardno like :str or t.custname like :str) ");
+        }
+        querySql.append(" order by t.cardno ");
+        Query query = entityManager.createQuery(querySql.toString());
+        Query countQuery = entityManager.createQuery(countSql.toString());
+        query.setParameter("listid", listid);
+        countQuery.setParameter("listid", listid);
+        if (!StringUtil.isEmpty(searchkey)) {
+            query.setParameter("str", "%" + searchkey.trim() + "%");
+            countQuery.setParameter("str", "%" + searchkey.trim() + "%");
+        }
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize); //分页显示
+        List<TCustomerList> list = query.getResultList();
+        Long count = (Long) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+
+    @Override
+    public List<CustomerListSelectBean> getCustomerListSelectBean() {
+        StringBuffer querySql = new StringBuffer("select t.listname,t.listid from tb_customerlist t group by t.listname,t.listid ");
+
+        Query query = entityManager.createNativeQuery(querySql.toString());
+
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CustomerListSelectBean.class));
+        List<CustomerListSelectBean> list = query.getResultList();
+
+        if (!StringUtil.isEmpty(list)) {
+          return list;
+
+        }
+
+        return new ArrayList<>();
+    }
+
+    @Override
+    public List<TCustomerList> getCustomerListByListid(String listid) {
+        List<TCustomerList> list=customerListDao.findAllByListid(listid);
+        if(list.size()>0){
+            return list;
+        }
+        return new ArrayList<>();
+    }
+
+
+}
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 05ebb8b..413c222 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
@@ -106,8 +106,8 @@
         cus.setIdno(customer.getIdno());
         cus.setIdtype(customer.getIdtype());
         cus.setBatchno(customer.getBatchno());
-        cus.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
-        cus.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
+        cus.setStatus(customer.getStatus());
+        cus.setCheckstatus(customer.getCheckstatus());
         cus = customerDao.save(cus);
         if (null != cus) {
             if(0==customer.getSavecardflag()){
@@ -128,7 +128,9 @@
                 card.setCustid(cus.getCustid());
                 card.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
                 card.setTransstatus(RestaurantConstant.STATUS_CARD_NORMAL);
-                //       card.setCardphyid(customer.getCardphyid());
+                if(null!=customer.getCardphyid()){
+                    card.setCardphyid(customer.getCardphyid());
+                }
                 card.setCardverno(cardverno);
                 card.setBankcardno(customer.getBankcardno());
                 card.setExpiredate("");
@@ -223,12 +225,13 @@
                     }
                     if(cardDao.countByCardno((String) data[i][1]) > 0){
                         d.setSavecardflag(1);
-                        msg = msg + "第" + i+1 + "行，卡号已存在，请手动添加市名卡号和银行卡号。<br/>";
+                        msg = msg + "第" + i + "行，卡号已存在，请手动添加市名卡号和银行卡号。<br/>";
                     }else{
                         d.setSavecardflag(0);
                     }
                     d.setBatchno(batchno);
-
+                    d.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                    d.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
                     saveCustomer(d);
                     successCnt += 1;
                 }
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 96f7b99..39a7177 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.CustomerListService;
 import com.supwisdom.dlpay.restaurant.service.CustomerService;
 import com.supwisdom.dlpay.restaurant.service.DeviceDiscountRuleService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
@@ -52,6 +53,9 @@
     private DeviceDao deviceDao;
     @Autowired
     private CardDao cardDao;
+    @Autowired
+    private CustomerListService customerListService;
+
 
     @Autowired
     private CustomerService customerService;
@@ -155,7 +159,6 @@
     }
 
 
-
     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') " +
                 "and a.cardno=:cardno and ((:starttime between b.starttime and b.endtime) or (:endtime between b.starttime and b.endtime) or (b.starttime>:starttime and b.endtime<:endtime)) ");
@@ -171,7 +174,7 @@
 
     @Override
     public boolean saveNewDiscountRule(String rulename, String ruletype, String starttime,
-                                       String endtime, Double amount, Integer limitcnt, MultipartFile file, TOperator oper) throws Exception {
+                                       String endtime, Double amount, Integer limitcnt, String listid, TOperator oper) throws Exception {
         TDiscountRule rule = new TDiscountRule();
         if (discountRuleDao.checkRulenameExists(rulename) > 0) {
             throw new WebCheckException("餐补名称已经存在！");
@@ -191,7 +194,7 @@
         rule.setVerno(1);
         rule = discountRuleDao.save(rule);
 
-        String filename = file.getOriginalFilename();
+        /*String filename = file.getOriginalFilename();
         if (!filename.endsWith(".xls") && !filename.endsWith(".xlsx")) {
             throw new WebCheckException("文件格式错误,请选择excel文件");
         }
@@ -208,9 +211,14 @@
         } catch (Exception e) {
             e.printStackTrace();
             throw new WebCheckException("模板格式错误，请重新下载模板");
+        }*/
+
+        List<TCustomerList> clist = customerListService.getCustomerListByListid(listid);
+
+        if (clist.size() < 1) {
+            throw new WebCheckException("人员名单未查询到");
         }
-
-
+/*
         int index_cardno = -1;
         int index_name = -1;
         Object[] titleRow = excelData.get(0)[0]; //sheet1表头
@@ -225,57 +233,51 @@
         }
         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 += "，市民卡号重复！";
-                } else if (null != customer && checkRuleTimeError(starttime, endtime, cardno, customer.getCustid())) {
-                    msg += "，市民卡号[" + cardno + "]存在规则时间段冲突！";
-                }
-
-
-                if (!StringUtil.isEmpty(msg)) {
-                    errmsgList.add("第" + (n + 1) + "行数据错误" + msg);
-                } else {
-                    TDiscountDetail detail = new TDiscountDetail();
-                    detail.setRuleid(rule.getRuleid());
-                    detail.setCardno(cardno);
-                    detail.setUsername(name);
-                    detail.setUserid(customer.getCustid() + "");
-                    detail.setStatus("uncheck");
-                    detail.setLastsaved(systime);
-                    discountDetailDao.save(detail); //保存明细
-
-                    successCardnos.add(cardno);
+        for (int i = 0; i < clist.size(); i++) {
+            String msg = "";
+            TCustomerList list = clist.get(i);
+            //     Object[] row = excelData.get(0)[n];
+            String cardno = list.getCardno();
+            String name = list.getCustname();
+            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 += "，市民卡号重复！";
+            } else if (null != customer && checkRuleTimeError(starttime, endtime, cardno, customer.getCustid())) {
+                msg += "，市民卡号[" + cardno + "]存在规则时间段冲突！";
+            }
 
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new WebCheckException("模板格式有误，请确保卡号为文本格式");
+
+            if (!StringUtil.isEmpty(msg)) {
+                errmsgList.add("用户" + list.getCustname() + "数据错误" + msg);
+            } else {
+                TDiscountDetail detail = new TDiscountDetail();
+                detail.setRuleid(rule.getRuleid());
+                detail.setCardno(cardno);
+                detail.setUsername(name);
+                detail.setUserid(customer.getCustid() + "");
+                detail.setStatus("uncheck");
+                detail.setLastsaved(systime);
+                discountDetailDao.save(detail); //保存明细
+                successCardnos.add(cardno);
+            }
         }
 
         if (!StringUtil.isEmpty(errmsgList)) {
@@ -397,7 +399,7 @@
     }
 
     @Override
-    public DiscountBean getCustomerDiscount(Integer deviceid, String termtime,String custid) {
+    public DiscountBean getCustomerDiscount(Integer deviceid, String termtime, String custid) {
         StringBuffer sql = new StringBuffer("select d.limitcnt,d.ruletype,d.amount,d.ruleid from  tb_discount_rule d " +
                 "left join tb_discount_devbind t on t.ruleid=d.ruleid " +
                 "left join tb_discount_detail c on t.ruleid=c.ruleid " +
@@ -410,7 +412,7 @@
         query.setParameter("custid", custid);
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(DiscountBean.class));
         List<DiscountBean> list = query.getResultList();
-        if(list.size()>0){
+        if (list.size() > 0) {
             return list.get(0);
         }
         return null;
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 8c00c84..90a9ab5 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -121,7 +121,8 @@
 INSERT INTO "tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (18, NULL, 1, NULL, '', '/whitelistcheck/index', '就餐白名单审核', 2, 11);
 INSERT INTO "tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (31, NULL, 1, NULL, '', '/whitelistbind/devbind', '就餐白名单设备绑定', 3, 11);
 INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (11, NULL, 0, NULL, 'layui-icon-util', '#', '就餐白名单管理', 7, -1);
-INSERT INTO  tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (32, NULL, 1, NULL, '', '/shopsettlement/index', '商户管理', 2, 10);
+INSERT INTO  "tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (32, NULL, 1, NULL, '', '/shopsettlement/index', '商户管理', 2, 10);
+INSERT INTO  "tb_function"("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid") VALUES (34, NULL, 1, NULL, '', '/customerlist/index', '餐补人员名单管理', 1, 24);
 
 
 
@@ -303,6 +304,7 @@
 INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ea57c6e26421b016e264517d40044', 93, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ea57c6e26421b016e264517d40045', 73, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ea57c6e26421b016e264517d40046', 92, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO  "tb_permission"("id", "resid", "role_func_id", "roleid") VALUES ('297ea57c6e86d617016e86daac05004a', 94, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
 
 
@@ -400,9 +402,10 @@
 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_resource"("id", "code", "function_id", "name", "uri") VALUES (73, '''', 32, ''查询'', ''/shopsettlement/index'');
-INSERT INTO "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (92, '''', 32, ''添加'', ''/shopsettlement/loadadd'');
-INSERT INTO "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (93, '''', 32, ''删除'', ''/shopsettlement/delete'');
+INSERT INTO "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (73, '', 32, '查询', '/shopsettlement/index');
+INSERT INTO "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (92, '', 32, '添加', '/shopsettlement/loadadd');
+INSERT INTO "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (93, '', 32, '删除', '/shopsettlement/delete');
+INSERT INTO "tb_resource"("id", "code", "function_id", "name", "uri") VALUES (94, '', 34, '查询', '/customerlist/index');
 
 
 
@@ -450,6 +453,7 @@
 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_role_function"("id", "functionid", "permissions", "roleid") VALUES ('297ea57c6e86d617016e86daac040049', 34, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
 INSERT INTO "tb_role_function"("id", "functionid", "permissions", "roleid") VALUES ('297ea57c6e26421b016e264517d30043', 32, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
@@ -490,6 +494,7 @@
 insert into "tb_businesspara" (parakey,paraval) values('upgrade_version','posa711dali-1.');
 INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('payapi.appid', '200001');
 INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('payapi.secret', 'dc1d26c0d43e442588092c8d45c21bce');
+INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('customer.ignore', 'false');
 
 
 CREATE SEQUENCE SEQ_REFNO
diff --git a/src/main/resources/templates/restaurant/customerlist/form.html b/src/main/resources/templates/restaurant/customerlist/form.html
new file mode 100644
index 0000000..4ede5ea
--- /dev/null
+++ b/src/main/resources/templates/restaurant/customerlist/form.html
@@ -0,0 +1,149 @@
+<div id="customerlist-form" lay-filter="customerlist-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="listid" id="form-customerlist-listid" maxlength="10" style="width: 90%;"
+                   autocomplete="off" lay-verify="required|listid"/>
+        </div>
+    </div>
+
+    <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-customerlist-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-customerlist-records" style="width:auto;"/>
+            </button>
+        </div>
+        <div class="layui-input-inline" style="padding-top: 15px;">
+            <a th:href="@{/whitelist/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="customerlist-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 "名单名称不能为空";
+                }
+            },
+            "listid": function (e) {
+                if(""==e|| ""==$.trim(e)){
+                    return "名单编号不能为空";
+                }
+
+                var msg = "";
+                $.ajax({
+                    type: "GET",
+                    url: '[[@{/customerlist/checklistid}]]',
+                    async: false, //同步提交。不设置则默认异步，异步的话，最后执行ajax
+                    data: {
+                        listid: $("#form-customerlist-listid").val()
+                    },
+                    success: function (result) {
+                        if (result.code != 200) {
+                            msg = result.msg;
+                        }
+                    },
+                    error: function (error) {
+                        msg = "请求服务器校验账号失败";
+                    }
+                });
+                if (msg != "") {
+                    return msg;
+                }
+            }
+        });
+
+        form.on('submit(customerlist-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);
+            formData.append("listid",vdata.listid);
+
+            var flag = false;
+            var files = $('#form-customerlist-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: '[[@{/customerlist/addcustomerlist}]]',
+                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
diff --git a/src/main/resources/templates/restaurant/customerlist/index.html b/src/main/resources/templates/restaurant/customerlist/index.html
new file mode 100644
index 0000000..fb29192
--- /dev/null
+++ b/src/main/resources/templates/restaurant/customerlist/index.html
@@ -0,0 +1,139 @@
+<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="customerlist-search-value" class="layui-input search-input" type="text" placeholder="输入名单名称"/>&emsp;
+            <button id="customerlist-btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="customerlist-btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>新建人员名单</button>
+        </div>
+        <table class="layui-table" id="customerlist-table" lay-filter="customerlist-table"></table>
+    </div>
+</div>
+
+<script>
+
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
+
+        form.render('select');
+
+        // 渲染表格
+        table.render({
+            elem: '#customerlist-table',
+            url: '[[@{/customerlist/list}]]',
+            page: true,
+            minWidth: 80,
+            cols: [
+                [
+                    {field: 'listid', sort: true,  title: '名单编号'},
+                    {field: 'listname', sort: true,  title: '名单名称'},
+                    {field: 'lastsaved', sort: true,  title: '保存时间'},
+                    {
+                        field: 'listid', align: 'center',title: '操作', fixed: 'right', templet: function (item) {
+                            return ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>查看名单</a> '+
+                                ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                        }
+                    }
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#customerlist-btn-search').click(function () {
+            let key = $('#customerlist-search-value').val().trim();
+            table.reload('customerlist-table', {where: {searchkey: key}, page: {curr: 1}});
+        });
+        $('#customerlist-btn-add').click(function () {
+            showModel();
+        });
+     /*   $('#customerlist-btn-import').click(function () {
+            showDownload();
+        });
+        let showDownload = function () {
+            let title ='导入';
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/customerlist/loadimport}]]',
+                finish: function () {
+                    table.reload('customerlist-table', {});
+                }
+            });
+        };*/
+        let showModel = function (data) {
+            let title =  '新建人员列表';
+            admin.putTempData('t_cuslist', data);
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/customerlist/loadadd}]]',
+                area: '500px',
+                finish: function () {
+                    table.reload('customerlist-table');
+                }
+            });
+        };
+
+        let showList= function(data){
+            admin.popupCenter({
+                title: "查看名单",
+                path: '[[@{/customerlist/load4detail}]]?listid=' + data.listid,
+                area: '600px',
+                finish: function () {
+                    table.reload('customerlist-table');
+                }
+            });
+        }
+
+
+        // 工具条点击事件
+        table.on('tool(customerlist-table)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            console.log(data);
+            if (layEvent === 'edit') {
+                showList(data);
+            } else if (layEvent === 'del') {
+                showDelete(data);
+            }
+        });
+        let showDelete = function (data) {
+            layer.confirm('确定要删除该名单吗？', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('[[@{/customerlist/deletelist}]]', {
+                    listid: data.listid,
+                    _csrf: token
+                }, function (data) {
+                    console.log(data.code);
+                    layer.closeAll('loading');
+                    if (data.code == 200) {
+                        layer.msg(data.msg, {icon: 1});
+                    } else if (data.code == 401) {
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        layer.msg(data.msg, {icon: 2});
+                    }
+                    table.reload('customerlist-table', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    layer.msg('请求失败了，请稍后再试', {icon: 2});
+                });
+            });
+        };
+
+    });
+</script>
diff --git a/src/main/resources/templates/restaurant/customerlist/listdetail.html b/src/main/resources/templates/restaurant/customerlist/listdetail.html
new file mode 100644
index 0000000..5b70f34
--- /dev/null
+++ b/src/main/resources/templates/restaurant/customerlist/listdetail.html
@@ -0,0 +1,48 @@
+<div class="layui-card">
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索：
+            <input type="hidden" id="search-list-detail-listid" th:value="${listDetailid}" />
+            <input id="search-list-detail-searchkey" class="layui-input search-input" maxlength="20" type="text" style="width: 200px;"
+                   placeholder="输入市民卡号或姓名查询"/>&emsp;
+            <button id="btn-search-list-detail" class="layui-btn icon-btn" data-type="search"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+        </div>
+        <table class="layui-table" id="listDetailTable" lay-filter="listDetailTable-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: '#listDetailTable',
+                url: '[[@{/customerlist/load4detaillist}]]',
+                where: obj,
+                page: true,
+                height: 472,
+                cols: [
+                    [
+                        {field: 'cardno', title: '市民卡号', align: 'center'},
+                        {field: 'custname', title: '姓名', align: 'center'}
+                    ]
+                ]
+            });
+        }
+        renderDetailTable({listid: $("#search-list-detail-listid").val()});
+
+        // 搜索按钮点击事件
+        $('#btn-search-list-detail').click(function () {
+            var listid = $("#search-list-detail-listid").val();
+            var searchkey = $("#search-list-detail-searchkey").val();
+            table.reload('listDetailTable', {where: {listid: listid, searchkey: searchkey}, page: {curr: 1}});
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/discountrule/ruleform.html b/src/main/resources/templates/restaurant/discountrule/ruleform.html
index 6abfe9c..0eed2ad 100644
--- a/src/main/resources/templates/restaurant/discountrule/ruleform.html
+++ b/src/main/resources/templates/restaurant/discountrule/ruleform.html
@@ -48,7 +48,13 @@
 
     <div class="layui-form-item">
         <label class="layui-form-label"><span style="color: red">* </span>餐补对象</label>
-        <div class="layui-input-inline" style="width: auto;">
+        <div class="layui-input-block">
+            <select lay-verify="required" name="listid" class="layui-select" id="discountrule-form-select-listid">
+                <option th:each="lst:${listbeans}" th:value="${lst.listid}"
+                        th:text="${lst.listname}"></option>
+            </select>&emsp;
+        </div>
+        <!--<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-discountrule-records" style="width:auto;"/>
@@ -56,7 +62,7 @@
         </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>
 
     <div class="layui-form-item model-form-footer">
@@ -75,6 +81,7 @@
 
         var discountType='discount';
 
+        form.render("select");
         laydate.render({
             elem: '#form-discountrule-starttime',
             type: 'time',
@@ -166,22 +173,14 @@
             formData.append("amount", vdata.amount);
             formData.append("limitcnt", vdata.limitcnt);
 
-            var flag = false;
-            var files = $('#form-discountrule-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) {
+            formData.append("listid",vdata.listid);
+        //    var flag = false;
+       //     var files = $('#form-discountrule-records').prop('files');
+            if(!vdata.listid){
                 layer.msg("请选择餐补名单", {icon: 2, time: 1500});
                 return;
             }
+
             layer.load(2);
             $.ajax({
                 type: "POST",
