diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 4154d02..7760e30 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -24,4 +24,6 @@
 spring.jackson.serialization.fail-on-empty-beans=false
 
 
-payapi.url=https://yy.dlsmk.cn/payapi
\ No newline at end of file
+payapi.url=https://yy.dlsmk.cn/payapi
+
+payapi.appid=200001
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmResp.java
index 39f2163..8e8b477 100644
--- a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmResp.java
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmResp.java
@@ -3,8 +3,8 @@
 public class PosPayConfirmResp extends APIResp {
   private String billno;
   private boolean require_query;
-  private Double amount;
-  private Double extraamt;
+  private Integer amount;
+  private Integer extraamt;
   private String userid;
   private String username;
   private Integer balance;
@@ -33,19 +33,19 @@
     this.require_query = require_query;
   }
 
-  public Double getAmount() {
+  public Integer getAmount() {
     return amount;
   }
 
-  public void setAmount(Double amount) {
+  public void setAmount(Integer amount) {
     this.amount = amount;
   }
 
-  public Double getExtraamt() {
+  public Integer getExtraamt() {
     return extraamt;
   }
 
-  public void setExtraamt(Double extraamt) {
+  public void setExtraamt(Integer extraamt) {
     this.extraamt = extraamt;
   }
 
diff --git a/src/main/java/com/supwisdom/dlpay/api/service/impl/PayApiServiceImpl.java b/src/main/java/com/supwisdom/dlpay/api/service/impl/PayApiServiceImpl.java
index 61addfa..6e4c958 100644
--- a/src/main/java/com/supwisdom/dlpay/api/service/impl/PayApiServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/api/service/impl/PayApiServiceImpl.java
@@ -1,29 +1,59 @@
 package com.supwisdom.dlpay.api.service.impl;
 
-import com.google.gson.Gson;
 import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam;
 import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam;
 import com.supwisdom.dlpay.api.bean.CitizenPayResponse;
 import com.supwisdom.dlpay.api.service.PayApiService;
-import net.minidev.json.JSONObject;
+import com.supwisdom.dlpay.framework.dao.ApiClientDao;
+import com.supwisdom.dlpay.framework.domain.TApiClient;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
+import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
+import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
 import org.springframework.stereotype.Service;
-import org.springframework.web.client.RestTemplate;
-import sun.net.www.http.HttpClient;
 
+
+@EnableFeignClients(basePackages = "com.supwisdom.dlpay.paysdk")
+@ComponentScan(basePackages = {"com.supwisdom.dlpay.paysdk"})
 @Service
 public class PayApiServiceImpl implements PayApiService {
 
     @Value("${payapi.url}")
     private String payapiurl;
 
+    @Value("${payapi.appid}")
+    private String appid;
+
+    @Autowired
+    private ApiClientDao apiClientDao;
+
+    @Autowired
+    private ApiLoginProxy apiLoginProxy;
+
+    @Autowired
+    private CitizenCardPayProxy citizenCardPayProxy;
 
     @Override
     public CitizenPayResponse citizencardPayinit(CitizenCardPayinitParam param) {
-      //  String gsonString = new Gson().toJson(param);
-//        RestTemplate client=new RestTemplate();
-       /* client.postForEntity(payapiurl+"/api/consume/citizencard/payinit")*/
-        return null;
+        CitizenPayResponse resp=new CitizenPayResponse();
+        if(StringUtil.isEmpty(appid)){
+            resp.setRetmsg("请在配置文件中配置appid");
+            resp.setRetcode(99);
+        }
+        ApiLoginHelper helper=new ApiLoginHelper(apiLoginProxy);
+        TApiClient client=apiClientDao.findByAppid(appid);
+        if(null==client){
+            resp.setRetmsg("未找到对应客户号");
+            resp.setRetcode(99);
+        }
+        helper.login(appid, client.getSecret());
+        resp = citizenCardPayProxy.citizencardPayinit(param);
+
+        return resp;
     }
 
     @Override
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 320c8bc..5a489e1 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
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.api.service.impl;
 
 import com.supwisdom.dlpay.api.bean.*;
+import com.supwisdom.dlpay.api.service.PayApiService;
 import com.supwisdom.dlpay.api.service.PosPayService;
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
@@ -49,6 +50,8 @@
     private ShopSettlementService shopSettlementService;
     @Autowired
     private BusinessparaDao businessparaDao;
+    @Autowired
+    private PayApiService payApiService;
 
 
 
@@ -204,18 +207,14 @@
 
         TTransDtl dtl=transDtlService.saveTransdtl(tTransdtl);
 
-//        CitizenCardPayinitParam param=new CitizenCardPayinitParam();
-//        param.setBillno(dtl.getBillno());
-//        param.setShopaccno(dtl.getShopid());
-//        param.setTransdate(dtl.getTransdate());
-//        param.setTranstime(dtl.getTranstime());
-//        param.setCardNo(dtl.getCardno());
-//        param.setAmount(0);
-//        CitizenPayResponse response=payApiService.citizencardPayinit(param);
-//        if (response.getRetcode()!=0){
-//            dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-//        }
-
+/*        CitizenCardPayinitParam param=new CitizenCardPayinitParam();
+        param.setBillno(dtl.getBillno());
+        param.setShopaccno(dtl.getShopid());
+        param.setTransdate(dtl.getTransdate());
+        param.setTranstime(dtl.getTranstime());
+        param.setCardNo(dtl.getCardno());
+        param.setAmount(0);
+        CitizenPayResponse response=payApiService.citizencardPayinit(param);*/
         resp.setBillno(tTransdtl.getBillno());
         resp.setRetcode(ErrorCode.ERRIF_OK);
         resp.setAnonymous(false);
@@ -223,6 +222,13 @@
         resp.setSourcetype("pos");
         resp.setUserid(tTransdtl.getCustid());
         resp.setUsername(customer.getCustname());
+    /*    if (response.getRetcode()!=0){
+            dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
+            transDtlService.saveTransdtl(dtl);
+            resp.setRetcode(response.getRetcode().toString());
+            resp.setRetmsg(response.getRetmsg());
+        }*/
+
         return resp;
     }
 
@@ -262,8 +268,9 @@
 
 
         resp.setBillno(req.getBillno());
-        resp.setAmount(tTransdtl.getAmount()*100);
-        resp.setExtraamt(extamount*100.0);
+        Double retAmount=tTransdtl.getAmount()*100;
+        resp.setAmount(retAmount.intValue());
+        resp.setExtraamt(extamount*100);
         resp.setUserid(cus.getCustid());
         resp.setUsername(cus.getCustname());
         if(RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(tTransdtl.getStatus())){
@@ -294,8 +301,11 @@
         }
 
         resp.setBillno(tTransdtl.getBillno());
-        resp.setAmount(tTransdtl.getAmount()*100);
-        resp.setExtraamt(tTransdtl.getManagefee()*100);
+
+        Double retAmount=tTransdtl.getAmount()*100;
+        resp.setAmount(retAmount.intValue());
+        Double retExtamt=tTransdtl.getManagefee()*100;
+        resp.setExtraamt(retExtamt.intValue());
         resp.setUserid(cus.getCustid());
         resp.setUsername(cus.getCustname());
         resp.setRequire_query(true);
@@ -322,13 +332,15 @@
             return resp;
         }
         if (tTransDtl.getRevflag() == 1) {
-            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            resp.setTermseqno(req.getTermseqno());
             resp.setRetmsg("流水" + req.getReversalbillno() + "已冲正");
             return resp;
         }
         try {
+            tTransDtl.setTermsqlno(req.getTermseqno());
             transDtlService.revertTransdtl(tTransDtl);
-            resp.setTermseqno(tTransDtl.getTermsqlno());
+            resp.setTermseqno(req.getTermseqno());
             resp.setRetmsg("冲正成功");
             resp.setRetcode(ErrorCode.ERRIF_OK);
             return resp;
@@ -546,6 +558,7 @@
         transDtl.setAmount(req.getAmount()/100.0);
         transDtl.setBillno(systemUtilService.getRefno());
         transDtl.setCardno(req.getCardno());
+        transDtl.setRevflag(0);
         List<TMealtype> mealtypes = mealTypeDao.findAllByOrderByEndtime();
         transDtl.setTermsqlno(req.getTermseqno());
         String err="";
@@ -597,7 +610,7 @@
 
         if("true".equals(req.getReversalflag())){
             TOfflineTransDtl tTransDtl =
-                    offlineTransDtlService.getOfflineTransDtlByTermsqlnoAndTermid(req.getTermseqno(),device.getId(),req.getTransdate());
+                    offlineTransDtlService.getOfflineTransDtlByTermsqlnoAndTermid(req.getReversaltermseqno(),device.getId(),req.getTransdate());
             if (null == tTransDtl) {
                 err+=("终端参考号" + req.getReversaltermseqno() + "不存在;");
             }else{
@@ -615,6 +628,7 @@
                     }else{
                         transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
                     }
+                    transDtl.setAttr1(err);
                     offlineTransDtlService.revertOfflineTransdtl(tTransDtl);
                     resp.setTermseqno(tTransDtl.getTermsqlno());
                     resp.setRetmsg("保存成功");
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
index 73dbf10..c557714 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
@@ -1,5 +1,8 @@
 package com.supwisdom.dlpay.framework.domain;
 
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
index 6ed5bb6..7a70969 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
@@ -15,6 +15,7 @@
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Optional;
 
 @Service
 public class SystemUtilServiceImpl implements SystemUtilService {
@@ -118,7 +119,12 @@
   @Override
   public String getAccdate() {
     String hostdate = getSysdatetime().getHostdate();
-    TSettlectl settlectl = settleCtlDao.getOne(1);
+    Optional<TSettlectl> opt=settleCtlDao.findById(1);
+    TSettlectl settlectl = null;
+    if(opt.isPresent()){
+      settlectl=opt.get();
+    }
+
     if (null != settlectl && null != settlectl.getSettledate()) {
       if (Integer.valueOf(hostdate) < settlectl.getSettledate().intValue()) {
         return settlectl.getSettledate().toString();
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/AmountCountBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/AmountCountBean.java
index 7dd29ce..74d7b8b 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/AmountCountBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/AmountCountBean.java
@@ -1,13 +1,15 @@
 package com.supwisdom.dlpay.restaurant.bean;
 
+import java.math.BigInteger;
+
 public class AmountCountBean {
   private Double totalamt;
-  private Long totalcnt;
+  private BigInteger totalcnt;
 
   public AmountCountBean() {
   }
 
-  public AmountCountBean(Double totalamt, Long totalcnt) {
+  public AmountCountBean(Double totalamt, BigInteger totalcnt) {
     this.totalamt = totalamt;
     this.totalcnt = totalcnt;
   }
@@ -20,11 +22,11 @@
     this.totalamt = totalamt;
   }
 
-  public Long getTotalcnt() {
+  public BigInteger getTotalcnt() {
     return totalcnt;
   }
 
-  public void setTotalcnt(Long totalcnt) {
+  public void setTotalcnt(BigInteger totalcnt) {
     this.totalcnt = totalcnt;
   }
 }
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 3e245e5..39f4109 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustTypeController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustTypeController.java
@@ -36,7 +36,7 @@
     }
 
     @RequestMapping("/list")
-    @PreAuthorize("hasPermission('/custtype/index','')")
+  //  @PreAuthorize("hasPermission('/custtype/index','')")
     @ResponseBody
     public PageResult<TCustType> getDataList(@RequestParam("page") Integer pageNo,
                                              @RequestParam("limit") Integer pageSize,
@@ -57,13 +57,13 @@
 
 
     @GetMapping("/loadadd")
-    @PreAuthorize("hasPermission('/custtype/loadadd','')")
+  //  @PreAuthorize("hasPermission('/custtype/loadadd','')")
     public String loadadd(Model model) {
         return "restaurant/custtype/form";
     }
 
     @PostMapping("/add")
-    @PreAuthorize("hasPermission('/custtype/add','')")
+  //  @PreAuthorize("hasPermission('/custtype/add','')")
     @ResponseBody
     public JsonResult add(@RequestBody TCustType custType) {
         if (custType != null) {
@@ -74,7 +74,7 @@
     }
 
     @PostMapping("/delete")
-    @PreAuthorize("hasPermission('/custtype/delete','')")
+ //   @PreAuthorize("hasPermission('/custtype/delete','')")
     @ResponseBody
     public JsonResult delfunc(@RequestParam Integer id) {
         return custTypeService.deleteCusttype(id);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/OfflineTransDtlDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/OfflineTransDtlDao.java
index 7e8d538..3c55565 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/OfflineTransDtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/OfflineTransDtlDao.java
@@ -14,13 +14,12 @@
 @Repository
 public interface OfflineTransDtlDao extends JpaRepository<TOfflineTransDtl, String>, JpaSpecificationExecutor<TTransDtl> {
 
-
     TOfflineTransDtl getByBillno(String billno);
 
-
     @Query(value = "select max(termsqlno) from tb_offlinetransdtl where termid=?1 and accdate=?2 ", nativeQuery=true)
     Integer getMaxSqlnoToday(Integer deviceid, String accdate);
 
+    @Query(value = "from TOfflineTransDtl where termsqlno=?1 and termid=?2 and accdate=?3 ")
     List<TOfflineTransDtl> findByTermsqlnoAndTermidAndAccdate(Integer termsqlno,Integer termid,String accdate);
 
     List<TOfflineTransDtl> findAllByAccdateAndStatusIsNull(String accdate);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardver.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardver.java
index 361830a..42d77fb 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardver.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardver.java
@@ -73,7 +73,7 @@
     public void setAdderflag(Integer adderflag) {
         this.adderflag = adderflag;
     }
-    @Column(name = "status", length = 1)
+    @Column(name = "status", length = 10)
     public String getStatus() {
         return status;
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
index c691ade..a237010 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
@@ -133,7 +133,7 @@
         this.lastsaved = lastsaved;
     }
 
-    @Column(name = "status", length = 1)
+    @Column(name = "status", length = 10)
     public String getStatus() {
         return status;
     }
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 a19c528..c76a7c5 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
@@ -39,427 +39,434 @@
 
 @Service
 public class DeviceDiscountRuleServiceImpl implements DeviceDiscountRuleService {
-  @Autowired
-  private DiscountRuleDao discountRuleDao;
-  @Autowired
-  private DiscountDevbindDao discountDevbindDao;
-  @Autowired
-  private DiscountDetailDao discountDetailDao;
-  @Autowired
-  private SystemUtilService systemUtilService;
-  @Autowired
-  private CustomerDao customerDao;
-  @Autowired
-  private DeviceDao deviceDao;
+    @Autowired
+    private DiscountRuleDao discountRuleDao;
+    @Autowired
+    private DiscountDevbindDao discountDevbindDao;
+    @Autowired
+    private DiscountDetailDao discountDetailDao;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private CustomerDao customerDao;
+    @Autowired
+    private DeviceDao deviceDao;
 
-  @PersistenceContext
-  private EntityManager entityManager;
+    @PersistenceContext
+    private EntityManager entityManager;
 
-  private PageResult<DiscountRuleShowBean> getDiscountRuleBySearch(String rulename, String ruletype, String status, Pageable pageable) {
-    Page<TDiscountRule> page = discountRuleDao.findAll(new Specification<TDiscountRule>() {
-      @Override
-      public Predicate toPredicate(Root<TDiscountRule> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
-        List<Predicate> predicates = new ArrayList<>();
-        if (!StringUtil.isEmpty(rulename)) {
-          predicates.add(criteriaBuilder.like(root.get("rulename").as(String.class), "%" + rulename.trim() + "%"));
+    private PageResult<DiscountRuleShowBean> getDiscountRuleBySearch(String rulename, String ruletype, String status, Pageable pageable) {
+        Page<TDiscountRule> page = discountRuleDao.findAll(new Specification<TDiscountRule>() {
+            @Override
+            public Predicate toPredicate(Root<TDiscountRule> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+                List<Predicate> predicates = new ArrayList<>();
+                if (!StringUtil.isEmpty(rulename)) {
+                    predicates.add(criteriaBuilder.like(root.get("rulename").as(String.class), "%" + rulename.trim() + "%"));
+                }
+                if (!StringUtil.isEmpty(ruletype)) {
+                    predicates.add(criteriaBuilder.equal(root.get("ruletype").as(String.class), ruletype));
+
+                }
+                if (!StringUtil.isEmpty(status)) {
+                    predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), status));
+                }
+                return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+            }
+        }, pageable);
+        List<DiscountRuleShowBean> result = new ArrayList<>(0);
+        if (null != page && page.getTotalElements() > 0) {
+            for (TDiscountRule rule : page.getContent()) {
+                DiscountRuleShowBean bean = new DiscountRuleShowBean();
+                bean.setRuleid(rule.getRuleid());
+                bean.setRulename(rule.getRulename());
+                bean.setRuletype(rule.getRuletype());
+                bean.setAmount(rule.getAmount());
+                bean.setStatus(rule.getStatus());
+                bean.setDetailStatus(rule.getDetailStatus());
+                bean.setLimitcnt(rule.getLimitcnt());
+                bean.setRemark(rule.getRemark());
+                bean.setStarttime(rule.getStarttime().substring(0, 2) + ":" + rule.getStarttime().substring(2));
+                bean.setEndtime(rule.getEndtime().substring(0, 2) + ":" + rule.getEndtime().substring(2));
+                bean.setTimeperiod(bean.getStarttime() + " ~ " + bean.getEndtime());
+                result.add(bean);
+            }
         }
-        if (!StringUtil.isEmpty(ruletype)) {
-          predicates.add(criteriaBuilder.equal(root.get("ruletype").as(String.class), ruletype));
-
-        }
-        if (!StringUtil.isEmpty(status)) {
-          predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), status));
-        }
-        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
-      }
-    }, pageable);
-    List<DiscountRuleShowBean> result = new ArrayList<>(0);
-    if (null != page && page.getTotalElements() > 0) {
-      for (TDiscountRule rule : page.getContent()) {
-        DiscountRuleShowBean bean = new DiscountRuleShowBean();
-        bean.setRuleid(rule.getRuleid());
-        bean.setRulename(rule.getRulename());
-        bean.setRuletype(rule.getRuletype());
-        bean.setAmount(rule.getAmount());
-        bean.setStatus(rule.getStatus());
-        bean.setDetailStatus(rule.getDetailStatus());
-        bean.setLimitcnt(rule.getLimitcnt());
-        bean.setRemark(rule.getRemark());
-        bean.setStarttime(rule.getStarttime().substring(0, 2) + ":" + rule.getStarttime().substring(2));
-        bean.setEndtime(rule.getEndtime().substring(0, 2) + ":" + rule.getEndtime().substring(2));
-        bean.setTimeperiod(bean.getStarttime() + " ~ " + bean.getEndtime());
-        result.add(bean);
-      }
-    }
-    return new PageResult<>(page.getTotalElements(), result);
-  }
-
-  @Override
-  public PageResult<DiscountRuleShowBean> getDiscountRuleInfos(String rulename, String ruletype, int pageNo, int pageSize) {
-    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("ruleid"));
-    return getDiscountRuleBySearch(rulename, ruletype, null, pageable);
-  }
-
-  @Override
-  public boolean deleteDiscountRule(int ruleid) throws WebCheckException {
-    TDiscountRule rule = discountRuleDao.findByRuleid(ruleid);
-    if (null == rule) {
-      throw new WebCheckException("餐补规则不存在！");
-    } else if (!RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK.equals(rule.getStatus()) && !RestaurantConstant.STATUS_DISCOUNTRULE_REJECT.equals(rule.getStatus())) {
-      throw new WebCheckException("待审核或驳回的餐补规则才能删除！");
+        return new PageResult<>(page.getTotalElements(), result);
     }
 
-    discountDetailDao.deleteRuleDetailsByRuleid(ruleid); //名单
-    discountDevbindDao.deleteBindByRuleid(ruleid); //绑定设备
-    discountRuleDao.delete(rule);
-    return true;
-  }
-
-  @Override
-  public boolean closeDiscountRule(int ruleid) throws WebCheckException {
-    TDiscountRule rule = discountRuleDao.findByRuleid(ruleid);
-    if (null == rule) {
-      throw new WebCheckException("餐补规则不存在！");
-    } else if (RestaurantConstant.STATUS_DISCOUNTRULE_CLOSED.equals(rule.getStatus())) {
-      throw new WebCheckException("餐补规则已经失效！");
-    } else if (!RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL.equals(rule.getStatus())) {
-      throw new WebCheckException("餐补规则未审核通过，不能关闭");
+    @Override
+    public PageResult<DiscountRuleShowBean> getDiscountRuleInfos(String rulename, String ruletype, int pageNo, int pageSize) {
+        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("ruleid"));
+        return getDiscountRuleBySearch(rulename, ruletype, null, pageable);
     }
 
+    @Override
+    public boolean deleteDiscountRule(int ruleid) throws WebCheckException {
+        TDiscountRule rule = discountRuleDao.findByRuleid(ruleid);
+        if (null == rule) {
+            throw new WebCheckException("餐补规则不存在！");
+        } else if (!RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK.equals(rule.getStatus()) && !RestaurantConstant.STATUS_DISCOUNTRULE_REJECT.equals(rule.getStatus())) {
+            throw new WebCheckException("待审核或驳回的餐补规则才能删除！");
+        }
+
+        discountDetailDao.deleteRuleDetailsByRuleid(ruleid); //名单
+        discountDevbindDao.deleteBindByRuleid(ruleid); //绑定设备
+        discountRuleDao.delete(rule);
+        return true;
+    }
+
+    @Override
+    public boolean closeDiscountRule(int ruleid) throws WebCheckException {
+        TDiscountRule rule = discountRuleDao.findByRuleid(ruleid);
+        if (null == rule) {
+            throw new WebCheckException("餐补规则不存在！");
+        } else if (RestaurantConstant.STATUS_DISCOUNTRULE_CLOSED.equals(rule.getStatus())) {
+            throw new WebCheckException("餐补规则已经失效！");
+        } else if (!RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL.equals(rule.getStatus())) {
+            throw new WebCheckException("餐补规则未审核通过，不能关闭");
+        }
+
 //    if (discountDevbindDao.getBindcntByRuleid(ruleid) > 0) {
 //      throw new WebCheckException("有设备正在使用该餐补规则，请先解绑设备");
 //    }
 
-    rule.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_CLOSED);
-    rule.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
-    discountRuleDao.save(rule);
-    return true;
-  }
-
-  @Override
-  public boolean checkDiscountRulenameExist(String rulename, Integer ruleid) {
-    if (null == ruleid) {
-      if (discountRuleDao.checkRulenameExists(rulename) > 0) {
+        rule.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_CLOSED);
+        rule.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+        discountRuleDao.save(rule);
         return true;
-      }
-    } else {
-      if (discountRuleDao.checkRulenameExists(rulename, ruleid) > 0) {
+    }
+
+    @Override
+    public boolean checkDiscountRulenameExist(String rulename, Integer ruleid) {
+        if (null == ruleid) {
+            if (discountRuleDao.checkRulenameExists(rulename) > 0) {
+                return true;
+            }
+        } else {
+            if (discountRuleDao.checkRulenameExists(rulename, ruleid) > 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private TCustomer getCustomerByCardno(String cardno) {
+        if (!StringUtil.isEmpty(cardno)) {
+            List<TCustomer> list = customerDao.findAllByCardno(cardno.trim());
+            if (!StringUtil.isEmpty(list)) {
+                return list.get(0);
+            }
+        }
+        return null;
+    }
+
+    private boolean checkRuleTimeError(String starttime, String endtime, String cardno, String custid) {
+        Query query = entityManager.createNativeQuery("select count(a.id) from tb_discount_detail a, tb_discount_rule b where a.ruleid=b.ruleid and (b.status='uncheck' or b.status='normal') " +
+                "and a.cardno=:cardno and ((b.starttime<:starttime and b.endtime>:starttime) or (b.starttime<:endtime and b.endtime>:endtime)) ");
+        query.setParameter("cardno", cardno);
+        query.setParameter("starttime", starttime);
+        query.setParameter("endtime", endtime);
+        BigInteger cnt = (BigInteger) query.getSingleResult();
+        if (null != cnt && cnt.longValue() > 0) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean saveNewDiscountRule(String rulename, String ruletype, String starttime,
+                                       String endtime, Double amount, Integer limitcnt, MultipartFile file, TOperator oper) throws Exception {
+        TDiscountRule rule = new TDiscountRule();
+        if (discountRuleDao.checkRulenameExists(rulename) > 0) {
+            throw new WebCheckException("餐补名称已经存在！");
+        }
+        rule.setRulename(rulename);
+        rule.setRuletype(ruletype);
+        rule.setStarttime(starttime);
+        rule.setEndtime(endtime);
+        rule.setAmount(amount);
+        rule.setLimitcnt(limitcnt);
+        rule.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK);
+        rule.setDetailStatus(1);
+        rule.setCreateOperid(oper.getOperid());
+        String systime = systemUtilService.getSysdatetime().getHostdatetime();
+        rule.setCreatetime(systime);
+        rule.setLastsaved(systime);
+        rule.setVerno(1);
+        rule = discountRuleDao.save(rule);
+
+        String filename = file.getOriginalFilename();
+        if (!filename.endsWith(".xls") && !filename.endsWith(".xlsx")) {
+            throw new WebCheckException("文件格式错误,请选择excel文件");
+        }
+        List<Object[][]> excelData = null;
+        try {
+            if (filename.endsWith(".xls")) {
+                excelData = ImportExcelUtil.getIntegralData(file.getInputStream());//2003版本
+            } else {
+                excelData = ImportExcelUtil.getIntegralData07(file.getInputStream());//2007版本以上
+            }
+            if (null == excelData || excelData.size() < 1) {
+                throw new WebCheckException("excel文件解析错误");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new WebCheckException("模板格式错误，请重新下载模板");
+        }
+
+
+        int index_cardno = -1;
+        int index_name = -1;
+        Object[] titleRow = excelData.get(0)[0]; //sheet1表头
+        for (int i = 0; i < titleRow.length; i++) {
+            if ("市民卡号".equals(titleRow[i])) {
+                index_cardno = i;
+                continue;
+            } else if ("姓名".equals(titleRow[i])) {
+                index_name = i;
+                continue;
+            }
+        }
+        if (index_cardno == -1 || index_name == -1 || excelData.get(0).length < 2) {
+            throw new WebCheckException("名单模板表头不能修改，且必须包含数据！");
+        }
+
+        List<String> successCardnos = new ArrayList<>(0);
+        List<String> errmsgList = new ArrayList<>(0);
+
+        try {
+            for (int n = 1; n < excelData.get(0).length; n++) {
+                String msg = "";
+                Object[] row = excelData.get(0)[n];
+                String cardno = row[index_cardno] == null ? null : row[index_cardno].toString().trim();
+                String name = row[index_name] == null ? null : row[index_name].toString().trim();
+                if (StringUtil.isEmpty(cardno)) {
+                    msg += "，市民卡号为空";
+                }
+                if (StringUtil.isEmpty(name)) {
+                    msg += "，姓名为空";
+                }
+                TCustomer customer = 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);
+                }
+            }
+
+        } 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;
-      }
-    }
-    return false;
-  }
-
-  private TCustomer getCustomerByCardno(String cardno) {
-    if (!StringUtil.isEmpty(cardno)) {
-      List<TCustomer> list = customerDao.findAllByCardno(cardno.trim());
-      if (!StringUtil.isEmpty(list)) {
-        return list.get(0);
-      }
-    }
-    return null;
-  }
-
-  private boolean checkRuleTimeError(String starttime, String endtime, String cardno, String custid) {
-    Query query = entityManager.createNativeQuery("select count(a.id) from tb_discount_detail a, tb_discount_rule b where a.ruleid=b.ruleid and (b.status='uncheck' or b.status='normal') " +
-        "and a.cardno=:cardno and ((b.starttime<:starttime and b.endtime>:starttime) or (b.starttime<:endtime and b.endtime>:endtime)) ");
-    query.setParameter("cardno", cardno);
-    query.setParameter("starttime", starttime);
-    query.setParameter("endtime", endtime);
-    BigInteger cnt = (BigInteger) query.getSingleResult();
-    if (null != cnt && cnt.longValue() > 0) {
-      return true;
-    }
-    return false;
-  }
-
-  @Override
-  public boolean saveNewDiscountRule(String rulename, String ruletype, String starttime,
-                                     String endtime, Double amount, Integer limitcnt, MultipartFile file, TOperator oper) throws Exception {
-    TDiscountRule rule = new TDiscountRule();
-    if (discountRuleDao.checkRulenameExists(rulename) > 0) {
-      throw new WebCheckException("餐补名称已经存在！");
-    }
-    rule.setRulename(rulename);
-    rule.setRuletype(ruletype);
-    rule.setStarttime(starttime);
-    rule.setEndtime(endtime);
-    rule.setAmount(amount);
-    rule.setLimitcnt(limitcnt);
-    rule.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK);
-    rule.setDetailStatus(1);
-    rule.setCreateOperid(oper.getOperid());
-    String systime = systemUtilService.getSysdatetime().getHostdatetime();
-    rule.setCreatetime(systime);
-    rule.setLastsaved(systime);
-    rule.setVerno(1);
-    rule = discountRuleDao.save(rule);
-
-    String filename = file.getOriginalFilename();
-    if (!filename.endsWith(".xls") && !filename.endsWith(".xlsx")) {
-      throw new WebCheckException("文件格式错误,请选择excel文件");
-    }
-    List<Object[][]> excelData = null;
-    try{
-      if (filename.endsWith(".xls")) {
-        excelData = ImportExcelUtil.getIntegralData(file.getInputStream());//2003版本
-      } else {
-        excelData = ImportExcelUtil.getIntegralData07(file.getInputStream());//2007版本以上
-      }
-      if (null == excelData || excelData.size() < 1) {
-        throw new WebCheckException("excel文件解析错误");
-      }
-    }catch (Exception e){
-      e.printStackTrace();
-      throw new WebCheckException("模板格式错误，请重新下载模板");
     }
 
-
-    int index_cardno = -1;
-    int index_name = -1;
-    Object[] titleRow = excelData.get(0)[0]; //sheet1表头
-    for (int i = 0; i < titleRow.length; i++) {
-      if ("市民卡号".equals(titleRow[i])) {
-        index_cardno = i;
-        continue;
-      } else if ("姓名".equals(titleRow[i])) {
-        index_name = i;
-        continue;
-      }
-    }
-    if (index_cardno == -1 || index_name == -1 || excelData.get(0).length < 2) {
-      throw new WebCheckException("名单模板表头不能修改，且必须包含数据！");
-    }
-
-    List<String> successCardnos = new ArrayList<>(0);
-    List<String> errmsgList = new ArrayList<>(0);
-    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 = getCustomerByCardno(cardno);
-      if (!StringUtil.isEmpty(cardno)) {
-        if (null == customer) {
-          msg += "，市民卡用户不存在";
-        } else if (!customer.getCustname().equals(name)) {
-          msg += "，市民卡号与姓名不匹配！";
+    @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 ");
+        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) ");
         }
-      }
-      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);
-      }
-    }
-
-    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/>错误太多，请仔细核对名单后再上传！");
+        querySql.append(" order by t.cardno ");
+        Query query = entityManager.createQuery(querySql.toString());
+        Query countQuery = entityManager.createQuery(countSql.toString());
+        query.setParameter("rlid", ruleid);
+        countQuery.setParameter("rlid", ruleid);
+        if (!StringUtil.isEmpty(searchkey)) {
+            query.setParameter("str", "%" + searchkey.trim() + "%");
+            countQuery.setParameter("str", "%" + searchkey.trim() + "%");
         }
-      }
-      throw new WebCheckException(errmsg.toString());
-    }
-    return true;
-  }
-
-  @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 ");
-    if (!StringUtil.isEmpty(searchkey)) {
-      querySql.append(" and (t.cardno like :str or t.username like :str) ");
-      countSql.append(" and (t.cardno like :str or t.username like :str) ");
-    }
-    querySql.append(" order by t.cardno ");
-    Query query = entityManager.createQuery(querySql.toString());
-    Query countQuery = entityManager.createQuery(countSql.toString());
-    query.setParameter("rlid", ruleid);
-    countQuery.setParameter("rlid", ruleid);
-    if (!StringUtil.isEmpty(searchkey)) {
-      query.setParameter("str", "%" + searchkey.trim() + "%");
-      countQuery.setParameter("str", "%" + searchkey.trim() + "%");
-    }
-    query.setFirstResult((pageNo - 1) * pageSize);
-    query.setMaxResults(pageSize); //分页显示
-    List<TDiscountDetail> list = query.getResultList();
-    Long count = (Long) countQuery.getSingleResult();
-    return new PageResult<>(count.longValue(), list);
-  }
-
-
-  @Override
-  public PageResult<DiscountRuleShowBean> getCheckDiscountRuleInfos(String status, int pageNo, int pageSize) {
-    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "createtime"));
-    return getDiscountRuleBySearch(null, null, status, pageable);
-  }
-
-  @Override
-  public boolean doCheckDiscountRule(int ruleid, boolean passflag, String reason, TOperator oper) throws Exception {
-    TDiscountRule rule = discountRuleDao.findByRuleid(ruleid);
-    if (null == rule) {
-      throw new WebCheckException("餐补规则不存在！");
-    } else if (!RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK.equals(rule.getStatus())) {
-      throw new WebCheckException("餐补规则非待审核状态");
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize); //分页显示
+        List<TDiscountDetail> list = query.getResultList();
+        Long count = (Long) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
     }
 
-    rule.setCheckOperid(oper.getOperid());
-    rule.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
-    if (passflag) {
-      rule.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL);
-      rule.setRemark(null);
-    } else {
-      rule.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_REJECT);
-      rule.setRemark(reason);
-    }
-    discountRuleDao.save(rule);
-    discountDetailDao.updateRuleDetailStatusByRuleid(rule.getStatus(), rule.getRuleid());
-    return true;
-  }
 
-  @Override
-  public List<DiscountRuleSelectBean> getNormalDiscountRules() {
-    List<TDiscountRule> list = discountRuleDao.getDiscountRuleByStatus(RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL);
-    if (!StringUtil.isEmpty(list)) {
-      List<DiscountRuleSelectBean> result = new ArrayList<>(0);
-      for (TDiscountRule rule : list) {
-        DiscountRuleSelectBean bean = new DiscountRuleSelectBean();
-        bean.setRuleid(rule.getRuleid());
-        String period = rule.getStarttime().substring(0, 2) + ":" + rule.getStarttime().substring(2) + " ~ " + rule.getEndtime().substring(0, 2) + ":" + rule.getEndtime().substring(2);
-        bean.setRulename(rule.getRulename()+"（"+period+"）");
-        bean.setTimeperiod(period);
-        result.add(bean);
-      }
-      return result;
-    }
-    return new ArrayList<>(0);
-  }
-
-  @Override
-  public PageResult<DiscountRuleBindShowBean> getDiscountRuleDevBindInfo(String searchkey, int pageNo, int pageSize) {
-    StringBuffer querySql = new StringBuffer("select t.id,t.deviceid,b.devicename,b.devphyid,t.ruleid,a.rulename,a.status as rulestatus,t.createtime " +
-        " from TB_DISCOUNT_DEVBIND t left join TB_DISCOUNT_RULE a on t.ruleid=a.ruleid left join TB_DEVICE b on t.deviceid=b.id where 1=1 ");
-    StringBuffer countSql = new StringBuffer("select count(t.id) as cnt " +
-        " from TB_DISCOUNT_DEVBIND t left join TB_DISCOUNT_RULE a on t.ruleid=a.ruleid left join TB_DEVICE b on t.deviceid=b.id where 1=1 ");
-    if (!StringUtil.isEmpty(searchkey)) {
-      querySql.append(" and (a.rulename like :str or b.devicename like :str or b.devphyid like :str) ");
-      countSql.append(" and (a.rulename like :str or b.devicename like :str or b.devphyid like :str) ");
-    }
-    querySql.append(" order by t.createtime desc ");
-    Query query = entityManager.createNativeQuery(querySql.toString());
-    Query countQuery = entityManager.createNativeQuery(countSql.toString());
-    if (!StringUtil.isEmpty(searchkey)) {
-      query.setParameter("str", "%" + searchkey.trim() + "%");
-      countQuery.setParameter("str", "%" + searchkey.trim() + "%");
-    }
-    query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(DiscountRuleBindShowBean.class));
-    query.setFirstResult((pageNo - 1) * pageSize);
-    query.setMaxResults(pageSize); //分页显示
-    List<DiscountRuleBindShowBean> list = query.getResultList();
-    BigInteger count = (BigInteger) countQuery.getSingleResult();
-    return new PageResult<>(count.longValue(), list);
-  }
-
-  @Override
-  public TDiscountDevbind getDiscountDevbindById(String id) {
-    if (!StringUtil.isEmpty(id)) {
-      return discountDevbindDao.getDiscountDevbindById(id.trim());
-    }
-    return null;
-  }
-
-  @Override
-  public boolean deleteDiscountDevbind(TDiscountDevbind bind) {
-    if (null != bind) {
-      discountDevbindDao.delete(bind);
-      return true;
-    }
-    return false;
-  }
-
-  @Override
-  public PageResult<DevparaBinddevShowBean> searchRuleBindDevices(Integer devgroupid, String searchkey, int ruleid) {
-    List<Integer> chirdGroupids = null;
-    if (null != devgroupid) {
-      Query chirdGroupQuery = entityManager.createNativeQuery(" WITH  RECURSIVE  r  AS ( " +
-          " SELECT * FROM tb_devicegroup WHERE devgroupid = :gid " +
-          " union ALL " +
-          " SELECT a.* FROM tb_devicegroup a, r WHERE a.pid = r.devgroupid ) " +
-          " SELECT devgroupid FROM r ORDER BY devgroupid ");
-      chirdGroupQuery.setParameter("gid", devgroupid.intValue());
-      chirdGroupids = chirdGroupQuery.getResultList(); //递归查询所有的子节点
+    @Override
+    public PageResult<DiscountRuleShowBean> getCheckDiscountRuleInfos(String status, int pageNo, int pageSize) {
+        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "createtime"));
+        return getDiscountRuleBySearch(null, null, status, pageable);
     }
 
-    StringBuffer sql = new StringBuffer("select t.id as deviceid,t.devicename,t.devphyid,t.devgroupid,a.groupname as devgroupname " +
-        " from TB_DEVICE t left join TB_DEVICEGROUP a on t.devgroupid=a.devgroupid " +
-        " left join TB_DISCOUNT_DEVBIND b on t.id=b.deviceid and b.ruleid=:rlid where b.id is null and t.state=1 ");
-    if (!StringUtil.isEmpty(chirdGroupids)) {
-      sql.append(" and t.devgroupid in (" + StringUtils.join(chirdGroupids.toArray(), ",") + ") ");
-    }
-    if (!StringUtil.isEmpty(searchkey)) {
-      sql.append(" and (t.devicename like :str or t.devphyid like :str) ");
-    }
-    sql.append(" order by t.id ");
-    Query query = entityManager.createNativeQuery(sql.toString());
-    if (!StringUtil.isEmpty(searchkey)) {
-      query.setParameter("str", "%" + searchkey.trim() + "%");
-    }
-    query.setParameter("rlid", ruleid);
-    query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(DevparaBinddevShowBean.class));
-    List<DevparaBinddevShowBean> list = query.getResultList();
-    return new PageResult<>(list);
-  }
+    @Override
+    public boolean doCheckDiscountRule(int ruleid, boolean passflag, String reason, TOperator oper) throws Exception {
+        TDiscountRule rule = discountRuleDao.findByRuleid(ruleid);
+        if (null == rule) {
+            throw new WebCheckException("餐补规则不存在！");
+        } else if (!RestaurantConstant.STATUS_DISCOUNTRULE_UNCHECK.equals(rule.getStatus())) {
+            throw new WebCheckException("餐补规则非待审核状态");
+        }
 
-  @Override
-  public boolean saveRuleBindDevices(int ruleid, List<Integer> deviceIds, 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("所选餐补规则状态异常");
+        rule.setCheckOperid(oper.getOperid());
+        rule.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+        if (passflag) {
+            rule.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL);
+            rule.setRemark(null);
+        } else {
+            rule.setStatus(RestaurantConstant.STATUS_DISCOUNTRULE_REJECT);
+            rule.setRemark(reason);
+        }
+        discountRuleDao.save(rule);
+        discountDetailDao.updateRuleDetailStatusByRuleid(rule.getStatus(), rule.getRuleid());
+        return true;
     }
 
-    for (Integer id : deviceIds) {
-      TDevice device = deviceDao.findTDeviceById(id);
-      if (null == device) {
-        throw new WebCheckException("终端编号为[" + id + "]的设备不存在");
-      } else if (1 != device.getState()) {
-        throw new WebCheckException("终端编号为[" + id + "]的设备状态异常");
-      }
-
-      TDiscountDevbind bind = new TDiscountDevbind();
-      bind.setRuleid(rule.getRuleid());
-      bind.setDeviceid(device.getId());
-      bind.setCreateOperid(oper == null ? null : oper.getOperid());
-      bind.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
-      discountDevbindDao.save(bind);
+    @Override
+    public List<DiscountRuleSelectBean> getNormalDiscountRules() {
+        List<TDiscountRule> list = discountRuleDao.getDiscountRuleByStatus(RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL);
+        if (!StringUtil.isEmpty(list)) {
+            List<DiscountRuleSelectBean> result = new ArrayList<>(0);
+            for (TDiscountRule rule : list) {
+                DiscountRuleSelectBean bean = new DiscountRuleSelectBean();
+                bean.setRuleid(rule.getRuleid());
+                String period = rule.getStarttime().substring(0, 2) + ":" + rule.getStarttime().substring(2) + " ~ " + rule.getEndtime().substring(0, 2) + ":" + rule.getEndtime().substring(2);
+                bean.setRulename(rule.getRulename() + "（" + period + "）");
+                bean.setTimeperiod(period);
+                result.add(bean);
+            }
+            return result;
+        }
+        return new ArrayList<>(0);
     }
-    return true;
-  }
+
+    @Override
+    public PageResult<DiscountRuleBindShowBean> getDiscountRuleDevBindInfo(String searchkey, int pageNo, int pageSize) {
+        StringBuffer querySql = new StringBuffer("select t.id,t.deviceid,b.devicename,b.devphyid,t.ruleid,a.rulename,a.status as rulestatus,t.createtime " +
+                " from TB_DISCOUNT_DEVBIND t left join TB_DISCOUNT_RULE a on t.ruleid=a.ruleid left join TB_DEVICE b on t.deviceid=b.id where 1=1 ");
+        StringBuffer countSql = new StringBuffer("select count(t.id) as cnt " +
+                " from TB_DISCOUNT_DEVBIND t left join TB_DISCOUNT_RULE a on t.ruleid=a.ruleid left join TB_DEVICE b on t.deviceid=b.id where 1=1 ");
+        if (!StringUtil.isEmpty(searchkey)) {
+            querySql.append(" and (a.rulename like :str or b.devicename like :str or b.devphyid like :str) ");
+            countSql.append(" and (a.rulename like :str or b.devicename like :str or b.devphyid like :str) ");
+        }
+        querySql.append(" order by t.createtime desc ");
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
+        if (!StringUtil.isEmpty(searchkey)) {
+            query.setParameter("str", "%" + searchkey.trim() + "%");
+            countQuery.setParameter("str", "%" + searchkey.trim() + "%");
+        }
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(DiscountRuleBindShowBean.class));
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize); //分页显示
+        List<DiscountRuleBindShowBean> list = query.getResultList();
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+
+    @Override
+    public TDiscountDevbind getDiscountDevbindById(String id) {
+        if (!StringUtil.isEmpty(id)) {
+            return discountDevbindDao.getDiscountDevbindById(id.trim());
+        }
+        return null;
+    }
+
+    @Override
+    public boolean deleteDiscountDevbind(TDiscountDevbind bind) {
+        if (null != bind) {
+            discountDevbindDao.delete(bind);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public PageResult<DevparaBinddevShowBean> searchRuleBindDevices(Integer devgroupid, String searchkey, int ruleid) {
+        List<Integer> chirdGroupids = null;
+        if (null != devgroupid) {
+            Query chirdGroupQuery = entityManager.createNativeQuery(" WITH  RECURSIVE  r  AS ( " +
+                    " SELECT * FROM tb_devicegroup WHERE devgroupid = :gid " +
+                    " union ALL " +
+                    " SELECT a.* FROM tb_devicegroup a, r WHERE a.pid = r.devgroupid ) " +
+                    " SELECT devgroupid FROM r ORDER BY devgroupid ");
+            chirdGroupQuery.setParameter("gid", devgroupid.intValue());
+            chirdGroupids = chirdGroupQuery.getResultList(); //递归查询所有的子节点
+        }
+
+        StringBuffer sql = new StringBuffer("select t.id as deviceid,t.devicename,t.devphyid,t.devgroupid,a.groupname as devgroupname " +
+                " from TB_DEVICE t left join TB_DEVICEGROUP a on t.devgroupid=a.devgroupid " +
+                " left join TB_DISCOUNT_DEVBIND b on t.id=b.deviceid and b.ruleid=:rlid where b.id is null and t.state=1 ");
+        if (!StringUtil.isEmpty(chirdGroupids)) {
+            sql.append(" and t.devgroupid in (" + StringUtils.join(chirdGroupids.toArray(), ",") + ") ");
+        }
+        if (!StringUtil.isEmpty(searchkey)) {
+            sql.append(" and (t.devicename like :str or t.devphyid like :str) ");
+        }
+        sql.append(" order by t.id ");
+        Query query = entityManager.createNativeQuery(sql.toString());
+        if (!StringUtil.isEmpty(searchkey)) {
+            query.setParameter("str", "%" + searchkey.trim() + "%");
+        }
+        query.setParameter("rlid", ruleid);
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(DevparaBinddevShowBean.class));
+        List<DevparaBinddevShowBean> list = query.getResultList();
+        return new PageResult<>(list);
+    }
+
+    @Override
+    public boolean saveRuleBindDevices(int ruleid, List<Integer> deviceIds, 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("所选餐补规则状态异常");
+        }
+
+        for (Integer id : deviceIds) {
+            TDevice device = deviceDao.findTDeviceById(id);
+            if (null == device) {
+                throw new WebCheckException("终端编号为[" + id + "]的设备不存在");
+            } else if (1 != device.getState()) {
+                throw new WebCheckException("终端编号为[" + id + "]的设备状态异常");
+            }
+
+            TDiscountDevbind bind = new TDiscountDevbind();
+            bind.setRuleid(rule.getRuleid());
+            bind.setDeviceid(device.getId());
+            bind.setCreateOperid(oper == null ? null : oper.getOperid());
+            bind.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
+            discountDevbindDao.save(bind);
+        }
+        return true;
+    }
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/OfflineTransDtlServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/OfflineTransDtlServiceImpl.java
index a21021e..4ba2770 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/OfflineTransDtlServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/OfflineTransDtlServiceImpl.java
@@ -86,21 +86,28 @@
             transDtlDao.save(dtl);
             return null;
         }
-
-        TOfflineTransDtl targetDtl=transDtlDao.findById(dtl.getBillno()).get();
-       
+        TOfflineTransDtl targetDtl=null;
+        Optional<TOfflineTransDtl> odtl=transDtlDao.findById(dtl.getBillno());
+        if(odtl.isPresent()){
+            targetDtl=odtl.get();
+        }else{
+            targetDtl=new TOfflineTransDtl();
+        }
+        Integer osqlno=targetDtl.getTermsqlno();
         TOfflineTransDtl revDtl=new TOfflineTransDtl();
         BeanUtils.copyProperties(targetDtl,revDtl);
         revDtl.setBillno(systemUtilService.getRefno());
         revDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
-        revDtl.setAccdate(DateUtil.getNow("yyyyMMdd"));
-        revDtl.setAcctime(DateUtil.getNow("HHmmss"));
+        revDtl.setTransdate(DateUtil.getNow("yyyyMMdd"));
+        revDtl.setTranstime(DateUtil.getNow("HHmmss"));
         revDtl.setRevbillno(dtl.getBillno());
+        revDtl.setTermsqlno(dtl.getTermsqlno());
         revDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
         revDtl.setAmount(targetDtl.getAmount()*-1.00);
         transDtlDao.save(revDtl);
-        targetDtl.setRevflag(1);
-        transDtlDao.save(targetDtl);
+        TOfflineTransDtl offlineTransDtl=odtl.get();
+        offlineTransDtl.setRevflag(1);
+        transDtlDao.save(offlineTransDtl);
         return JsonResult.ok("操作成功");
     }
 
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 add5d95..e004451 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
@@ -33,10 +33,7 @@
 import javax.persistence.criteria.Root;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Service
 public class TransDtlServiceImpl implements TransDtlService {
@@ -158,10 +155,15 @@
 
     @Override
     public JsonResult revertTransdtl(TTransDtl dtl) {
-        TTransDtl targetDtl=transDtlDao.findById(dtl.getBillno()).get();
+        TTransDtl targetDtl=null;
+        Optional<TTransDtl> odtl=transDtlDao.findById(dtl.getBillno());
+        if(odtl.isPresent()){
+            targetDtl=odtl.get();
+        }
         if(null==targetDtl){
             return JsonResult.error("未查询到目标流水");
         }
+        Integer otermsqlno=targetDtl.getTermsqlno();
         TTransDtl revDtl=new TTransDtl();
         BeanUtils.copyProperties(targetDtl,revDtl);
         revDtl.setBillno(systemUtilService.getRefno());
@@ -175,10 +177,12 @@
         revDtl.setRevbillno(dtl.getBillno());
         revDtl.setAttr1(dtl.getAttr1());
         revDtl.setStatus(dtl.getStatus());
+        revDtl.setTermsqlno(dtl.getTermsqlno());
         revDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
         revDtl.setAmount(targetDtl.getAmount()*-1.00);
         transDtlDao.save(revDtl);
         targetDtl.setRevflag(1);
+        targetDtl.setTermsqlno(otermsqlno);
         transDtlDao.save(targetDtl);
         return JsonResult.ok("操作成功");
     }
@@ -207,7 +211,7 @@
         if(!StringUtil.isEmpty(list)){
             AmountCountBean acb = list.get(0);
             ManageFeeAmtBean bean = new ManageFeeAmtBean();
-            bean.setManagefeecnt(acb.getTotalcnt());
+            bean.setManagefeecnt(acb.getTotalcnt().longValue());
             bean.setManagefeeamt(acb.getTotalamt() == null ? 0 : Math.round(acb.getTotalamt() * 100));
             return bean;
         }
@@ -228,7 +232,7 @@
         if (!StringUtil.isEmpty(list)) {
             AmountCountBean acb = list.get(0);
             SalesAmtBean bean = new SalesAmtBean();
-            bean.setSalescnt(acb.getTotalcnt());
+            bean.setSalescnt(acb.getTotalcnt().longValue());
             bean.setSalesamt(acb.getTotalamt() == null ? 0 : Math.round(acb.getTotalamt() * 100));
             return bean;
         }
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 2e222d2..c555d6c 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -28,7 +28,7 @@
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('max_offline_days', 1, '90', '0', '脱机使用最大天数 ([1-90] 单位:天)', '7', 'N');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('max_pay_cnt', 1, '999999', '1', '卡最大使用次数 ([1-999999])', '65535', 'N');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('min_cardbal', 1, '99999', '0', '最小卡余额 ([0-99999] 单位:分)', '1', 'N');
-INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('offline_flag', 1, NULL, NULL, '脱机消费时限开关 (0-关闭， 1-开启)', '0', 'B');
+INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('offline_flag', 1, NULL, NULL, '脱机消费时限开关 (0-关闭， 1-开启)', '1', 'B');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('once_limit_amt', 1, NULL, NULL, '单笔消费限额 ([1-9999] 单位:分)', '1000', 'N');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('return_flag', 1, NULL, NULL, '消费撤销开关 (0-关闭， 1-开启)', '1', 'B');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('timeout', 1, '9999', '10', '超时时间 ([10-9999] 单位:秒)', '90', 'N');
@@ -269,6 +269,17 @@
 INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f72009a', 90, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6bff66af016bff683f73009b', 88, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
+INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb14005f', 33, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150061', 39, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150062', 34, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150063', 40, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150064', 37, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150065', 36, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbc8fa4016cbc91eb150066', 35, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+INSERT INTO "tb_permission"(id,resid,role_func_id,roleid) VALUES ('297e0a7e6cbca060016cbca3a983006a', 27, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+
+
+
 
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (4, '1', 4, '添加功能', '/function/add');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (5, '', 4, '添加父功能', '/function/loadadd');
@@ -351,10 +362,10 @@
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (88, '', 30, '查询', '/transdtlrev/index');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (89, '', 30, '加载冲正页面', '/transdtlrev/loadrevert');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (90, '', 30, '冲正', '/transdtlrev/revert');
-INSERT INTO "tb_resource"(id,code,function_id,name,uri) VALUES 91, '', 1, '加载添加', '/custtype/loadadd');
-INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (92, '', 1, '添加', '/custtype/add');
-INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (93, '', 1, '修改', '/custtype/update');
-INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (94, '', 1, '删除', '/custtype/delete');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (91, '', 1, '查询', '/custtype/index');
+--INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (92, '', 1, '添加', '/custtype/add');
+--INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (93, '', 1, '修改', '/custtype/update');
+--INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (94, '', 1, '删除', '/custtype/delete');
 
 INSERT INTO "tb_role" (roleid,createtime,editflag,lastsaved,rolecode,roledesc,rolename) VALUES ('d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '20190101000000', 0, '', 'ROLE_ADMIN', '超级管理员', '超级管理员');
 INSERT INTO "tb_role" (roleid,createtime,editflag,lastsaved,rolecode,roledesc,rolename) VALUES ('2c9cab836a8af5d5016a8af6ece20000', '20190506102639', 1, '', 'ROLE_ADMIN', '系统管理员', '系统管理员');
diff --git a/src/main/resources/static/custom/module/admin.js b/src/main/resources/static/custom/module/admin.js
index e15cfdf..7f03260 100755
--- a/src/main/resources/static/custom/module/admin.js
+++ b/src/main/resources/static/custom/module/admin.js
@@ -212,7 +212,7 @@
         },
         formatDate:function (str) {
             if (str == null || str == "") {
-                return;
+                return '';
             }
             switch (str.length) {
                 case 8:
diff --git a/src/main/resources/templates/restaurant/devpara/devpara.html b/src/main/resources/templates/restaurant/devpara/devpara.html
index 5525d8d..d460615 100644
--- a/src/main/resources/templates/restaurant/devpara/devpara.html
+++ b/src/main/resources/templates/restaurant/devpara/devpara.html
@@ -51,10 +51,7 @@
                         }},
                     {
                         field: 'lastsaved', title: '更新时间', align: 'center', templet: function (d) {
-                            if(d.lastsaved!=null){
-                                return admin.formatDate(d.lastsaved);
-                            }
-                           return '';
+                            return admin.formatDate(d.lastsaved);
                         }
                     },
                     {align: 'center', title: '操作', width: 250, toolbar: '#devparagroup-table-bar',  fixed: 'right'}
diff --git a/src/main/resources/templates/restaurant/transdtlrev/index.html b/src/main/resources/templates/restaurant/transdtlrev/index.html
index 6a0dc4b..6b2d2c0 100644
--- a/src/main/resources/templates/restaurant/transdtlrev/index.html
+++ b/src/main/resources/templates/restaurant/transdtlrev/index.html
@@ -143,7 +143,7 @@
         });
 
         let showModel = function (data) {
-            let title = data ? '修改设备' : '添加设备';
+            let title = data ? '冲正' : '冲正';
             admin.putTempData('t_dtl', data);
             admin.popupCenter({
                 title: title,
