餐补人员添加方式修改,由外部创建名单
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",