diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index cf4f1be..4f5b86c 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -34,4 +34,4 @@
 cron.offlinedtl= 0 0/5 * * * ?
 payapi.logintime= 0 0/5 * * * ? 
 
-restaurant.check_discount_expire.cron= 0 0/2 * * * ?
\ No newline at end of file
+restaurant.check_discount_expire.cron=-
\ No newline at end of file
diff --git a/sql/restarant_create_table.sql b/sql/restarant_create_table.sql
index 247c2cb..60cdc07 100644
--- a/sql/restarant_create_table.sql
+++ b/sql/restarant_create_table.sql
@@ -319,7 +319,8 @@
   ruleid int4,
   status varchar(10)  NOT NULL,
   userid varchar(32),
-  username varchar(60) 
+  username varchar(60) ,
+  expiredate varchar(8)
 );
 ALTER TABLE tb_discount_detail ADD CONSTRAINT tb_discount_detail_pkey PRIMARY KEY (id);
 CREATE INDEX discountdetail_ruleid_idx ON tb_discount_detail(ruleid);
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 104c421..650c6a1 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
@@ -442,6 +442,11 @@
                 if(cntamount!=amount){
                     tTransdtl.setRuleid(bean.getRuleid());
                 }
+                TBusinesspara cntflag = businessparaDao.findByParakey("need.ceil");
+                if(null!=cntflag) {
+                    cntamount=Math.ceil(cntamount);
+
+                }
 
                 tTransdtl.setManagefee(amount - cntamount);
                 tTransdtl.setManagefeetype(bean.getRuletype());
@@ -530,7 +535,6 @@
             }
             // }
 
-
             resp.setBillno(req.getBillno());
             Double retAmount = tTransdtl.getAmount() * 100;
             resp.setAmount(retAmount.intValue());
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
index fffc97f..861bfb4 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -138,6 +138,7 @@
         }
     }
 
+
     /**
      * Description: 比较两个时间字符串的前后关系 @param firstTime String 格式：pattern
      *
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustTypeController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustTypeController.java
index 39f4109..52ea76e 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustTypeController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustTypeController.java
@@ -1,27 +1,18 @@
 package com.supwisdom.dlpay.restaurant.controller;
 
 
-import com.google.gson.Gson;
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.WebConstant;
-import com.supwisdom.dlpay.restaurant.bean.AreaSearchBean;
 import com.supwisdom.dlpay.restaurant.bean.CustTypeSearchBean;
-import com.supwisdom.dlpay.restaurant.domain.TArea;
 import com.supwisdom.dlpay.restaurant.domain.TCustType;
-import com.supwisdom.dlpay.restaurant.service.AreaService;
 import com.supwisdom.dlpay.restaurant.service.CustTypeService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 @Controller
 @RequestMapping("/custtype")
 public class CustTypeController {
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 f372667..6e26cf7 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
@@ -479,5 +479,70 @@
         }
     }
 
+    @PostMapping("/discountrule/updatedetailexpiredate")
+    @ResponseBody
+    public JsonResult updateDetailExpiredate(@RequestParam("ruleid") Integer ruleid,
+                                             @RequestParam("id") String id,
+                                             @RequestParam("expiredate") String expiredate,
+                                             @AuthenticationPrincipal UserDetails operUser) {
+        try {
+            if (null == ruleid || StringUtil.isEmpty(id)) {
+                return JsonResult.error("参数传递错误");
+            }
+
+            TOperator oper = (TOperator) operUser;
+            if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
+                return JsonResult.error("登录过期，请重新登录");
+            }
+
+            if (deviceDiscountRuleService.updateDetailExpiredate(ruleid, id,expiredate, oper)) {
+                return JsonResult.ok("修改成功");
+            } else {
+                return JsonResult.error("修改失败");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @GetMapping("/discountrule/expiredownload")
+    @ResponseBody
+    public void downloadExpireExcel(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            String[] title = {"市民卡号", "姓名","过期日期"}; //表头
+            String[][] infos = {{"19045632", "张三","20200805"}}; // 示例内容
+            ExportExcel.queryexcel("餐补过期导入名单模板", title, infos, request, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @PostMapping("/discountrule/updateexpiredatebyexcel")
+    @ResponseBody
+    public JsonResult updateExpireDateByExcel(
+                                              @RequestParam(value = "file", required = false) MultipartFile file,
+                                              @AuthenticationPrincipal UserDetails operUser) {
+        try {
+
+            if (deviceDiscountRuleService.updateExpireDateByExcel(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);
+        }
+    }
+
+    @GetMapping("/discountrule/loadexpireimport")
+    public String loadExpireImport(Model model) {
+        return "restaurant/discountrule/expireimport";
+    }
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DiscountDetailDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DiscountDetailDao.java
index d56a099..7fc4b87 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DiscountDetailDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DiscountDetailDao.java
@@ -20,7 +20,16 @@
   @Query("update TDiscountDetail t set t.status=?1 where t.ruleid=?2 ")
   void updateRuleDetailStatusByRuleid(String status, int ruleid);
 
+
+  @Modifying
+  @Query("update TDiscountDetail t set t.expiredate=?1 where t.userid=?2 ")
+  void updateDetailExpiredate(String expiredate, String userid);
+
+
   List<TDiscountDetail> findAllByUserid(String userid);
 
   void deleteByUserid(String userid);
+
+  TDiscountDetail findByRuleidAndUserid(int ruleid,String userid);
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDiscountDetail.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDiscountDetail.java
index c959c1d..16cc780 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDiscountDetail.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDiscountDetail.java
@@ -32,6 +32,9 @@
   @Column(name="LASTSAVED", length = 14)
   private String lastsaved;
 
+  @Column(name="EXPIREDATE", length = 8)
+  private String expiredate;
+
   public String getId() {
     return id;
   }
@@ -87,4 +90,12 @@
   public void setLastsaved(String lastsaved) {
     this.lastsaved = lastsaved;
   }
+
+  public String getExpiredate() {
+    return expiredate;
+  }
+
+  public void setExpiredate(String expiredate) {
+    this.expiredate = expiredate;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOperDeviceGroupBind.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOperDeviceGroupBind.java
new file mode 100644
index 0000000..a4ce747
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOperDeviceGroupBind.java
@@ -0,0 +1,46 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_Oper_DeviceGroup_Bind")
+@SequenceGenerator(name="SEQ_AREA",sequenceName="SEQ_AREA",allocationSize=1)
+public class TOperDeviceGroupBind {
+
+    @Id
+    @GenericGenerator(name = "idGenerator", strategy = "uuid")
+    @GeneratedValue(generator = "idGenerator")
+    @Column(name = "bid", nullable = false, length = 32)
+    private String bid;
+    @Column(name = "OPERID", nullable = false, length = 32)
+    private String operid;
+    @Column(name = "devgroupid", nullable = false, length = 8)
+    private Integer devgroupid;
+
+
+    public String getBid() {
+        return bid;
+    }
+
+    public void setBid(String bid) {
+        this.bid = bid;
+    }
+
+    public String getOperid() {
+        return operid;
+    }
+
+    public void setOperid(String operid) {
+        this.operid = operid;
+    }
+
+    public Integer getDevgroupid() {
+        return devgroupid;
+    }
+
+    public void setDevgroupid(Integer devgroupid) {
+        this.devgroupid = devgroupid;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeptService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeptService.java
index 3c32211..5731d2c 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeptService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeptService.java
@@ -2,20 +2,12 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.util.PageResult;
-import com.supwisdom.dlpay.restaurant.bean.AreaSearchBean;
 import com.supwisdom.dlpay.restaurant.bean.DeptSearchBean;
-import com.supwisdom.dlpay.restaurant.bean.TDeptShowBean;
-import com.supwisdom.dlpay.restaurant.domain.TArea;
-import com.supwisdom.dlpay.restaurant.domain.TDeviceGroup;
+import com.supwisdom.dlpay.restaurant.domain.TDept;
 import com.supwisdom.dlpay.system.bean.TreeSelectNode;
-import com.supwisdom.dlpay.system.bean.ZTreeNode;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.supwisdom.dlpay.restaurant.domain.TDept;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 public interface DeptService {
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 7d938a1..23062ef 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceDiscountRuleService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceDiscountRuleService.java
@@ -5,8 +5,6 @@
 import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.restaurant.bean.*;
-import com.supwisdom.dlpay.restaurant.domain.TCustomer;
-import com.supwisdom.dlpay.restaurant.domain.TCustomerList;
 import com.supwisdom.dlpay.restaurant.domain.TDiscountDetail;
 import com.supwisdom.dlpay.restaurant.domain.TDiscountDevbind;
 import com.supwisdom.dlpay.system.bean.ZTreeNode;
@@ -26,6 +24,10 @@
   @Transactional(rollbackFor = Exception.class, readOnly = true)
   public List<TDiscountDetail> getExpiredDisCountDetail(Integer custtypeid);
 
+  @Transactional(rollbackFor = Exception.class, readOnly = true)
+  public List<TDiscountDetail> getExpiredDisCountDetailByExpireDate();
+
+
   @Transactional(rollbackFor = Exception.class)
   public boolean changeDiscountRuleLimitCnt(int ruleid,int limitcnt) throws WebCheckException;
 
@@ -69,6 +71,9 @@
   @Transactional(rollbackFor = Exception.class)
   boolean saveRuleBindDevices(int ruleid, List<Integer> deviceIds, TOperator oper) throws WebCheckException;
 
+  @Transactional(rollbackFor = Exception.class)
+  boolean updateDetailExpiredate(int ruleid, String custid, String id, TOperator oper) throws WebCheckException;
+
   @Transactional(rollbackFor = Exception.class, readOnly = true)
   PageResult<DiscountDetailAddBean> getCustomerNotInDiscount(String searchkey,Integer ruleid, int pageNo, int pageSize);
 
@@ -78,6 +83,9 @@
   @Transactional(rollbackFor = Exception.class)
   boolean updateDiscountDetail(TDiscountDetail detail ) ;
 
+  @Transactional(rollbackFor = Exception.class)
+  boolean deleteDiscountDetail(TDiscountDetail detail ) ;
+
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   List<ZTreeNode> getUserDiscount(String custid);
@@ -85,4 +93,7 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult saveDiscountDetails(String custid, String rules);
 
+  @Transactional(rollbackFor = Exception.class)
+  boolean updateExpireDateByExcel(MultipartFile file) throws Exception;
+
 }
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 36eb00e..10c69a9 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
@@ -12,6 +12,7 @@
 import com.supwisdom.dlpay.restaurant.service.CardService;
 import com.supwisdom.dlpay.restaurant.service.CustomerService;
 import com.supwisdom.dlpay.restaurant.service.DeptService;
+import com.supwisdom.dlpay.restaurant.util.DataUtil;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
 import com.supwisdom.dlpay.system.bean.ZTreeNode;
 import org.apache.commons.lang3.StringUtils;
@@ -111,6 +112,12 @@
         query.setMaxResults(param.getPageSize()); //分页显示
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CustomerShowBean.class));
         List<CustomerShowBean> list = query.getResultList();
+        if(null!=list){
+           for(CustomerShowBean bean:list){
+               bean.setCustname(DataUtil.dataDesensitization(bean.getCustname(),1));
+               bean.setCardno(DataUtil.dataDesensitization(bean.getCardno(),4));
+           }
+        }
         BigInteger count = (BigInteger) countQuery.getSingleResult();
         return new PageResult<>(count.longValue(), list);
     }
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 48604ea..18255fb 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
@@ -41,6 +41,7 @@
 import javax.persistence.criteria.Root;
 import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 
@@ -204,6 +205,18 @@
     }
 
     @Override
+    public List<TDiscountDetail> getExpiredDisCountDetailByExpireDate() {
+        StringBuffer sb = new StringBuffer("select t.* from tb_discount_detail t " +
+                "where  t.expiredate <>''  " +
+                "and t.status='normal'");
+        Query query = entityManager.createNativeQuery(sb.toString());
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(TDiscountDetail.class));
+        List<TDiscountDetail> list = query.getResultList();
+        if (null != list) return list;
+        return new ArrayList<>(0);
+    }
+
+    @Override
     public boolean saveNewDiscountRule(String rulename, String ruletype, String starttime,
                                        String endtime, Double amount, Integer limitcnt, String listid, TOperator oper, String rulemode) throws Exception {
         TDiscountRule rule = new TDiscountRule();
@@ -327,8 +340,8 @@
 
     @Override
     public PageResult<TDiscountDetail> getDiscountRuleDetails(String searchkey, int ruleid, int pageNo, int pageSize) {
-        StringBuffer querySql = new StringBuffer("from TDiscountDetail t where t.ruleid=:rlid ");
-        StringBuffer countSql = new StringBuffer("select count(t.id) as cnt from TDiscountDetail t where t.ruleid=:rlid ");
+        StringBuffer querySql = new StringBuffer("from TDiscountDetail t where t.ruleid=:rlid and t.status='normal' ");
+        StringBuffer countSql = new StringBuffer("select count(t.id) as cnt from TDiscountDetail t where t.ruleid=:rlid and t.status='normal' ");
         if (!StringUtil.isEmpty(searchkey)) {
             querySql.append(" and (t.cardno like :str or t.username like :str) ");
             countSql.append(" and (t.cardno like :str or t.username like :str) ");
@@ -520,6 +533,33 @@
     }
 
     @Override
+    public boolean updateDetailExpiredate(int ruleid, String id, String expiredate, TOperator oper) throws WebCheckException {
+        TDiscountRule rule = discountRuleDao.findByRuleid(ruleid);
+        if (null == rule) {
+            throw new WebCheckException("所选餐补规则不存在");
+        } else if (!RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL.equals(rule.getStatus())) {
+            throw new WebCheckException("所选餐补规则状态异常");
+        }
+        if(!StringUtil.isEmpty(expiredate)){
+            boolean isdate=DateUtil.checkDatetimeValid(expiredate,"yyyyMMdd");
+            if(!isdate){
+                throw new WebCheckException("日期格式错误");
+            }
+        }else{
+            expiredate="";
+        }
+
+        Optional<TDiscountDetail> detail=discountDetailDao.findById(id);
+        if(null==detail){
+            throw new WebCheckException("所选餐补规则不存在");
+        }
+        TDiscountDetail discountDetail=detail.get();
+        discountDetail.setExpiredate(expiredate);
+        discountDetailDao.save(discountDetail);
+        return true;
+    }
+
+    @Override
     public PageResult<DiscountDetailAddBean> getCustomerNotInDiscount(String searchkey, Integer ruleid, int pageNo, int pageSize) {
         StringBuffer querySql = new StringBuffer("select t.custid,t.custname,c.cardno from tb_card c " +
                 "left join tb_customer t on t.custid=c.custid where t.custid not in (select userid from TB_DISCOUNT_DETAIL where ruleid=:ruleid) ");
@@ -530,6 +570,8 @@
             countSql.append(" and (c.cardno like :str or t.custname like :str) ");
         }
         querySql.append(" and t.status='normal' and c.status='normal' and c.transstatus='normal' ");
+        countSql.append(" and t.status='normal' and c.status='normal' and c.transstatus='normal' ");
+
         querySql.append(" order by c.cardno ");
         Query query = entityManager.createNativeQuery(querySql.toString());
         Query countQuery = entityManager.createNativeQuery(countSql.toString());
@@ -583,6 +625,12 @@
     }
 
     @Override
+    public boolean deleteDiscountDetail(TDiscountDetail detail) {
+        discountDetailDao.delete(detail);
+        return true;
+    }
+
+    @Override
     public List<ZTreeNode> getUserDiscount(String custid) {
         List<NodeData> nodeData = discountRuleDao.findDiscountRuleNode();
         List<TDiscountDetail> details = discountDetailDao.findAllByUserid(custid);
@@ -622,7 +670,7 @@
         discountDetailDao.deleteByUserid(custid);
         String[] datas = rules.split(",");
         for (String rule : datas) {
-            if ("0".equals(rule)) {
+            if ("0".equals(rule)||"".equals(rule)) {
                 continue;
             }
             TDiscountDetail detail = new TDiscountDetail();
@@ -638,6 +686,117 @@
 
     }
 
+    @Override
+    public boolean updateExpireDateByExcel(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;
+        int index_expiredate=-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;
+            }else if ("过期日期".equals(titleRow[i])) {
+                index_expiredate = 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();
+                String expiredate=row[index_expiredate] == null ? null : row[index_expiredate].toString().trim();
+                if (StringUtil.isEmpty(cardno)) {
+                    msg += "，市民卡号为空";
+                }
+                if (StringUtil.isEmpty(name)) {
+                    msg += "，姓名为空";
+                }
+                if (StringUtil.isEmpty(expiredate)) {
+                    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 += "，市民卡号重复！";
+                }
+                boolean isdate=true;
+                if(!StringUtil.isEmpty(expiredate)){
+                    isdate=DateUtil.checkDatetimeValid(expiredate,"yyyyMMdd");
+                    if(!isdate){
+                        throw new WebCheckException("日期格式错误");
+                    }
+                }else{
+                    expiredate="";
+                }
+
+                if(!isdate){
+                    msg += "，日期格式错误";
+                }
+
+
+                if (!StringUtil.isEmpty(msg)) {
+                    errmsgList.add("第" + (n + 1) + "行数据错误" + msg);
+                } else {
+                    discountDetailDao.updateDetailExpiredate(expiredate,customer.getCustid());
+                }
+            }
+        } 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;
+    }
+
     private DiscountDetailAddBean getDiscountDetailForAdd(String custid) {
         StringBuffer querySql = new StringBuffer("select t.custid,t.custname,c.cardno from tb_customer t " +
                 "left join tb_card c on t.custid=c.custid where  t.custid=:custid ");
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlServiceImpl.java
index 121f2a9..757ef15 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlServiceImpl.java
@@ -15,12 +15,14 @@
 import com.supwisdom.dlpay.restaurant.dao.TransDtlDao;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
 import com.supwisdom.dlpay.restaurant.service.TransDtlService;
+import com.supwisdom.dlpay.restaurant.util.DataUtil;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
 import org.hibernate.query.internal.NativeQueryImpl;
 import org.hibernate.transform.Transformers;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
@@ -57,8 +59,13 @@
                 , Sort.by("billno").descending());
 
         Specification<TTransDtl> spec = gettTransDtlSpecification(param);
+        Page<TTransDtl> dtls= transDtlDao.findAll(spec, pageable);
+        dtls.forEach((dtl)->{
+            dtl.setCustname(DataUtil.dataDesensitization(dtl.getCustname(),1));
+            dtl.setCardno(DataUtil.dataDesensitization(dtl.getCardno(),4));
+        });
 
-        return new PageResult<>(transDtlDao.findAll(spec, pageable));
+        return new PageResult<>(dtls);
     }
 
     @NotNull
@@ -128,7 +135,7 @@
                 switch (t.getStatus()){
                     case "init":status="未入账"; break;
                     case "success":status="已入账"; break;
-                    case "fail":status="已入账"; break;
+                    case "fail":status="失败"; break;
                     default:status="未知状态";
                 }
                 info0[i][7]=status;
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/task/CheckTransdtlTask.java b/src/main/java/com/supwisdom/dlpay/restaurant/task/CheckTransdtlTask.java
index 8efd88f..298063c 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/task/CheckTransdtlTask.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/task/CheckTransdtlTask.java
@@ -108,7 +108,7 @@
         param.setCheckdate(checkdate);
         param.setShopaccno(shop.getShopid());
         param.setDtltype("canteen");
-
+        param.setTenantid("");
         String returnString = shopProxy.downloadShopBill(param);
         if (StringUtil.isEmpty(returnString)) {
           errmsg = "请求核心平台对账返回为空！";
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
index d34def5..dbff687 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
@@ -108,6 +108,19 @@
     public void checkDiscountExpire() {
         long t1 = System.currentTimeMillis();
         logger.info("=================== 检查餐补过期任务开始： ===================");
+        List<TenantDetails> multiTenantSchemas = multiTenantService.getSystemAllTenantDetails();
+        for (TenantDetails schema : multiTenantSchemas) {
+            TenantContextHolder.getContext().setTenant(schema);  //切换schema
+            logger.info("开始执行schema=[" + schema.getDbSchema() + "]的对账任务：");
+            doCheckDiscountExpire(); //TODO:执行task
+        }
+
+
+        long t2 = System.currentTimeMillis();
+        logger.info("=================== 检查餐补过期任务结束，耗时 " + (t2 - t1) + " ms ===================");
+    }
+
+    /*private void doCheckDiscountExpire() {
         List<TCustType> custTypes=custTypeDao.findAll();
         for(TCustType custType:custTypes){
             Integer expireday = custType.getExpireday();
@@ -126,16 +139,19 @@
                 }
             }
         }
+    }*/
 
-        long t2 = System.currentTimeMillis();
-        logger.info("=================== 检查餐补过期任务结束，耗时 " + (t2 - t1) + " ms ===================");
+    private void doCheckDiscountExpire() {
+        List<TDiscountDetail> details=deviceDiscountRuleService.getExpiredDisCountDetailByExpireDate( );
+        for(TDiscountDetail detail:details){
+            String datenow = DateUtil.getNow("yyyyMMdd");
+            String expiredate = detail.getExpiredate();
+            if (DateUtil.compareDatetime(expiredate,datenow,"yyyyMMdd")<0){
+               // detail.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_CLOSED);
+                deviceDiscountRuleService.deleteDiscountDetail(detail);
+            }
+        }
+
     }
 
-//    //TODO
-//    @Scheduled(cron = "0 0/1 * * * ? ")
-//    private void deleteExpiredWhitelist(){
-//        List<TCustomer> expiredCustomer=customerDao.findAll();
-//
-//    }
-
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/util/DataUtil.java b/src/main/java/com/supwisdom/dlpay/restaurant/util/DataUtil.java
new file mode 100644
index 0000000..30d079c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/util/DataUtil.java
@@ -0,0 +1,18 @@
+package com.supwisdom.dlpay.restaurant.util;
+
+import com.supwisdom.dlpay.framework.util.StringUtil;
+
+public class DataUtil {
+    public static String dataDesensitization(String data,int length) {
+        if (StringUtil.isEmpty(data)) {
+            return "";
+        }
+        int originLength = data.length();
+        String preStr = data.substring(0, length);
+        StringBuilder result = new StringBuilder(preStr);
+        for (int i = 0; i < originLength - preStr.length(); i++) {
+            result.append("X");
+        }
+        return result.toString();
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java b/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java
index 8222e90..ee1d1e3 100644
--- a/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java
@@ -7,4 +7,5 @@
     public static final String YKTPAY = "yktpay";
 
     public static final String WECHAT = "wechat";
+
 }
diff --git a/src/main/resources/templates/restaurant/customer/discount.html b/src/main/resources/templates/restaurant/customer/discount.html
index c350363..a0c8168 100644
--- a/src/main/resources/templates/restaurant/customer/discount.html
+++ b/src/main/resources/templates/restaurant/customer/discount.html
@@ -56,9 +56,7 @@
             for (let i = 0; i < nodes.length; i++) {
                 ids.push(nodes[i].id);//存功能ID
             }
-            if (ids.length < 1) {
-                return;
-            }
+
             let idStr = ids.toString();
             console.log(idStr)
             let token = $("meta[name='_csrf_token']").attr("value");
diff --git a/src/main/resources/templates/restaurant/discountrule/expireimport.html b/src/main/resources/templates/restaurant/discountrule/expireimport.html
new file mode 100644
index 0000000..cf8244d
--- /dev/null
+++ b/src/main/resources/templates/restaurant/discountrule/expireimport.html
@@ -0,0 +1,87 @@
+<div style="color: #0c91e5" align="right">
+    <a th:href="@{/discountrule/expiredownload}" class="layui-btn layui-btn-primary" style="margin: 5px">点击此处下载导入模板</a>
+</div>
+<form lay-filter="form" class="layui-form model-form" >
+    <!-- row -->
+    <div class="layui-form-item">
+        <label class="control-label">请选择导入文件<span style="color: red"> * </span></label>
+        <input type="file" name="file" id="expire-file" placeholder="请选择xls格式文件">
+    </div>
+
+    <!-- /row -->
+    <!-- row -->
+    <div class="layui-form-item" align="center">
+        <div id="expire-importError" style="color:red">
+        </div>
+        <div id="expire-importInfo" >
+        </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="expire-form-import" lay-submit id="importbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+
+        var url = '[[@{/discountrule/updateexpiredatebyexcel}]]';
+        // 回显user数据
+
+        /* let fid = admin.getTempData("fid");
+         if (fid) {
+             form.val('form', {"fid": fid});
+         }*/
+        // 表单提交事件
+        form.on('submit(expire-form-import)', function (data) {
+            $("#expire-importError").html("");
+            var files = $('#expire-file').prop('files');
+            var formData = new FormData();
+            $.each(files, function (i, file) {
+                formData.append('file', file);
+            });
+            console.log(formData);
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            debugger
+            $.ajax({
+                type: "POST",
+                url: url,
+                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});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        $("#expire-importError").html("导入结束，导入失败信息:<br/>" + result.msg);
+
+                        console.log('err:' + result.code);
+                      /*  layer.msg(result.msg, {icon: 2});*/
+                    }
+                },
+                error: function () {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/discountrule/rule.html b/src/main/resources/templates/restaurant/discountrule/rule.html
index de36541..beb9f43 100644
--- a/src/main/resources/templates/restaurant/discountrule/rule.html
+++ b/src/main/resources/templates/restaurant/discountrule/rule.html
@@ -19,6 +19,8 @@
             <button id="btn-search-discountrule" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
             <button id="btn-discountrule-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
+            <button id="btn-discountrule-import" class="layui-btn icon-btn" ><i class="layui-icon"></i>批量更新有效期</button>
+
         </div>
         <table class="layui-table" id="discountruleTable" lay-filter="discountruleTable-filter"></table>
     </div>
@@ -52,7 +54,7 @@
             cols: [
                 [
                     {field: 'rulename', title: '餐补名称', align: 'center', fixed: 'left' },
-                    {field: 'timeperiod',width:100, title: '优惠时间段',  align: 'center'},
+                    {field: 'timeperiod',width:150, title: '优惠时间段',  align: 'center'},
                     {
                         field: 'ruletype', title: '餐补类型', align: 'center', width: 120,  sort: true, templet: function (d) {
                             if ('quota' == d.ruletype) {
@@ -125,6 +127,20 @@
             });
         });
 
+        $('#btn-discountrule-import').click(function () {
+            showDownload();
+        });
+        let showDownload = function () {
+            let title ='导入';
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/discountrule/loadexpireimport}]]',
+                finish: function () {
+                 //   table.reload('customer-table', {});
+                }
+            });
+        };
+
 
         table.on('edit(discountruleTable-filter)', function (obj) {
             var row = obj.data; //得到所在行所有键值
diff --git a/src/main/resources/templates/restaurant/discountrule/ruledetail.html b/src/main/resources/templates/restaurant/discountrule/ruledetail.html
index 01928ae..48162ca 100644
--- a/src/main/resources/templates/restaurant/discountrule/ruledetail.html
+++ b/src/main/resources/templates/restaurant/discountrule/ruledetail.html
@@ -30,7 +30,8 @@
                 cols: [
                     [
                         {field: 'cardno', title: '市民卡号', align: 'center'},
-                        {field: 'username', title: '姓名', align: 'center'}
+                        {field: 'username', title: '姓名', align: 'center'},
+                        {field: 'expiredate', title: '过期日期', align: 'center', edit: 'text'}
                     ]
                 ]
             });
@@ -44,5 +45,31 @@
             table.reload('discountruleDetailTable', {where: {ruleid: ruleid, searchkey: searchkey}, page: {curr: 1}});
         });
 
+        table.on('edit(discountruleDetailTable-filter)', function (obj) {
+            console.log(obj.data)
+            var ruleid = $("#search-discountrule-detail-ruleid").val();
+
+            var row = obj.data; //得到所在行所有键值
+            var expiredate = obj.value; //得到修改后的值
+            admin.go('[[@{/discountrule/updatedetailexpiredate}]]', {
+                ruleid: ruleid,
+                id: row.id,
+                expiredate: expiredate,
+                _csrf: $("meta[name='_csrf_token']").attr("value"),
+            }, function (data) {
+                if (data.code == 200) {
+                    layer.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});
+                }
+            },function () {
+                layer.msg('修改失败了，请稍后再试', {icon: 2});
+            });
+        })
     });
 </script>
\ No newline at end of file
