diff --git a/sql/view.sql b/sql/view.sql
new file mode 100644
index 0000000..34c3df8
--- /dev/null
+++ b/sql/view.sql
@@ -0,0 +1,12 @@
+ create or replace view v_transdtl as
+ SELECT t.transdate,t.transtime,t.billno,'' AS tradeno,'' AS authno,t.custname,c.bankcardno,d.rulename,
+t1.deptname,t.termid,s.shopname,'' AS searchno,t.amount,'' AS serviceamt,t.transtype,
+t.status,'T+1' AS cleartype,'普通' AS servicetype,0 AS revertamt,t.revbillno,
+substr((t.revbillno), 0, 9) AS revtransdate FROM ((((tb_transdtl t
+ JOIN tb_card c ON (((t.cardno) = (c.cardno))))
+ JOIN tb_discount_rule d ON ((t.ruleid = d.ruleid)))
+ JOIN ( SELECT c_1.custid,
+        p.deptname
+FROM (tb_customer c_1
+JOIN tb_dept p ON (((c_1.deptcode) = (p.deptcode))))) t1 ON (((t.custid) = (t1.custid))))
+ JOIN tb_shopsettlement s ON (((t.shopid) = (s.shopid))));
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorQueryLimitDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorQueryLimitDao.java
new file mode 100644
index 0000000..93da8a4
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorQueryLimitDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface OperatorQueryLimitDao extends JpaRepository<TOperatorQueryLimit, String> {
+    TOperatorQueryLimit findByOpercode(String opercode);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
index 3619998..38fdcc9 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.supwisdom.dlpay.framework.dao.OperRoleDao;
 import com.supwisdom.dlpay.framework.dao.OperatorDao;
+import com.supwisdom.dlpay.framework.dao.OperatorQueryLimitDao;
 import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.service.OperatorDetailService;
 import com.supwisdom.dlpay.framework.util.StringUtil;
@@ -20,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 
 @Service
 public class OperatorDetailServiceImpl implements OperatorDetailService {
@@ -28,6 +30,8 @@
   @Autowired
   private OperRoleDao operRoleDao;
   @Autowired
+  private OperatorQueryLimitDao operatorQueryLimitDao;
+  @Autowired
   private MultiTenantService multiTenantService;
 
   @Override
@@ -64,4 +68,6 @@
     oper.setAuthorities(authorities);
     return oper;
   }
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/TermReportSearchBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/TermReportSearchBean.java
new file mode 100644
index 0000000..27df945
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/TermReportSearchBean.java
@@ -0,0 +1,62 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TermReportSearchBean {
+  private Integer ruleid;
+  private String shopid;
+  private String shopname;
+  private String startdate;
+  private String enddate;
+  private Integer devgroupid;
+
+  public Integer getRuleid() {
+    return ruleid;
+  }
+
+  public void setRuleid(Integer ruleid) {
+    this.ruleid = ruleid;
+  }
+
+  public String getShopid() {
+    return shopid;
+  }
+
+  public void setShopid(String shopid) {
+    this.shopid = shopid;
+  }
+
+  public String getShopname() {
+    return shopname;
+  }
+
+  public void setShopname(String shopname) {
+    this.shopname = shopname;
+  }
+
+  public String getStartdate() {
+    return startdate;
+  }
+
+  public void setStartdate(String startdate) {
+    this.startdate = startdate;
+  }
+
+  public String getEnddate() {
+    return enddate;
+  }
+
+  public void setEnddate(String enddate) {
+    this.enddate = enddate;
+  }
+
+
+  public Integer getDevgroupid() {
+    return devgroupid;
+  }
+
+  public void setDevgroupid(Integer devgroupid) {
+    this.devgroupid = devgroupid;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/TermReportShowBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/TermReportShowBean.java
new file mode 100644
index 0000000..d94958f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/TermReportShowBean.java
@@ -0,0 +1,173 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+
+public class TermReportShowBean {
+    private Integer termid;
+
+    //普通
+    private Double b_normalamt; //早餐
+    private Integer b_normalcnt;//早餐
+    private Double l_normalamt; //午餐
+    private Integer l_normalcnt;//午餐
+    private Double d_normalamt; //晚餐
+    private Integer d_normalcnt;//晚餐
+
+    //折扣
+    private Double b_discountamt; //早餐
+    private Integer b_discountcnt;//早餐
+    private Double l_discountamt; //午餐
+    private Integer l_discountcnt;//午餐
+    private Double d_discountamt; //晚餐
+    private Integer d_discountcnt;//晚餐
+
+    private Integer totdiscountcnt;//折扣总数
+    private Double totdiscountamt;//折扣总金额
+    private Double totfeetamt;//折扣金额
+
+    private Integer totnormalcnt;//普通总数
+    private Double totnormalamt;//普通总金额
+
+    public Integer getTermid() {
+        return termid;
+    }
+
+    public void setTermid(Integer termid) {
+        this.termid = termid;
+    }
+
+    public Double getB_normalamt() {
+        return b_normalamt;
+    }
+
+    public void setB_normalamt(Double b_normalamt) {
+        this.b_normalamt = b_normalamt;
+    }
+
+    public Integer getB_normalcnt() {
+        return b_normalcnt;
+    }
+
+    public void setB_normalcnt(Integer b_normalcnt) {
+        this.b_normalcnt = b_normalcnt;
+    }
+
+    public Double getL_normalamt() {
+        return l_normalamt;
+    }
+
+    public void setL_normalamt(Double l_normalamt) {
+        this.l_normalamt = l_normalamt;
+    }
+
+    public Integer getL_normalcnt() {
+        return l_normalcnt;
+    }
+
+    public void setL_normalcnt(Integer l_normalcnt) {
+        this.l_normalcnt = l_normalcnt;
+    }
+
+    public Double getD_normalamt() {
+        return d_normalamt;
+    }
+
+    public void setD_normalamt(Double d_normalamt) {
+        this.d_normalamt = d_normalamt;
+    }
+
+    public Integer getD_normalcnt() {
+        return d_normalcnt;
+    }
+
+    public void setD_normalcnt(Integer d_normalcnt) {
+        this.d_normalcnt = d_normalcnt;
+    }
+
+    public Double getB_discountamt() {
+        return b_discountamt;
+    }
+
+    public void setB_discountamt(Double b_discountamt) {
+        this.b_discountamt = b_discountamt;
+    }
+
+    public Integer getB_discountcnt() {
+        return b_discountcnt;
+    }
+
+    public void setB_discountcnt(Integer b_discountcnt) {
+        this.b_discountcnt = b_discountcnt;
+    }
+
+    public Double getL_discountamt() {
+        return l_discountamt;
+    }
+
+    public void setL_discountamt(Double l_discountamt) {
+        this.l_discountamt = l_discountamt;
+    }
+
+    public Integer getL_discountcnt() {
+        return l_discountcnt;
+    }
+
+    public void setL_discountcnt(Integer l_discountcnt) {
+        this.l_discountcnt = l_discountcnt;
+    }
+
+    public Double getD_discountamt() {
+        return d_discountamt;
+    }
+
+    public void setD_discountamt(Double d_discountamt) {
+        this.d_discountamt = d_discountamt;
+    }
+
+    public Integer getD_discountcnt() {
+        return d_discountcnt;
+    }
+
+    public void setD_discountcnt(Integer d_discountcnt) {
+        this.d_discountcnt = d_discountcnt;
+    }
+
+    public Integer getTotdiscountcnt() {
+        return totdiscountcnt;
+    }
+
+    public void setTotdiscountcnt(Integer totdiscountcnt) {
+        this.totdiscountcnt = totdiscountcnt;
+    }
+
+    public Double getTotdiscountamt() {
+        return totdiscountamt;
+    }
+
+    public void setTotdiscountamt(Double totdiscountamt) {
+        this.totdiscountamt = totdiscountamt;
+    }
+
+    public Double getTotfeetamt() {
+        return totfeetamt;
+    }
+
+    public void setTotfeetamt(Double totfeetamt) {
+        this.totfeetamt = totfeetamt;
+    }
+
+    public Integer getTotnormalcnt() {
+        return totnormalcnt;
+    }
+
+    public void setTotnormalcnt(Integer totnormalcnt) {
+        this.totnormalcnt = totnormalcnt;
+    }
+
+    public Double getTotnormalamt() {
+        return totnormalamt;
+    }
+
+    public void setTotnormalamt(Double totnormalamt) {
+        this.totnormalamt = totnormalamt;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/TransDtlSearchBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/TransDtlSearchBean.java
index 4f63744..c113c6e 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/TransDtlSearchBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/TransDtlSearchBean.java
@@ -12,6 +12,7 @@
     private String status;
     private String shopid;
     private String accdate;
+    private String opercode;
 
     public String getAccdate() {
         return accdate;
@@ -77,16 +78,11 @@
         this.shopid = shopid;
     }
 
-    @Override
-    public String toString() {
-        return "TransDtlSearchBean+++++{" +
-                "billno='" + billno + '\'' +
-                ", custname='" + custname + '\'' +
-                ", startdate='" + startdate + '\'' +
-                ", enddate='" + enddate + '\'' +
-                ", termid=" + termid +
-                ", status=" + status +
-                ", shopid=" + shopid +
-                '}';
+    public String getOpercode() {
+        return opercode;
+    }
+
+    public void setOpercode(String opercode) {
+        this.opercode = opercode;
     }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/VTransDtl.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/VTransDtl.java
new file mode 100644
index 0000000..9aad264
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/VTransDtl.java
@@ -0,0 +1,230 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+public class VTransDtl {
+
+  private String billno;
+  private String custname;
+  private String authno;
+  private String tradeno;
+  private Double amount;
+  private String transdate;
+  private String transtime;
+  private String deptname;
+  private Integer termid;
+  private String status;
+  private Integer revflag;
+  private String transtype;
+  private String rulename;
+  private String shopid;
+  private String shopname;
+  private String revbillno;
+  private Integer revertamt;
+  private String cleartype;
+  private String servicetype;
+  private String searchno;
+  private String transmode;
+  private Integer custtype;
+  private String revtransdate;
+  private String bankcardno;
+  private String serviceamt;
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  public String getCustname() {
+    return custname;
+  }
+
+  public void setCustname(String custname) {
+    this.custname = custname;
+  }
+
+  public String getAuthno() {
+    return authno;
+  }
+
+  public void setAuthno(String authno) {
+    this.authno = authno;
+  }
+
+  public String getTradeno() {
+    return tradeno;
+  }
+
+  public void setTradeno(String tradeno) {
+    this.tradeno = tradeno;
+  }
+
+  public Double getAmount() {
+    return amount;
+  }
+
+  public String getShopid() {
+    return shopid;
+  }
+
+  public void setShopid(String shopid) {
+    this.shopid = shopid;
+  }
+
+  public String getRulename() {
+    return rulename;
+  }
+
+  public void setRulename(String rulename) {
+    this.rulename = rulename;
+  }
+
+  public void setAmount(Double amount) {
+    this.amount = amount;
+  }
+
+  public String getTransdate() {
+    return transdate;
+  }
+
+  public void setTransdate(String transdate) {
+    this.transdate = transdate;
+  }
+
+  public String getTranstime() {
+    return transtime;
+  }
+
+  public void setTranstime(String transtime) {
+    this.transtime = transtime;
+  }
+
+  public String getServiceamt() {
+    return serviceamt;
+  }
+
+  public void setServiceamt(String serviceamt) {
+    this.serviceamt = serviceamt;
+  }
+
+  public String getDeptname() {
+    return deptname;
+  }
+
+  public void setDeptname(String deptname) {
+    this.deptname = deptname;
+  }
+
+  public Integer getTermid() {
+    return termid;
+  }
+
+  public void setTermid(Integer termid) {
+    this.termid = termid;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public Integer getRevflag() {
+    return revflag;
+  }
+
+  public void setRevflag(Integer revflag) {
+    this.revflag = revflag;
+  }
+
+  public String getTranstype() {
+    return transtype;
+  }
+
+  public void setTranstype(String transtype) {
+    this.transtype = transtype;
+  }
+
+  public String getShopname() {
+    return shopname;
+  }
+
+  public void setShopname(String shopname) {
+    this.shopname = shopname;
+  }
+
+  public String getRevbillno() {
+    return revbillno;
+  }
+
+  public void setRevbillno(String revbillno) {
+    this.revbillno = revbillno;
+  }
+
+  public Integer getRevertamt() {
+    return revertamt;
+  }
+
+  public void setRevertamt(Integer revertamt) {
+    this.revertamt = revertamt;
+  }
+
+  public String getCleartype() {
+    return cleartype;
+  }
+
+  public void setCleartype(String cleartype) {
+    this.cleartype = cleartype;
+  }
+
+  public String getServicetype() {
+    return servicetype;
+  }
+
+  public void setServicetype(String servicetype) {
+    this.servicetype = servicetype;
+  }
+
+  public String getSearchno() {
+    return searchno;
+  }
+
+  public void setSearchno(String searchno) {
+    this.searchno = searchno;
+  }
+
+  public String getTransmode() {
+    return transmode;
+  }
+
+  public void setTransmode(String transmode) {
+    this.transmode = transmode;
+  }
+
+  public Integer getCusttype() {
+    return custtype;
+  }
+
+  public void setCusttype(Integer custtype) {
+    this.custtype = custtype;
+  }
+
+  public String getRevtransdate() {
+    return revtransdate;
+  }
+
+  public void setRevtransdate(String revtransdate) {
+    this.revtransdate = revtransdate;
+  }
+
+  public String getBankcardno() {
+    return bankcardno;
+  }
+
+  public void setBankcardno(String bankcardno) {
+    this.bankcardno = bankcardno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CusttypeReportController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CusttypeReportController.java
index 2018868..5216c49 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CusttypeReportController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CusttypeReportController.java
@@ -8,6 +8,8 @@
 import com.supwisdom.dlpay.restaurant.bean.DailyReportSearchBean;
 import com.supwisdom.dlpay.restaurant.service.CusttypeReportService;
 import com.supwisdom.dlpay.restaurant.service.StatementReportService;
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
+import com.supwisdom.dlpay.system.service.OperatorService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.security.core.userdetails.UserDetails;
@@ -32,8 +34,9 @@
     private CusttypeReportService custtypeReportService;
     @Autowired
     private StatementReportService statementReportService;
+    @Autowired
+    private OperatorService operatorService;
 
-    //TODO
     @RequestMapping("/index")
     public String indexView(
             @ModelAttribute("searchBean") DailyReportSearchBean searchBean,
@@ -43,11 +46,16 @@
         String maxdate = DateUtil.reformatDatetime(settledate, "yyyyMMdd", "yyyy-MM-dd");
         searchBean.setStartdate(settledate);
         searchBean.setEnddate(settledate);
-        model.addAttribute("showlist", custtypeReportService.getCusttypeReportSearchData(searchBean));
+        TOperator oper = (TOperator) operUser;
+        TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+        if(null!=limit){
+            model.addAttribute("devgroupid",limit.getDevgroupid());
+            searchBean.setGroupid(limit.getDevgroupid());
+        }
 
+        model.addAttribute("showlist", custtypeReportService.getCusttypeReportSearchData(searchBean));
         model.addAttribute("maxdate", maxdate);
 
-        TOperator oper = (TOperator) operUser;
         model.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
 
         return "restaurant/custtypereport/index";
@@ -63,7 +71,10 @@
 
             TOperator oper = (TOperator) operUser;
             map.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
-
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+            if(null!=limit){
+                searchBean.setGroupid(limit.getDevgroupid());
+            }
             List<CusttypeReportShowBean> bean = custtypeReportService.getCusttypeReportSearchData(searchBean);
 
             map.addAttribute("showlist",bean);
@@ -79,8 +90,13 @@
                                     @AuthenticationPrincipal UserDetails operUser,
                                     HttpServletRequest request, HttpServletResponse response, ModelMap map){
         try {
-            List<CusttypeReportShowBean> datalist = custtypeReportService.getCusttypeReportSearchData(searchBean);
             TOperator oper = (TOperator) operUser;
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+            if(null!=limit){
+                searchBean.setGroupid(limit.getDevgroupid());
+            }
+            List<CusttypeReportShowBean> datalist = custtypeReportService.getCusttypeReportSearchData(searchBean);
+
             String filename="客户类别消费报表";
             custtypeReportService.doCreateCusttypeReportExcel(response, datalist, searchBean, filename, oper);
         } catch (Exception e) {
@@ -96,6 +112,10 @@
             map.addAttribute("showlist", custtypeReportService.getCusttypeReportSearchData(searchBean));
 
             TOperator oper = statementReportService.getOperatorByOpercode(opercode);
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+            if(null!=limit){
+                searchBean.setGroupid(limit.getDevgroupid());
+            }
             map.addAttribute("opername", oper == null ? "unknow" : oper.getOpername());
             map.addAttribute("period", custtypeReportService.getCusttypeReportSearchPeriod(searchBean));
             map.addAttribute("printdatetime",DateUtil.reformatDatetime(systemUtilService.getSysdatetime().getHostdatetime(),DateUtil.DATETIME_FMT,"yyyy-MM-dd HH:mm:ss"));
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/StatementReportController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/StatementReportController.java
index bc4b48b..01a4ca3 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/StatementReportController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/StatementReportController.java
@@ -12,6 +12,8 @@
 import com.supwisdom.dlpay.restaurant.service.StatementReportService;
 
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
+import com.supwisdom.dlpay.system.service.OperatorService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -31,6 +33,8 @@
   private StatementReportService statementReportService;
   @Autowired
   private SystemUtilService systemUtilService;
+  @Autowired
+  private OperatorService operatorService;
 
   @GetMapping("/laborfee")
   public String LaborfeeIndex(@ModelAttribute("searchBean") LaborfeeSearchBean searchBean,
@@ -47,9 +51,16 @@
       searchBean.setEnddate(statdate);
       searchBean.setDatetype("days");
       searchBean.setYearmonth(maxmonth);
+      TOperator oper = (TOperator) operUser;
+      TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+      if(null!=limit){
+        map.addAttribute("devgroupid",limit.getDevgroupid());
+        searchBean.setGroupid(limit.getDevgroupid());
+      }
+
       map.addAttribute("showlist", statementReportService.getLaborfeeSearchData(searchBean));
 
-      TOperator oper = (TOperator) operUser;
+
       map.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
 
     } catch (Exception e) {
@@ -66,6 +77,11 @@
                                ModelMap map) {
     try {
       TOperator oper = (TOperator) operUser;
+      TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+      if(null!=limit){
+        map.addAttribute("devgroupid",limit.getDevgroupid());
+        searchBean.setGroupid(limit.getDevgroupid());
+      }
       map.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
 
       map.addAttribute("showlist", statementReportService.getLaborfeeSearchData(searchBean));
@@ -82,7 +98,12 @@
                                   HttpServletRequest request, HttpServletResponse response, ModelMap map){
     try {
       List<LaborfeeShowBean> datalist = statementReportService.getLaborfeeSearchData(searchBean);
+
       TOperator oper = (TOperator) operUser;
+      TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+      if(null!=limit){
+        searchBean.setGroupid(limit.getDevgroupid());
+      }
       String filename="商户劳务费报表";
       statementReportService.doCreateLaborfeeExcel(response, datalist, searchBean, filename, oper);
     } catch (Exception e) {
@@ -100,6 +121,10 @@
       map.addAttribute("showlist", statementReportService.getLaborfeeSearchData(searchBean));
 
       TOperator oper = statementReportService.getOperatorByOpercode(opercode);
+      TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+      if(null!=limit){
+        searchBean.setGroupid(limit.getDevgroupid());
+      }
       map.addAttribute("opername", oper == null ? "unknow" : oper.getOpername());
       map.addAttribute("period", statementReportService.getLaborfeeSearchPeriod(searchBean));
       map.addAttribute("printdatetime",DateUtil.reformatDatetime(systemUtilService.getSysdatetime().getHostdatetime(),DateUtil.DATETIME_FMT,"yyyy-MM-dd HH:mm:ss"));
@@ -126,9 +151,15 @@
       searchBean.setEnddate(statdate);
       searchBean.setDatetype("days");
       searchBean.setYearmonth(maxmonth);
+      TOperator oper = (TOperator) operUser;
+      TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+      if(null!=limit){
+        map.addAttribute("devgroupid",limit.getDevgroupid());
+        searchBean.setGroupid(limit.getDevgroupid());
+      }
       map.addAttribute("showlist", statementReportService.getLaborCountSearchData(searchBean));
 
-      TOperator oper = (TOperator) operUser;
+
       map.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
     } catch (Exception e) {
       e.printStackTrace();
@@ -145,7 +176,10 @@
     try {
       TOperator oper = (TOperator) operUser;
       map.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
-
+      TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+      if(null!=limit){
+        searchBean.setGroupid(limit.getDevgroupid());
+      }
       map.addAttribute("showlist", statementReportService.getLaborCountSearchData(searchBean));
     } catch (Exception e) {
       e.printStackTrace();
@@ -162,6 +196,10 @@
       List<LaborCountShowBean> datalist = statementReportService.getLaborCountSearchData(searchBean);
       TOperator oper = (TOperator) operUser;
       String filename="商户劳务费人次统计表";
+      TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+      if(null!=limit){
+        searchBean.setGroupid(limit.getDevgroupid());
+      }
       statementReportService.doCreateLaborCountExcel(response, datalist, searchBean, filename, oper);
     } catch (Exception e) {
       e.printStackTrace();
@@ -175,6 +213,10 @@
       map.addAttribute("showlist", statementReportService.getLaborCountSearchData(searchBean));
 
       TOperator oper = statementReportService.getOperatorByOpercode(opercode);
+      TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+      if(null!=limit){
+        searchBean.setGroupid(limit.getDevgroupid());
+      }
       map.addAttribute("opername", oper == null ? "unknow" : oper.getOpername());
       map.addAttribute("period", statementReportService.getLaborfeeSearchPeriod(searchBean));
       map.addAttribute("printdatetime",DateUtil.reformatDatetime(systemUtilService.getSysdatetime().getHostdatetime(),DateUtil.DATETIME_FMT,"yyyy-MM-dd HH:mm:ss"));
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TermReportController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TermReportController.java
new file mode 100644
index 0000000..0513687
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TermReportController.java
@@ -0,0 +1,126 @@
+package com.supwisdom.dlpay.restaurant.controller;
+
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.restaurant.bean.DailyReportSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.TermReportSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.TermReportShowBean;
+import com.supwisdom.dlpay.restaurant.service.TermReportService;
+import com.supwisdom.dlpay.restaurant.service.StatementReportService;
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
+import com.supwisdom.dlpay.system.service.OperatorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Controller
+@RequestMapping("/termreport")
+public class TermReportController {
+
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private TermReportService termReportService;
+    @Autowired
+    private StatementReportService statementReportService;
+    @Autowired
+    private OperatorService operatorService;
+
+    @RequestMapping("/index")
+    public String indexView(
+            @ModelAttribute("searchBean") TermReportSearchBean searchBean,
+            @AuthenticationPrincipal UserDetails operUser,
+            ModelMap model) {
+        String settledate = statementReportService.getMaxStatementDate();
+        String maxdate = DateUtil.reformatDatetime(settledate, "yyyyMMdd", "yyyy-MM-dd");
+        searchBean.setStartdate(settledate);
+        searchBean.setEnddate(settledate);
+        TOperator oper = (TOperator) operUser;
+        TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+        if(null!=limit){
+            model.addAttribute("devgroupid",limit.getDevgroupid());
+            searchBean.setDevgroupid(limit.getDevgroupid());
+        }
+        model.addAttribute("showlist", termReportService.getTermReportSearchData(searchBean));
+        model.addAttribute("maxdate", maxdate);
+        model.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
+
+        return "restaurant/termreport/index";
+    }
+
+    @RequestMapping("/termreportlist")
+    public String getDataList(
+            @ModelAttribute("searchBean") TermReportSearchBean searchBean,
+            @AuthenticationPrincipal UserDetails operUser,
+            ModelMap map) {
+        try {
+
+            TOperator oper = (TOperator) operUser;
+            map.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+            if(null!=limit){
+                searchBean.setDevgroupid(limit.getDevgroupid());
+            }
+            List<TermReportShowBean> bean = termReportService.getTermReportSearchData(searchBean);
+
+            map.addAttribute("showlist",bean);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "restaurant/termreport/index::termreportTable";
+    }
+
+    @GetMapping("/excelexport")
+    public void excelExport(@ModelAttribute("searchBean") TermReportSearchBean searchBean,
+                            @AuthenticationPrincipal UserDetails operUser,
+                            HttpServletRequest request, HttpServletResponse response, ModelMap map){
+        try {
+            TOperator oper = (TOperator) operUser;
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+            if(null!=limit){
+                searchBean.setDevgroupid(limit.getDevgroupid());
+            }
+            List<TermReportShowBean> datalist = termReportService.getTermReportSearchData(searchBean);
+            String filename="客户类别消费报表";
+            termReportService.doCreateTermReportExcel(response, datalist, searchBean, filename, oper);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @GetMapping("/print/printtermreport")
+    public String print(@ModelAttribute("searchBean") TermReportSearchBean searchBean,
+                        @RequestParam(value = "opercode",required = false) String opercode, ModelMap map) {
+        try {
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(opercode);
+            if(null!=limit){
+                searchBean.setDevgroupid(limit.getDevgroupid());
+            }
+            map.addAttribute("showlist", termReportService.getTermReportSearchData(searchBean));
+
+            TOperator oper = statementReportService.getOperatorByOpercode(opercode);
+            map.addAttribute("opername", oper == null ? "unknow" : oper.getOpername());
+            map.addAttribute("period", termReportService.getTermReportSearchPeriod(searchBean));
+            map.addAttribute("printdatetime",DateUtil.reformatDatetime(systemUtilService.getSysdatetime().getHostdatetime(),DateUtil.DATETIME_FMT,"yyyy-MM-dd HH:mm:ss"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "restaurant/termreport/print/printtermreport";
+    }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransCountReportController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransCountReportController.java
index 36a2900..e060f94 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransCountReportController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransCountReportController.java
@@ -8,6 +8,8 @@
 import com.supwisdom.dlpay.restaurant.bean.TransCountShowBean;
 import com.supwisdom.dlpay.restaurant.service.StatementReportService;
 import com.supwisdom.dlpay.restaurant.service.TransCountReportService;
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
+import com.supwisdom.dlpay.system.service.OperatorService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.security.core.userdetails.UserDetails;
@@ -32,6 +34,8 @@
     private TransCountReportService transCountReportService;
     @Autowired
     private StatementReportService statementReportService;
+    @Autowired
+    private OperatorService operatorService;
 
     @RequestMapping("/index")
     public String indexView(
@@ -42,11 +46,16 @@
         String maxdate = DateUtil.reformatDatetime(settledate, "yyyyMMdd", "yyyy-MM-dd");
         searchBean.setStartdate(settledate);
         searchBean.setEnddate(settledate);
+        TOperator oper = (TOperator) operUser;
+        TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+        if(null!=limit){
+            model.addAttribute("devgroupid",limit.getDevgroupid());
+        }
+        searchBean.setGroupid(limit.getDevgroupid());
         model.addAttribute("showlist", transCountReportService.getTransCountReportSearchData(searchBean));
 
         model.addAttribute("maxdate", maxdate);
 
-        TOperator oper = (TOperator) operUser;
         model.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
 
         return "restaurant/transcountreport/index";
@@ -64,7 +73,10 @@
             map.addAttribute("opercode", oper == null ? "unknow" : oper.getOpercode());
 
             List<TransCountShowBean> bean = transCountReportService.getTransCountReportSearchData(searchBean);
-
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+            if(null!=limit){
+                searchBean.setGroupid(limit.getDevgroupid());
+            }
             map.addAttribute("showlist",bean);
 
         } catch (Exception e) {
@@ -81,6 +93,10 @@
             List<TransCountShowBean> bean = transCountReportService.getTransCountReportSearchData(searchBean);
             TOperator oper = (TOperator) operUser;
             String filename="人员消费报表";
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+            if(null!=limit){
+                searchBean.setGroupid(limit.getDevgroupid());
+            }
             transCountReportService.doCreateTransCountReportExcel(response, bean, searchBean, filename, oper);
         } catch (Exception e) {
             e.printStackTrace();
@@ -95,6 +111,10 @@
             map.addAttribute("showlist", transCountReportService.getTransCountReportSearchData(searchBean));
 
             TOperator oper = statementReportService.getOperatorByOpercode(opercode);
+            TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(oper.getOpercode());
+            if(null!=limit){
+                searchBean.setGroupid(limit.getDevgroupid());
+            }
             map.addAttribute("opername", oper == null ? "unknow" : oper.getOpername());
             map.addAttribute("period", transCountReportService.getTransCountReportSearchPeriod(searchBean));
             map.addAttribute("printdatetime",DateUtil.reformatDatetime(systemUtilService.getSysdatetime().getHostdatetime(),DateUtil.DATETIME_FMT,"yyyy-MM-dd HH:mm:ss"));
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlController.java
index 51a607c..070a261 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlController.java
@@ -3,13 +3,17 @@
 
 import com.google.gson.Gson;
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.domain.TShopSettlement;
 import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.restaurant.bean.TransDtlSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.VTransDtl;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
 import com.supwisdom.dlpay.restaurant.service.ShopSettlementService;
 import com.supwisdom.dlpay.restaurant.service.TransDtlService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
@@ -30,7 +34,7 @@
     private ShopSettlementService shopSettlementService;
 
     @RequestMapping("/index")
-    public String indexView(ModelMap model) {
+    public String index (ModelMap model) {
         List<TShopSettlement> lst = shopSettlementService.getAllShopSettlement();
         Map<String, String> map = new HashMap<>();
         for (TShopSettlement shop : lst) {
@@ -48,6 +52,27 @@
         return "restaurant/transdtl/index";
     }
 
+
+    @RequestMapping("/indexview")
+    public String indexForView(ModelMap model) {
+        List<TShopSettlement> lst = shopSettlementService.getAllShopSettlement();
+        Map<String, String> map = new HashMap<>();
+        for (TShopSettlement shop : lst) {
+            map.put(shop.getShopid(), shop.getShopname());
+        }
+        String startDate = DateUtil.getNewDay(-7, "yyyy-MM-dd");
+        String endDate = DateUtil.getNow("yyyy-MM-dd");
+
+        Gson gson = new Gson();
+        String gsonString = gson.toJson(map);
+        model.addAttribute("shoplistForSelect", lst);
+        model.addAttribute("shopList", gsonString);
+        model.addAttribute("startDate", startDate);
+        model.addAttribute("endDate", endDate);
+        return "restaurant/transdtl/indexview";
+    }
+
+
     @RequestMapping("/list")
     @ResponseBody
     public PageResult<TTransDtl> getDataList(@RequestParam("page") Integer pageNo,
@@ -58,11 +83,15 @@
                                              @RequestParam(value = "enddate", required = false) String enddate,
                                              @RequestParam(value = "billno", required = false) String billno,
                                              @RequestParam(value = "status", required = false) String status,
-                                             @RequestParam(value = "termid", required = false) Integer termid) {
+                                             @RequestParam(value = "termid", required = false) Integer termid,
+                                             @AuthenticationPrincipal UserDetails operUser) {
         try {
             if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
             if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+
             TransDtlSearchBean bean = getTransDtlSearchBean(custname, shopid, startdate, enddate, billno, status, termid);
+            TOperator operator=(TOperator)operUser;
+            bean.setOpercode(operator.getOpercode());
             bean.setPageNo(pageNo);
             bean.setPageSize(pageSize);
 
@@ -73,6 +102,34 @@
         }
     }
 
+    @RequestMapping("/listview")
+    @ResponseBody
+    public PageResult<VTransDtl> getDataListForView(@RequestParam("page") Integer pageNo,
+                                             @RequestParam("limit") Integer pageSize,
+                                             @RequestParam(value = "custname", required = false) String custname,
+                                             @RequestParam(value = "shopid", required = false) String shopid,
+                                             @RequestParam(value = "startdate", required = false) String startdate,
+                                             @RequestParam(value = "enddate", required = false) String enddate,
+                                             @RequestParam(value = "billno", required = false) String billno,
+                                             @RequestParam(value = "status", required = false) String status,
+                                             @RequestParam(value = "termid", required = false) Integer termid,
+                                             @AuthenticationPrincipal UserDetails operUser) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+
+            TransDtlSearchBean bean = getTransDtlSearchBean(custname, shopid, startdate, enddate, billno, status, termid);
+            TOperator operator=(TOperator)operUser;
+            bean.setOpercode(operator.getOpercode());
+            bean.setPageNo(pageNo);
+            bean.setPageSize(pageSize);
+
+            return transDtlService.getVTransdtlByParam(bean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
     @RequestMapping("/export")
     @ResponseBody
     public JsonResult downloadfile(@RequestParam(value = "custname", required = false) String custname,
@@ -82,12 +139,33 @@
                                    @RequestParam(value = "billno", required = false) String billno,
                                    @RequestParam(value = "status", required = false) String status,
                                    @RequestParam(value = "termid", required = false) Integer termid,
-                                   HttpServletRequest request, HttpServletResponse response) {
+                                   HttpServletRequest request, HttpServletResponse response,
+                                   @AuthenticationPrincipal UserDetails operUser) {
+
 
         TransDtlSearchBean bean = getTransDtlSearchBean(custname, shopid, startdate, enddate, billno, status, termid);
-        System.out.println(bean.toString());
+        TOperator operator=(TOperator)operUser;
+        bean.setOpercode(operator.getOpercode());
         return transDtlService.export(bean, request, response);
     }
+    @RequestMapping("/exportview")
+    @ResponseBody
+    public JsonResult downloadfileForView(@RequestParam(value = "custname", required = false) String custname,
+                                   @RequestParam(value = "shopid", required = false) String shopid,
+                                   @RequestParam(value = "startdate", required = false) String startdate,
+                                   @RequestParam(value = "enddate", required = false) String enddate,
+                                   @RequestParam(value = "billno", required = false) String billno,
+                                   @RequestParam(value = "status", required = false) String status,
+                                   @RequestParam(value = "termid", required = false) Integer termid,
+                                   HttpServletRequest request, HttpServletResponse response,
+                                   @AuthenticationPrincipal UserDetails operUser) {
+
+
+        TransDtlSearchBean bean = getTransDtlSearchBean(custname, shopid, startdate, enddate, billno, status, termid);
+        TOperator operator=(TOperator)operUser;
+        bean.setOpercode(operator.getOpercode());
+        return transDtlService.exportForView(bean, request, response);
+    }
 
     private TransDtlSearchBean getTransDtlSearchBean( String custname,  String shopid, String startdate, String enddate, String billno,String status, Integer termid) {
         TransDtlSearchBean bean = new TransDtlSearchBean();
@@ -96,6 +174,7 @@
         bean.setBillno(billno);
         bean.setStatus(status);
         bean.setShopid(shopid);
+
         if (StringUtil.isEmpty(startdate) || StringUtil.isEmpty(enddate)) {
             bean.setStartdate(DateUtil.getNewDay(-7, "yyyyMMdd"));
             bean.setEnddate(DateUtil.getNow("yyyyMMdd"));
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
index 4cc73c7..2ec1d62 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
@@ -12,6 +12,8 @@
 import com.supwisdom.dlpay.restaurant.service.WhitelistService;
 import com.supwisdom.dlpay.restaurant.service.DeviceParamService;
 import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
+import com.supwisdom.dlpay.system.service.OperatorService;
 import com.supwisdom.dlpay.system.service.ParamService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -35,6 +37,8 @@
     private WhitelistService whitelistService;
     @Autowired
     private DeviceParamService deviceParamService;
+    @Autowired
+    private OperatorService operatorService;
 
 
     @GetMapping("/whitelist/index")
@@ -320,8 +324,16 @@
 
     @GetMapping("/whitelistbind/devgrouptree")
     @ResponseBody
-    public List<TreeSelectNode> searchDevgroupTree() {
-        List<TreeSelectNode> tree = deviceParamService.getDeviceGroupSelectTree();
+    public List<TreeSelectNode> searchDevgroupTree( @AuthenticationPrincipal UserDetails operUser) {
+        TOperator operator=(TOperator)operUser;
+        TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(operator.getOpercode());
+        List<TreeSelectNode> tree;
+        if(null!=limit){
+            tree = deviceParamService.getDeviceGroupSelectTree(limit.getDevgroupid());
+        }else{
+            tree = deviceParamService.getDeviceGroupSelectTree( );
+        }
+
         return tree;
     }
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
index 067df28..fe82f95 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
@@ -32,6 +32,8 @@
 
     TDevice findByDevicename(String devicename);
 
+    @Query(value="select t.id from Tb_Device t where t.devgroupid =:id and t.state=1", nativeQuery = true)
+    List<Integer> getIdByDevgroupid(@Param("id")Integer deviceid);
 
     TDevice findTDeviceById(Integer id);
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceGroupDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceGroupDao.java
index 64d5678..b8fbe60 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceGroupDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceGroupDao.java
@@ -20,6 +20,8 @@
 
     List<TDeviceGroup> findByGrouptype(String grouptype);
 
+    List<TDeviceGroup> findByDevgroupid(Integer devgroupid);
+
     @Query(value = "select distinct devgroupid from tb_devicegroup where devgroupid=?1 or pid=?1",nativeQuery = true)
     List<Integer> findGroupidByDevgroupid(Integer groupid);
     @Query(value = "select distinct devgroupid from tb_devicegroup where grouptype='leaf'",nativeQuery = true)
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOperDeviceGroupBind.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOperDeviceGroupBind.java
deleted file mode 100644
index a4ce747..0000000
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOperDeviceGroupBind.java
+++ /dev/null
@@ -1,46 +0,0 @@
-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/DeviceParamService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
index 7a3c16f..6dd560d 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
@@ -55,6 +55,9 @@
   List<TreeSelectNode> getDeviceGroupSelectTree();
 
   @Transactional(rollbackFor = Exception.class, readOnly = true)
+  List<TreeSelectNode> getDeviceGroupSelectTree(Integer groupid);
+
+  @Transactional(rollbackFor = Exception.class, readOnly = true)
   List<TreeSelectNode> getDeviceGroupSelectBranchTree();
 
   @Transactional(rollbackFor = Exception.class)
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/TermReportService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/TermReportService.java
new file mode 100644
index 0000000..b9657be
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/TermReportService.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.restaurant.service;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.restaurant.bean.CusttypeReportShowBean;
+import com.supwisdom.dlpay.restaurant.bean.DailyReportSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.TermReportSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.TermReportShowBean;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+public interface TermReportService {
+
+
+    @Transactional(rollbackFor = Exception.class,readOnly = true)
+    List<TermReportShowBean> getTermReportSearchData(TermReportSearchBean searchBean);
+
+    @Transactional(rollbackFor = Exception.class,readOnly = true)
+    String getTermReportSearchPeriod(TermReportSearchBean searchBean);
+
+    @Transactional(rollbackFor = Exception.class,readOnly = true)
+    void doCreateTermReportExcel(HttpServletResponse response, List<TermReportShowBean> datalist, TermReportSearchBean searchBean, String filename, TOperator oper);
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
index af06e93..8160d4d 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
@@ -5,6 +5,7 @@
 import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
 import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
 import com.supwisdom.dlpay.restaurant.bean.TransDtlSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.VTransDtl;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -19,8 +20,13 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TTransDtl> getTransDtlByParam(TransDtlSearchBean param);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    PageResult<VTransDtl> getVTransdtlByParam(TransDtlSearchBean param);
+
     JsonResult export(TransDtlSearchBean bean, HttpServletRequest request, HttpServletResponse response);
 
+    JsonResult exportForView(TransDtlSearchBean bean, HttpServletRequest request, HttpServletResponse response);
+
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     TTransDtl saveTransdtl(TTransDtl dtl);
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CheckTransdtlServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CheckTransdtlServiceImpl.java
index 9d9adf0..587867e 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CheckTransdtlServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CheckTransdtlServiceImpl.java
@@ -249,6 +249,7 @@
     }
 
     if (TradeDict.DTL_STATUS_SUCCESS.equals(transDtl.getStatus())) {
+      transDtl.setAccdate(detail.getAccdate());
       transDtl.setCoreStatus(TradeDict.DTL_STATUS_SUCCESS);
       transDtl.setCoreAccdate(detail.getAccdate());
       transDtl.setCoreSourcetype(detail.getOtherSourcetype());
@@ -313,11 +314,11 @@
   public TCheckDetail doRepairCheckDetail(TCheckDetail detail) {
     TTransDtl transDtl = transDtlDao.getByBillnoWithLock(detail.getLocalRefno());
     if (!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.equals(transDtl.getStatus())) {
-      transDtl.setAccdate(detail.getAccdate());
-      transDtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
+     transDtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
       transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS); //流水置为成功
       transDtl.setRefno(detail.getOtherRefno());
     }
+    transDtl.setAccdate(detail.getAccdate());
     transDtl.setCoreAccdate(detail.getAccdate());
     transDtl.setCoreSourcetype(detail.getOtherSourcetype());
     transDtl.setCoreStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
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 dd1e83d..9c2914e 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
@@ -3,18 +3,22 @@
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.*;
-import com.supwisdom.dlpay.restaurant.bean.*;
-import com.supwisdom.dlpay.restaurant.dao.*;
+import com.supwisdom.dlpay.restaurant.bean.CustomerExportBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerSaveBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerShowBean;
+import com.supwisdom.dlpay.restaurant.dao.CardDao;
+import com.supwisdom.dlpay.restaurant.dao.CardverDao;
+import com.supwisdom.dlpay.restaurant.dao.CustomerDao;
+import com.supwisdom.dlpay.restaurant.dao.DiscountDetailDao;
 import com.supwisdom.dlpay.restaurant.domain.TCard;
 import com.supwisdom.dlpay.restaurant.domain.TCardver;
 import com.supwisdom.dlpay.restaurant.domain.TCustomer;
 import com.supwisdom.dlpay.restaurant.domain.TDept;
-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;
 import org.hibernate.query.internal.NativeQueryImpl;
 import org.hibernate.transform.Transformers;
@@ -29,7 +33,9 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.math.BigInteger;
-import java.util.*;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
 
 
 @Service
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
index a37eb65..a6f136c 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.restaurant.service.impl;
 
 import com.supwisdom.dlpay.exception.WebCheckException;
+import com.supwisdom.dlpay.framework.dao.OperatorQueryLimitDao;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
@@ -11,6 +12,7 @@
 import com.supwisdom.dlpay.restaurant.service.DeviceParamService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
 import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
 import org.apache.commons.lang3.StringUtils;
 import org.hibernate.query.internal.NativeQueryImpl;
 import org.hibernate.transform.Transformers;
@@ -267,6 +269,13 @@
     }
 
     @Override
+    public List<TreeSelectNode> getDeviceGroupSelectTree(Integer groupid) {
+        List<TDeviceGroup> groupList = deviceGroupDao.findByDevgroupid(groupid);
+        if (StringUtil.isEmpty(groupList)) return new ArrayList<>(0);
+        return getDevgroupTree(groupList, 0);
+    }
+
+    @Override
     public List<TreeSelectNode> getDeviceGroupSelectBranchTree() {
         List<TDeviceGroup> groupList = deviceGroupDao.findByGrouptype(RestaurantConstant.DEVICEGROUP_TYPE_BRANCH);
         if (StringUtil.isEmpty(groupList)) return new ArrayList<>(0);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TermReportServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TermReportServiceImpl.java
new file mode 100644
index 0000000..88476b5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TermReportServiceImpl.java
@@ -0,0 +1,279 @@
+package com.supwisdom.dlpay.restaurant.service.impl;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.MoneyUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.restaurant.bean.TermReportShowBean;
+import com.supwisdom.dlpay.restaurant.bean.TermReportSearchBean;
+import com.supwisdom.dlpay.restaurant.service.TermReportService;
+import com.supwisdom.dlpay.restaurant.service.TermReportService;
+import com.supwisdom.dlpay.restaurant.util.ExcelPoiUtil;
+import org.apache.poi.hssf.usermodel.HSSFCellStyle;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.servlet.http.HttpServletResponse;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class TermReportServiceImpl implements TermReportService {
+
+
+    @Autowired
+    private SystemUtilService systemUtilService;
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    private static final Logger logger = LoggerFactory.getLogger(TermReportServiceImpl.class);
+
+
+    @Override
+    public List<TermReportShowBean> getTermReportSearchData(TermReportSearchBean searchBean) {
+        if (null != searchBean) {
+            String startdate = DateUtil.unParseToDateFormat(searchBean.getStartdate());
+            String enddate = DateUtil.unParseToDateFormat(searchBean.getEnddate());
+
+            StringBuffer sb = new StringBuffer("select t.termid," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype ='normal' and t.mealtype='breakfast' then t.amount else 0 end) as b_normalamt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype ='normal' and t.mealtype='breakfast' then 1 else 0 end) as b_normalcnt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota')  and t.mealtype='breakfast' then 1 else 0 end) as b_discountcnt, " +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota') and t.mealtype='breakfast' then t.amount else 0 end) as b_discountamt, " +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype ='normal' and t.mealtype='lunch' then t.amount else 0 end) as l_normalamt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype ='normal' and t.mealtype='lunch' then 1 else 0 end) as l_normalcnt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota') and t.mealtype='lunch' then 1 else 0 end) as l_discountcnt, " +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota') and t.mealtype='lunch' then t.amount else 0 end) as l_discountamt, " +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype ='normal' and t.mealtype='dinner' then t.amount else 0 end) as d_normalamt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype ='normal' and t.mealtype='dinner' then 1 else 0 end) as d_normalcnt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota') and t.mealtype='dinner' then 1 else 0 end) as d_discountcnt, " +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota') and t.mealtype='dinner' then t.amount else 0 end) as d_discountmt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota') then 1 else 0 end) as totdiscountcnt, " +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota') then t.amount else 0 end) as totdiscountamt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype in ('discount','reduction','quota') then t.managefee else 0 end) as totfeeamt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype ='normal'   then t.amount else 0 end) as totnormalamt," +
+                    " sum(case when t.revflag=1 then 0 when t.transtype='revert' then 0 when t.managefeetype ='normal'  then 1 else 0 end) as totnormalcnt" +
+                    " from tb_transdtl t  " +
+                    " left join tb_device dev on t.termid=dev.id " +
+                    " left join tb_shopsettlement s on s.shopid=t.shopid" +
+                    " left join tb_discount_rule r on r.ruleid=t.ruleid" +
+                    " where t.status='success' " +
+                    " and t.accdate>=:startdate and t.accdate<=:enddate ") ;
+            if (StringUtil.isEmpty(searchBean.getShopid())) {
+                sb.append( " and s.shopid = :shopid ");
+            }
+            if (StringUtil.isEmpty(searchBean.getShopname())) {
+                sb.append( " and s.shopid like :shopname ");
+            }
+            if (null!=searchBean.getDevgroupid()) {
+                sb.append( " and dev.devgroupid = :groupid ");
+            }
+            if (null!=searchBean.getRuleid()) {
+                sb.append( " and r.ruleid = :ruleid ");
+            }
+            sb.append(" group by dev.devgroupid,t.termid,s.shopname");
+            Query query = entityManager.createNativeQuery(sb.toString());
+            query.setParameter("startdate", startdate);
+            query.setParameter("enddate", enddate);
+            if (null!=searchBean.getDevgroupid()) {
+                query.setParameter("groupid", searchBean.getDevgroupid());
+            }
+            if (StringUtil.isEmpty(searchBean.getShopid())) {
+                query.setParameter("shopid", searchBean.getShopid().trim()  );
+            }
+            if (StringUtil.isEmpty(searchBean.getShopname())) {
+                query.setParameter("shopname","%" + searchBean.getShopname().trim() + "%");
+            }
+            if (null!=searchBean.getRuleid()) {
+                query.setParameter("ruleid", searchBean.getRuleid());
+            }
+            query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(TermReportShowBean.class));
+            List<TermReportShowBean> list = query.getResultList();
+            if (null != list) return list;
+        }
+        return new ArrayList<>(0);
+
+    }
+    @Override
+    public String getTermReportSearchPeriod(TermReportSearchBean searchBean) {
+        String startdate = DateUtil.unParseToDateFormat(searchBean.getStartdate());
+        String enddate = DateUtil.unParseToDateFormat(searchBean.getEnddate());
+        if (startdate.equals(enddate)) {
+            return DateUtil.reformatDatetime(startdate, "yyyyMMdd", "yyyy年MM月dd日");
+        } else {
+            return DateUtil.reformatDatetime(startdate, "yyyyMMdd", "yyyy年MM月dd日") + " ~ " + DateUtil.reformatDatetime(enddate, "yyyyMMdd", "yyyy年MM月dd日");
+        }
+    }
+
+
+    @Override
+    public void doCreateTermReportExcel(HttpServletResponse response, List<TermReportShowBean> datalist, TermReportSearchBean searchBean, String filename, TOperator oper) {
+        HSSFWorkbook workbook = new HSSFWorkbook();
+        HSSFSheet sheet = workbook.createSheet("终端消费报表");
+
+        int columns = 10; //
+        sheet.setColumnWidth(0, ExcelPoiUtil.columnWidth(25)); //日期
+        for (int i = 3; i < columns; i++) {
+            sheet.setColumnWidth(i, ExcelPoiUtil.columnWidth(12));
+        }
+
+        //标题样式
+        HSSFCellStyle titleStyle = ExcelPoiUtil.creatStyle(workbook, "宋体", true, 20, HSSFCellStyle.ALIGN_CENTER, false); //设置单元格样式
+        //表头样式
+        HSSFCellStyle headStyle = ExcelPoiUtil.creatStyle(workbook, "宋体", true, 15, HSSFCellStyle.ALIGN_CENTER, true); //设置单元格样式
+        //正文样式 有边框-textStyle1 无边框-textStyle2
+        HSSFCellStyle textStyle1 = ExcelPoiUtil.creatStyle(workbook, "宋体", false, 10, HSSFCellStyle.ALIGN_CENTER, true); //设置单元格样式
+        HSSFCellStyle textStyle2 = ExcelPoiUtil.creatStyle(workbook, "宋体", false, 10, HSSFCellStyle.ALIGN_CENTER, false); //设置单元格样式
+
+
+        //TODO：创建标题
+        HSSFRow row0 = ExcelPoiUtil.createRow(sheet, 0, 800); //表格标题
+        ExcelPoiUtil.createCell(row0, 0, titleStyle, filename);
+        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, columns - 1)); //合并单元格CellRangeAddress构造参数依次表示 起始行，截至行，起始列， 截至列
+
+        //TODO：创建表格页眉
+        HSSFRow row1 = ExcelPoiUtil.createRow(sheet, 1, 400);
+        ExcelPoiUtil.createCell(row1, 0, textStyle2, "区间");
+        ExcelPoiUtil.createCell(row1, 1, textStyle2, getTermReportSearchPeriod(searchBean));
+        ExcelPoiUtil.createCell(row1, 2, textStyle2, null);
+        ExcelPoiUtil.createCell(row1, 3, textStyle2, null);
+        ExcelPoiUtil.createCell(row1, 4, textStyle2, null);
+
+        sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 4));
+        ExcelPoiUtil.createCell(row1, columns - 1, ExcelPoiUtil.creatStyle(workbook, "宋体", false, 10, HSSFCellStyle.ALIGN_RIGHT, false), "单位：元");
+
+        //TODO：创建表头（poi做多行合并，一定需要先绘制单元格，然后写入数据，最后合并）
+        HSSFRow row2 = ExcelPoiUtil.createRow(sheet, 2, 600);
+        ExcelPoiUtil.createCell(row2, 0, headStyle, "序号");
+        ExcelPoiUtil.createCell(row2, 1, headStyle, "食堂");
+
+        ExcelPoiUtil.createCell(row2, 2, headStyle, "含餐补消费支付");
+        ExcelPoiUtil.createCell(row2, 3, headStyle, null);
+        ExcelPoiUtil.createCell(row2, 4, headStyle, null);
+        ExcelPoiUtil.createCell(row2, 5, headStyle, null);
+        ExcelPoiUtil.createCell(row2, 6, headStyle, null);
+        ExcelPoiUtil.createCell(row2, 7, headStyle, null);
+
+        sheet.addMergedRegion(new CellRangeAddress(2, 2, 2, 7)); //合并单元格CellRangeAddress构造参数依次表示 起始行，截至行，起始列， 截至列
+
+        ExcelPoiUtil.createCell(row2, 8, headStyle, "无餐补消费支付");
+        ExcelPoiUtil.createCell(row2, 9, headStyle, null);
+        ExcelPoiUtil.createCell(row2, 10, headStyle, null);
+        sheet.addMergedRegion(new CellRangeAddress(2, 2, 8, 10)); //合并单元格CellRangeAddress构造参数依次表示 起始行，截至行，起始列， 截至列
+
+
+        ExcelPoiUtil.createCell(row2, 11, headStyle, "合计 消费金额");
+        ExcelPoiUtil.createCell(row2, 12, headStyle, "合计 消费笔数");
+        HSSFRow row3 = ExcelPoiUtil.createRow(sheet, 3, 800); //表头第二行
+        ExcelPoiUtil.createCell(row3, 0, headStyle, null);
+        sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 0)); //合并列
+
+        ExcelPoiUtil.createCell(row3, 1, headStyle, null);
+        sheet.addMergedRegion(new CellRangeAddress(2, 3, 1, 1)); //合并列
+
+        ExcelPoiUtil.createCell(row3, 11, headStyle, null);
+        sheet.addMergedRegion(new CellRangeAddress(2, 3, 11, 11)); //合并列
+
+        ExcelPoiUtil.createCell(row3, 12, headStyle, null);
+        sheet.addMergedRegion(new CellRangeAddress(2, 3, 12, 12)); //合并列
+
+        ExcelPoiUtil.createCell(row3, 2, headStyle, "早餐 金额");
+        ExcelPoiUtil.createCell(row3, 3, headStyle, "早餐 份数");
+        ExcelPoiUtil.createCell(row3, 4, headStyle, "午餐 金额");
+        ExcelPoiUtil.createCell(row3, 5, headStyle, "午餐 份数");
+        ExcelPoiUtil.createCell(row3, 6, headStyle, "晚餐 金额");
+        ExcelPoiUtil.createCell(row3, 7, headStyle, "晚餐 份数");
+
+ //       ExcelPoiUtil.createCell(row3, 8, headStyle, "早餐 金额");
+        ExcelPoiUtil.createCell(row3, 8, headStyle, "早餐 份数");
+   //     ExcelPoiUtil.createCell(row3, 10, headStyle, "午餐 金额");
+        ExcelPoiUtil.createCell(row3, 9, headStyle, "午餐 份数");
+ //       ExcelPoiUtil.createCell(row3, 12, headStyle, "晚餐 金额");
+        ExcelPoiUtil.createCell(row3, 10, headStyle, "晚餐 份数");
+
+        //TODO: 数据
+        int rowNum = 4;
+        if (StringUtil.isEmpty(datalist)) {
+            //无数据
+            HSSFRow row4 = ExcelPoiUtil.createRow(sheet, rowNum, 500);
+            ExcelPoiUtil.createCell(row4, 0, textStyle1, "无数据");
+            for (int n = 1; n < columns; n++) ExcelPoiUtil.createCell(row4, n, textStyle1, null);
+            sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum, 0, columns - 1)); //合并列
+        } else {
+            //有数据
+            for (int i = 0; i < datalist.size(); i++) {
+                TermReportShowBean detail = datalist.get(i);
+                HSSFRow row = ExcelPoiUtil.createRow(sheet, rowNum++, 500);
+  /*              ExcelPoiUtil.createCell(row, 0, textStyle1,""+ detail.getRownum());
+                ExcelPoiUtil.createCell(row, 1, textStyle1, detail.getGroupname());
+                ExcelPoiUtil.createCell(row, 2, textStyle1, MoneyUtil.formatYuanToString(detail.getIbtotalamt()));
+                ExcelPoiUtil.createCell(row, 3, textStyle1, detail.getIbtotalcnt().toString());
+                ExcelPoiUtil.createCell(row, 4, textStyle1, MoneyUtil.formatYuanToString(detail.getIltotalamt())); //午餐
+                ExcelPoiUtil.createCell(row, 5, textStyle1, detail.getIltotalcnt().toString());
+                ExcelPoiUtil.createCell(row, 6, textStyle1, MoneyUtil.formatYuanToString(detail.getIdtotalamt())); //晚餐
+                ExcelPoiUtil.createCell(row, 7, textStyle1, detail.getIdtotalcnt().toString());
+
+                ExcelPoiUtil.createCell(row, 8, textStyle1, detail.getObtotalcnt().toString());
+                ExcelPoiUtil.createCell(row, 9, textStyle1, detail.getOltotalcnt().toString());
+                ExcelPoiUtil.createCell(row, 10, textStyle1, detail.getOdtotalcnt().toString());
+
+                ExcelPoiUtil.createCell(row, 11, textStyle1, MoneyUtil.formatYuanToString(detail.getIdtotalamt()+detail.getIbtotalamt()+detail.getIltotalamt())); //总计
+                ExcelPoiUtil.createCell(row, 12, textStyle1, detail.getIdtotalcnt()+detail.getIbtotalcnt()+detail.getIltotalcnt()+detail.getOdtotalcnt()+detail.getOltotalcnt()+detail.getObtotalcnt()+"");
+*/
+
+            }
+
+
+        }
+
+        //TODO: 表格页脚
+        HSSFCellStyle textStyle3 = ExcelPoiUtil.creatStyle(workbook, "宋体", false, 10, HSSFCellStyle.ALIGN_LEFT, false); //设置单元格样式
+        HSSFRow buttom = ExcelPoiUtil.createRow(sheet, ++rowNum, 400);
+        ExcelPoiUtil.createCell(buttom, 0, textStyle3, "制表人：" + (oper == null ? "unknow" : oper.getOpername()) + "  " + DateUtil.reformatDatetime(systemUtilService.getSysdatetime().getHostdatetime(), DateUtil.DATETIME_FMT, "yyyy-MM-dd HH:mm:ss"));
+        sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum, 0, 2));  //合并列
+
+        //TODO: 审核信息
+        HSSFRow signRow10 = ExcelPoiUtil.createRow(sheet, rowNum + 3, 400);
+        ExcelPoiUtil.createCell(signRow10, 0, textStyle3, "大理州公安局警务保障处审核盖章：");
+        ExcelPoiUtil.createCell(signRow10, 6, textStyle3, "苍山饭店审核盖章：");
+        sheet.addMergedRegion(new CellRangeAddress(rowNum + 3, rowNum + 3, 0, 5));  //合并列
+        sheet.addMergedRegion(new CellRangeAddress(rowNum + 3, rowNum + 3, 6, columns - 1));  //合并列
+        HSSFRow signRow11 = ExcelPoiUtil.createRow(sheet, rowNum + 4, 400);
+        ExcelPoiUtil.createCell(signRow11, 0, textStyle3, "经办人：");
+        ExcelPoiUtil.createCell(signRow11, 6, textStyle3, "审核人：");
+        sheet.addMergedRegion(new CellRangeAddress(rowNum + 4, rowNum + 4, 0, 5));  //合并列
+        sheet.addMergedRegion(new CellRangeAddress(rowNum + 4, rowNum + 4, 6, columns - 1));  //合并列
+
+        HSSFRow signRow12 = ExcelPoiUtil.createRow(sheet, rowNum + 5, 400);
+        ExcelPoiUtil.createCell(signRow12, 0, textStyle3, "审核人：");
+        sheet.addMergedRegion(new CellRangeAddress(rowNum + 5, rowNum + 5, 0, 5));  //合并列
+
+
+        try {
+            response.setContentType("application/x-msdownload");
+            response.setHeader("Content-Disposition", "attachment;" + " filename=" + new String(filename.getBytes(), "ISO-8859-1") + ".xls");
+            OutputStream out = response.getOutputStream();
+            workbook.write(out);
+            out.flush();
+            out.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+}
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 757ef15..4e8c06e 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
@@ -3,24 +3,26 @@
 import com.supwisdom.dlpay.api.bean.ConsumePayCancelParam;
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.bean.PayReverseResponse;
+import com.supwisdom.dlpay.framework.dao.OperatorQueryLimitDao;
 import com.supwisdom.dlpay.framework.dao.ShopSettlementDao;
 import com.supwisdom.dlpay.framework.domain.TShopSettlement;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.paysdk.proxy.TransactionProxy;
-import com.supwisdom.dlpay.restaurant.bean.AmountCountBean;
-import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
-import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
-import com.supwisdom.dlpay.restaurant.bean.TransDtlSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.*;
+import com.supwisdom.dlpay.restaurant.dao.DeviceDao;
+import com.supwisdom.dlpay.restaurant.dao.DeviceGroupDao;
 import com.supwisdom.dlpay.restaurant.dao.TransDtlDao;
+import com.supwisdom.dlpay.restaurant.domain.TDeviceGroup;
 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 com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
+import org.apache.commons.lang3.StringUtils;
 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;
@@ -38,6 +40,7 @@
 import javax.persistence.criteria.Root;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigInteger;
 import java.util.*;
 
 @Service
@@ -52,6 +55,10 @@
     private TransactionProxy transactionProxy;
     @PersistenceContext
     private EntityManager entityManager;
+    @Autowired
+    private OperatorQueryLimitDao operatorQueryLimitDao;
+    @Autowired
+    private DeviceDao deviceDao;
 
     @Override
     public PageResult<TTransDtl> getTransDtlByParam(TransDtlSearchBean param) {
@@ -59,100 +66,279 @@
                 , 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));
+        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<>(dtls);
     }
 
+    @Override
+    public PageResult<VTransDtl> getVTransdtlByParam(TransDtlSearchBean param) {
+        StringBuffer querySql = new StringBuffer( " SELECT t.transdate,t.transtime,t.billno,'' AS tradeno,'' AS authno,t.custname,c.bankcardno,d.rulename, " +
+                "t1.deptname,t.termid,s.shopid,s.shopname,'' AS searchno,t.amount,'' AS serviceamt,t.transtype, " +
+                "t.status,'T+1' AS cleartype,'普通' AS servicetype,0 AS revertamt,t.revbillno, " +
+                "substr((t.revbillno), 0, 9) AS revtransdate FROM ((((tb_transdtl t " +
+                "left JOIN tb_card c ON (((t.cardno) = (c.cardno)))) " +
+                "left JOIN tb_discount_rule d ON ((t.ruleid = d.ruleid))) " +
+                "left JOIN ( SELECT c_1.custid, " +
+                " p.deptname " +
+                "FROM (tb_customer c_1 " +
+                "left JOIN tb_dept p ON (((c_1.deptcode) = (p.deptcode))))) t1 ON (((t.custid) = (t1.custid)))) " +
+                "left JOIN tb_shopsettlement s ON (((t.shopid) = (s.shopid))))"+
+                " where t.transdate>=:startdate and t.transdate<=:enddate");
+        StringBuffer countSql = new StringBuffer(" SELECT count(*) as cnt FROM ((((tb_transdtl t " +
+                "left JOIN tb_card c ON (((t.cardno) = (c.cardno)))) " +
+                "left JOIN tb_discount_rule d ON ((t.ruleid = d.ruleid))) " +
+                "left JOIN ( SELECT c_1.custid, " +
+                " p.deptname " +
+                "FROM (tb_customer c_1 " +
+                "left JOIN tb_dept p ON (((c_1.deptcode) = (p.deptcode))))) t1 ON (((t.custid) = (t1.custid)))) " +
+                "left JOIN tb_shopsettlement s ON (((t.shopid) = (s.shopid))))"+
+                " where t.transdate>=:startdate and t.transdate<=:enddate");
+
+        if (!StringUtil.isEmpty(param.getOpercode())) {
+            TOperatorQueryLimit limit = operatorQueryLimitDao.findByOpercode(param.getOpercode());
+
+            if (null != limit) {
+                List<Integer> devlist = deviceDao.getIdByDevgroupid(limit.getDevgroupid());
+                if (StringUtil.isEmpty(devlist)) {
+                    devlist.add(0);
+                }
+                querySql.append(" and t.termid in ("+ StringUtils.join(devlist.toArray(),",")+") ");
+                countSql.append(" and t.termid in ("+ StringUtils.join(devlist.toArray(),",")+") ");
+            }
+        }
+
+
+        if (!StringUtil.isEmpty(param.getCustname())) {
+            querySql.append(" and  t.custname like :str ");
+            countSql.append(" and  t.custname like :str ");
+        }
+        if (!StringUtil.isEmpty(param.getBillno())) {
+            querySql.append(" and  t.billno like :billno ");
+            countSql.append(" and  t.billno like :billno ");
+        }
+        if (null!=param.getTermid()) {
+            querySql.append(" and  t.termid = :termid ");
+            countSql.append(" and  t.termid = :termid ");
+        }
+
+        querySql.append(" order by t.billno desc ");
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
+        if (!StringUtil.isEmpty(param.getCustname())) {
+            query.setParameter("str", "%" + param.getCustname().trim() + "%");
+            countQuery.setParameter("str", "%" + param.getCustname().trim() + "%");
+        }
+        if (!StringUtil.isEmpty(param.getBillno())) {
+            query.setParameter("billno", "%" + param.getBillno().trim() + "%");
+            countQuery.setParameter("billno", "%" + param.getBillno().trim() + "%");
+        }
+        if (null!=param.getTermid()) {
+            query.setParameter("termid", param.getTermid());
+            countQuery.setParameter("termid", param.getTermid());
+        }
+        query.setParameter("startdate", param.getStartdate().trim());
+        countQuery.setParameter("startdate", param.getStartdate().trim());
+        query.setParameter("enddate", param.getEnddate().trim());
+        countQuery.setParameter("enddate", param.getEnddate().trim());
+
+        query.setFirstResult((param.getPageNo() - 1) * param.getPageSize());
+        query.setMaxResults(param.getPageSize()); //分页显示
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(VTransDtl.class));
+        List<VTransDtl> list = query.getResultList();
+        if (null != list) {
+            for (VTransDtl bean : list) {
+                bean.setCustname(DataUtil.dataDesensitization(bean.getCustname(), 1));
+            }
+        }
+
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+
     @NotNull
     private Specification<TTransDtl> gettTransDtlSpecification(TransDtlSearchBean param) {
         return new Specification<TTransDtl>() {        //查询条件构造
-                @Override
-                public Predicate toPredicate(Root<TTransDtl> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
-                    List<Predicate> list = new ArrayList<>();
+            @Override
+            public Predicate toPredicate(Root<TTransDtl> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
+                List<Predicate> list = new ArrayList<>();
 
-                    if (!StringUtil.isEmpty(param.getBillno())) {
-                        list.add(cb.like(root.get("billno").as(String.class), "%" + param.getBillno() + "%"));
-                    }
-                    if (!StringUtil.isEmpty(param.getCustname())) {
-                        list.add(cb.like(root.get("custname").as(String.class), "%" + param.getCustname() + "%"));
-                    }
-                    if (!StringUtil.isEmpty(param.getStartdate())) {
-                        list.add(cb.greaterThanOrEqualTo(root.get("transdate").as(String.class), param.getStartdate()));
-                    }
-                    if (!StringUtil.isEmpty(param.getEnddate())) {
-                        list.add(cb.lessThanOrEqualTo(root.get("transdate").as(String.class), param.getEnddate()));
-                    }
-                    if (!StringUtil.isEmpty(param.getAccdate())) {
-                        list.add(cb.equal(root.get("accdate").as(String.class), param.getAccdate()));
-                    }
-                    if (!StringUtil.isEmpty(param.getShopid())) {
-                        list.add(cb.equal(root.get("shopid").as(String.class), param.getShopid()));
-                    }
-                    if (!StringUtil.isEmpty(param.getStatus())) {
-                        list.add(cb.equal(root.get("status").as(String.class), param.getStatus()));
-                    }
-                    if (null!=param.getTermid()) {
-                        list.add(cb.like(root.get("termid").as(String.class), param.getTermid().toString()));
-                    }
-
-                    return cb.and(list.toArray(new Predicate[list.size()]));
+                if (!StringUtil.isEmpty(param.getBillno())) {
+                    list.add(cb.like(root.get("billno").as(String.class), "%" + param.getBillno() + "%"));
                 }
-            };
+                if (!StringUtil.isEmpty(param.getCustname())) {
+                    list.add(cb.like(root.get("custname").as(String.class), "%" + param.getCustname() + "%"));
+                }
+                if (!StringUtil.isEmpty(param.getStartdate())) {
+                    list.add(cb.greaterThanOrEqualTo(root.get("transdate").as(String.class), param.getStartdate()));
+                }
+                if (!StringUtil.isEmpty(param.getEnddate())) {
+                    list.add(cb.lessThanOrEqualTo(root.get("transdate").as(String.class), param.getEnddate()));
+                }
+                if (!StringUtil.isEmpty(param.getAccdate())) {
+                    list.add(cb.equal(root.get("accdate").as(String.class), param.getAccdate()));
+                }
+                if (!StringUtil.isEmpty(param.getShopid())) {
+                    list.add(cb.equal(root.get("shopid").as(String.class), param.getShopid()));
+                }
+                if (!StringUtil.isEmpty(param.getStatus())) {
+                    list.add(cb.equal(root.get("status").as(String.class), param.getStatus()));
+                }
+                if (null != param.getTermid()) {
+                    list.add(cb.like(root.get("termid").as(String.class), param.getTermid().toString()));
+                }
+                if (!StringUtil.isEmpty(param.getOpercode())) {
+                    TOperatorQueryLimit limit = operatorQueryLimitDao.findByOpercode(param.getOpercode());
+
+                    if (null != limit) {
+                        List<Integer> devlist = deviceDao.getIdByDevgroupid(limit.getDevgroupid());
+                        if (StringUtil.isEmpty(devlist)) {
+                            devlist.add(0);
+                        }
+                        list.add(root.get("termid").in(devlist));
+                    }
+                }
+                return cb.and(list.toArray(new Predicate[list.size()]));
+            }
+        };
     }
 
     @Override
     public JsonResult export(TransDtlSearchBean bean, HttpServletRequest request, HttpServletResponse response) {
-        String[] titles0 = {"姓名",	"交易号",	"交易金额","交易时间","记账时间","终端号","商户","流水状态","流水类型","分餐类别"
+        String[] titles0 = {"姓名", "交易号", "交易金额", "交易时间", "记账时间", "终端号", "商户", "流水状态", "流水类型", "分餐类别"
         }; //表头
         String fileName0 = "食堂流水";// 保存数据
         String[][] info0 = {{}};
         Specification<TTransDtl> spec = gettTransDtlSpecification(bean);
-        List<TTransDtl> dtl=transDtlDao.findAll(spec);
-        Integer cnt=dtl.size();
-        if(cnt>0 ){
+        List<TTransDtl> dtl = transDtlDao.findAll(spec);
+        Integer cnt = dtl.size();
+        if (cnt > 0) {
             System.out.println("---init here---");
-            info0=new String[cnt][titles0.length];
-            List<TShopSettlement> shop=shopSettlementDao.findAll();
-            Map<String,String > shopmap=new HashMap<>();
-            for(TShopSettlement s:shop){
-                shopmap.put(s.getShopid(),s.getShopname());
+            info0 = new String[cnt][titles0.length];
+            List<TShopSettlement> shop = shopSettlementDao.findAll();
+            Map<String, String> shopmap = new HashMap<>();
+            for (TShopSettlement s : shop) {
+                shopmap.put(s.getShopid(), s.getShopname());
             }
-            for(int i=0;i<cnt;i++){
-                TTransDtl t=dtl.get(i);
-                info0[i][0]=t.getCustname();
-                info0[i][1]=t.getBillno();
-                info0[i][2]=t.getAmount().toString();
-                info0[i][3]=t.getAccdate();
-                info0[i][4]=t.getTransdate();
-                info0[i][5]=t.getTermid().toString();
-                info0[i][6]=shopmap.get(t.getShopid());
-                String status="";
-                switch (t.getStatus()){
-                    case "init":status="未入账"; break;
-                    case "success":status="已入账"; break;
-                    case "fail":status="失败"; break;
-                    default:status="未知状态";
+            for (int i = 0; i < cnt; i++) {
+                TTransDtl t = dtl.get(i);
+                info0[i][0] = t.getCustname();
+                info0[i][1] = t.getBillno();
+                info0[i][2] = t.getAmount().toString();
+                info0[i][3] = t.getAccdate();
+                info0[i][4] = t.getTransdate();
+                info0[i][5] = t.getTermid().toString();
+                info0[i][6] = shopmap.get(t.getShopid());
+                String status = "";
+                switch (t.getStatus()) {
+                    case "init":
+                        status = "未入账";
+                        break;
+                    case "success":
+                        status = "已入账";
+                        break;
+                    case "fail":
+                        status = "失败";
+                        break;
+                    default:
+                        status = "未知状态";
                 }
-                info0[i][7]=status;
-                info0[i][8]=t.getTranstype();
-                String mealtype="";
-                switch (t.getMealtype()){
-                    case "breakfast":mealtype="早餐"; break;
-                    case "lunch":mealtype="午餐"; break;
-                    case "dinner":mealtype="晚餐"; break;
-                    default:mealtype="未知";
+                info0[i][7] = status;
+                info0[i][8] = t.getTranstype();
+                String mealtype = "";
+                switch (t.getMealtype()) {
+                    case "breakfast":
+                        mealtype = "早餐";
+                        break;
+                    case "lunch":
+                        mealtype = "午餐";
+                        break;
+                    case "dinner":
+                        mealtype = "晚餐";
+                        break;
+                    default:
+                        mealtype = "未知";
                 }
-                info0[i][8]=mealtype;
+                info0[i][8] = mealtype;
             }
         }
 
         try {
-            ExportExcel.queryexcel(fileName0, titles0,info0,request, response);
+            ExportExcel.queryexcel(fileName0, titles0, info0, request, response);
+            return JsonResult.ok("操作成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return JsonResult.error("操作失败");
+    }
+
+    @Override
+    public JsonResult exportForView(TransDtlSearchBean bean, HttpServletRequest request, HttpServletResponse response) {
+        String[] titles0 = {"交易日期", "交易时间", "系统流水号", "核心跟踪号", "授权码", "银行卡号",
+                "姓名", "交易折扣", "所属单位", "商户编号",
+                "商户名称", "终端编号", "检索参考号", "交易金额", "手续费", "退货金额", "原交易日期",
+                "原系统流水号", "交易类型", "应答码", "交易标志", "清算类型", "业务类别"
+        }; //表头
+        String fileName0 = "食堂流水";// 保存数据
+        String[][] info0 = {{}};
+        List<VTransDtl> dtl = getVTransdtlByParam(bean).getData();
+        Integer cnt = dtl.size();
+        if (cnt > 0) {
+            info0 = new String[cnt][titles0.length];
+            List<TShopSettlement> shop = shopSettlementDao.findAll();
+            Map<String, String> shopmap = new HashMap<>();
+            for (TShopSettlement s : shop) {
+                shopmap.put(s.getShopid(), s.getShopname());
+            }
+            for (int i = 0; i < cnt; i++) {
+                VTransDtl t = dtl.get(i);
+                info0[i][0] = t.getTransdate();
+                info0[i][1] = t.getTranstime();
+                info0[i][2] = t.getBillno();
+                info0[i][3] = "";
+                info0[i][4] = "";
+                info0[i][5] = t.getBankcardno();
+                info0[i][6] = t.getCustname();
+                info0[i][7] = t.getRulename();
+                info0[i][8] = t.getDeptname();
+                info0[i][9] = t.getShopid();
+                info0[i][10] = t.getShopname();
+                info0[i][11] = t.getTermid().toString();
+                info0[i][12] = "";
+                info0[i][13] = t.getAmount().toString();
+                info0[i][14] = "";
+                info0[i][15] ="0";
+                info0[i][16] = "";
+                info0[i][17] = t.getRevbillno();
+                info0[i][18] = "在线交易";
+                info0[i][19] = "";
+                String status = "";
+                switch (t.getStatus()) {
+                    case "init":
+                        status = "初始化";
+                        break;
+                    case "success":
+                        status = "成功";
+                        break;
+                    case "fail":
+                        status = "失败";
+                        break;
+                    default:
+                        status = "未知状态";
+                }
+                info0[i][20]=status;
+                info0[i][21]=status;
+                info0[i][22]="T+1";
+                info0[i][23]="普通";
+            }
+        }
+
+        try {
+            ExportExcel.queryexcel(fileName0, titles0, info0, request, response);
             return JsonResult.ok("操作成功");
         } catch (Exception e) {
             e.printStackTrace();
@@ -172,18 +358,18 @@
 
     @Override
     public TTransDtl getPosTransdtl(Integer termid, Integer termsqlno, String termdate) {
-        return transDtlDao.getByTransdateAndTermidAndTermsqlno(termdate,termid,termsqlno);
+        return transDtlDao.getByTransdateAndTermidAndTermsqlno(termdate, termid, termsqlno);
     }
 
 
     @Override
     public JsonResult revertTransdtl(TTransDtl dtl) {
-        TTransDtl revdtl=doRevertTransdtl(dtl);
-        if(null==revdtl){
+        TTransDtl revdtl = doRevertTransdtl(dtl);
+        if (null == revdtl) {
             return JsonResult.error("撤销流水未查询到");
         }
-        if (!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.equals(revdtl.getStatus())){
-            return JsonResult.error("冲正失败，"+revdtl.getAttr1());
+        if (!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.equals(revdtl.getStatus())) {
+            return JsonResult.error("冲正失败，" + revdtl.getAttr1());
         }
         return JsonResult.ok("操作成功");
     }
@@ -191,21 +377,21 @@
     @Override
     public TTransDtl doRevertTransdtl(TTransDtl dtl) {
         TTransDtl targetDtl;
-        Optional<TTransDtl> odtl=transDtlDao.findById(dtl.getBillno());
-        if(!odtl.isPresent()){
-            targetDtl=new TTransDtl();
+        Optional<TTransDtl> odtl = transDtlDao.findById(dtl.getBillno());
+        if (!odtl.isPresent()) {
+            targetDtl = new TTransDtl();
             targetDtl.setBillno(systemUtilService.getRefno());
             targetDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
             targetDtl.setAttr1("未查询到目标流水");
             transDtlDao.save(targetDtl);
             return targetDtl;
         }
-        targetDtl=odtl.get();
-        TTransDtl revDtl=new TTransDtl();
+        targetDtl = odtl.get();
+        TTransDtl revDtl = new TTransDtl();
         revDtl.setBillno(systemUtilService.getRefno());
         revDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
-        String date=DateUtil.getNow("yyyyMMdd");
-        String time=DateUtil.getNow("HHmmss");
+        String date = DateUtil.getNow("yyyyMMdd");
+        String time = DateUtil.getNow("HHmmss");
         revDtl.setTransdate(date);
         revDtl.setTranstime(time);
         revDtl.setRevbillno(targetDtl.getBillno());
@@ -215,9 +401,9 @@
         revDtl.setTermid(targetDtl.getTermid());
         revDtl.setShopid(targetDtl.getShopid());
         revDtl.setMealtype(targetDtl.getMealtype());
-        Double managefee=targetDtl.getManagefee();
-        if(null!=managefee){
-            revDtl.setManagefee(managefee*-1.00);
+        Double managefee = targetDtl.getManagefee();
+        if (null != managefee) {
+            revDtl.setManagefee(managefee * -1.00);
         }
         revDtl.setRuleid(targetDtl.getRuleid());
         revDtl.setCustid(targetDtl.getCustid());
@@ -225,20 +411,20 @@
         revDtl.setCustname(targetDtl.getCustname());
         revDtl.setCusttype(targetDtl.getCusttype());
         revDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
-        revDtl.setAmount(targetDtl.getAmount()*-1.00);
-      //  revDtl=transDtlDao.save(revDtl);
-        ConsumePayCancelParam cancelParam=new ConsumePayCancelParam();
-      //  cancelParam.setBillno(revDtl.getBillno());
+        revDtl.setAmount(targetDtl.getAmount() * -1.00);
+        //  revDtl=transDtlDao.save(revDtl);
+        ConsumePayCancelParam cancelParam = new ConsumePayCancelParam();
+        //  cancelParam.setBillno(revDtl.getBillno());
         cancelParam.setRefno(targetDtl.getRefno());
         cancelParam.setRequestbillno(revDtl.getBillno());
-       // cancelParam.setShopaccno(revDtl.getShopid());
+        // cancelParam.setShopaccno(revDtl.getShopid());
         cancelParam.setTransdate(revDtl.getTransdate());
         cancelParam.setTranstime(revDtl.getTranstime());
-        PayReverseResponse reverseResp=transactionProxy.payCancel(cancelParam);
+        PayReverseResponse reverseResp = transactionProxy.payCancel(cancelParam);
         revDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
-        if(reverseResp.getRetcode()!=0){
+        if (reverseResp.getRetcode() != 0) {
             revDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-            revDtl.setAttr1(reverseResp.getRetmsg()+","+reverseResp.getException());
+            revDtl.setAttr1(reverseResp.getRetmsg() + "," + reverseResp.getException());
             transDtlDao.save(revDtl);
             return revDtl;
         }
@@ -253,7 +439,7 @@
 
     @Override
     public Integer getMaxSeqnoToday(Integer deviceid, String accdate) {
-        Integer onlineseqno= transDtlDao.getMaxSqlnoToday(deviceid,accdate);
+        Integer onlineseqno = transDtlDao.getMaxSqlnoToday(deviceid, accdate);
         if (null == onlineseqno) {
             onlineseqno = 0;
         }
@@ -267,25 +453,25 @@
                         " from tb_transdtl where transdate=:transdate and termid=:termid and managefee!=0 and status=:stat ");
 
         Query query = entityManager.createNativeQuery(querySql.toString());
-        query.setParameter("transdate",transdate);
-        query.setParameter("termid",termid);
+        query.setParameter("transdate", transdate);
+        query.setParameter("termid", termid);
         query.setParameter("stat", RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(AmountCountBean.class));
         List<AmountCountBean> list = query.getResultList();
-        if(!StringUtil.isEmpty(list)){
+        if (!StringUtil.isEmpty(list)) {
             AmountCountBean acb = list.get(0);
             ManageFeeAmtBean bean = new ManageFeeAmtBean();
             bean.setManagefeecnt(acb.getTotalcnt().longValue());
             bean.setManagefeeamt(acb.getTotalamt() == null ? 0 : Math.round(acb.getTotalamt() * 100));
             return bean;
         }
-        return new ManageFeeAmtBean(0l,0l);
+        return new ManageFeeAmtBean(0l, 0l);
     }
 
     @Override
     public SalesAmtBean getSalesToday(String transdate, Integer termid) {
         StringBuffer querySql = new StringBuffer("select sum(amount) as totalamt,count(billno) as totalcnt " +
-            "from tb_transdtl where transdate=:transdate and termid=:termid and status=:stat ");
+                "from tb_transdtl where transdate=:transdate and termid=:termid and status=:stat ");
 
         Query query = entityManager.createNativeQuery(querySql.toString());
         query.setParameter("transdate", transdate);
@@ -305,27 +491,27 @@
 
     @Override
     public List<TTransDtl> getSubmittingTransdtl(String date) {
-        return transDtlDao.findAllByStatusAndTransdate(RestaurantConstant.STATUS_TRANSDTL_WAIT,date);
+        return transDtlDao.findAllByStatusAndTransdate(RestaurantConstant.STATUS_TRANSDTL_WAIT, date);
     }
 
     @Override
     public Integer getDiscountLimitToday(String termdate, String custid, Integer ruleid) {
-        return transDtlDao.countByAccdateAndCustidAndRuleidAndStatusAndRevflag(termdate,custid,ruleid,RestaurantConstant.STATUS_TRANSDTL_SUCCESS,0);
+        return transDtlDao.countByAccdateAndCustidAndRuleidAndStatusAndRevflag(termdate, custid, ruleid, RestaurantConstant.STATUS_TRANSDTL_SUCCESS, 0);
     }
 
     @Override
     public Integer getDiscountLimitTodayWithPeriod(String termdate, String custid, Integer ruleid, String starttime, String endtime) {
-        return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithPeriod(termdate,custid,ruleid,starttime,endtime);
+        return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithPeriod(termdate, custid, ruleid, starttime, endtime);
     }
 
     @Override
     public Integer getDiscountLimitMonth(String termdate, String custid, Integer ruleid) {
-        return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithMonth(termdate,custid,ruleid);
+        return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithMonth(termdate, custid, ruleid);
     }
 
     @Override
     public Integer getDiscountLimitMonthWithPeriod(String termdate, String custid, Integer ruleid, String starttime, String endtime) {
-        return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithMonthAndPeriod(termdate,custid,ruleid,starttime,endtime);
+        return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithMonthAndPeriod(termdate, custid, ruleid, starttime, endtime);
     }
 
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
index a727ed8..9b1e6f7 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -8,8 +8,13 @@
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.restaurant.domain.TDevice;
+import com.supwisdom.dlpay.restaurant.domain.TDeviceGroup;
+import com.supwisdom.dlpay.restaurant.service.DeviceGroupService;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
 import com.supwisdom.dlpay.system.bean.LogBean;
 import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
 import com.supwisdom.dlpay.system.service.OperatorService;
 import com.supwisdom.dlpay.system.service.RoleService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,6 +25,7 @@
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
+import java.net.URLDecoder;
 import java.util.List;
 
 
@@ -30,6 +36,8 @@
     private OperatorService operatorService;
     @Autowired
     private RoleService roleService;
+    @Autowired
+    private DeviceGroupService deviceGroupService;
 
     @GetMapping("/index")
     @PreAuthorize("hasPermission('/operator/index','')")
@@ -219,4 +227,28 @@
         operatorService.saveOperator(operator);
         return JsonResult.ok("密码修改成功，请重新登录");
     }
+
+    @GetMapping("/getquerylimit")
+    public String getQueryLimit(
+            @RequestParam("opercode") String opercode,
+            Model model) {
+
+        TOperatorQueryLimit limit=operatorService.getOperatorQueryLimit(opercode);
+        if(null!=limit){
+            model.addAttribute("limit",limit.getDevgroupid());
+
+        }
+        return "system/operator/limitform";
+    }
+
+    @PostMapping("/updatelimit")
+    @ResponseBody
+    public JsonResult updateLimit(@RequestBody TOperatorQueryLimit limit) {
+        if (limit != null) {
+            operatorService.saveOperatorQueryLimit(limit);
+            return JsonResult.ok("操作成功");
+        } else {
+            return JsonResult.error("失败");
+        }
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/domain/TOperatorQueryLimit.java b/src/main/java/com/supwisdom/dlpay/system/domain/TOperatorQueryLimit.java
new file mode 100644
index 0000000..be2fb41
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/domain/TOperatorQueryLimit.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.system.domain;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_Oper_Query_limit")
+public class TOperatorQueryLimit {
+
+    private String opercode;
+    private Integer devgroupid;
+
+    @Id
+    @Column(name = "opercode", nullable = false, length = 32)
+    public String getOpercode() {
+        return opercode;
+    }
+
+    public void setOpercode(String opercode) {
+        this.opercode = opercode;
+    }
+
+    @Column(name = "devgroupid",  nullable = false, length = 8)
+    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/system/service/OperatorService.java b/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
index 3954045..5cf41fd 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
@@ -8,7 +8,8 @@
 import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
-
+import
+        com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
 import java.util.List;
 
 public interface OperatorService {
@@ -41,4 +42,10 @@
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     boolean saveOperator(TOperator operator);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+    TOperatorQueryLimit getOperatorQueryLimit(String opercode);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    boolean saveOperatorQueryLimit(TOperatorQueryLimit limit);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
index e58032e..c2130f2 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
@@ -3,6 +3,7 @@
 import com.supwisdom.dlpay.framework.dao.OperLogDao;
 import com.supwisdom.dlpay.framework.dao.OperRoleDao;
 import com.supwisdom.dlpay.framework.dao.OperatorDao;
+import com.supwisdom.dlpay.framework.dao.OperatorQueryLimitDao;
 import com.supwisdom.dlpay.framework.domain.TOperLog;
 import com.supwisdom.dlpay.framework.domain.TOperRole;
 import com.supwisdom.dlpay.framework.domain.TOperator;
@@ -18,6 +19,7 @@
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
+import com.supwisdom.dlpay.system.domain.TOperatorQueryLimit;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
@@ -35,6 +37,8 @@
     private OperRoleDao operRoleDao;
     @Autowired
     private OperLogDao operLogDao;
+    @Autowired
+    private OperatorQueryLimitDao operatorQueryLimitDao;
 
     @Override
     public PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean) {
@@ -170,4 +174,16 @@
         operatorDao.save(operator);
         return true;
     }
+
+    @Override
+    public TOperatorQueryLimit getOperatorQueryLimit(String opercode) {
+        TOperatorQueryLimit limit=operatorQueryLimitDao.findByOpercode(opercode);
+        return limit;
+    }
+
+    @Override
+    public boolean saveOperatorQueryLimit(TOperatorQueryLimit limit) {
+        operatorQueryLimitDao.save(limit);
+        return true;
+    }
 }
diff --git a/src/main/resources/templates/restaurant/custtypereport/index.html b/src/main/resources/templates/restaurant/custtypereport/index.html
index 8a42ce1..3197913 100644
--- a/src/main/resources/templates/restaurant/custtypereport/index.html
+++ b/src/main/resources/templates/restaurant/custtypereport/index.html
@@ -9,6 +9,7 @@
     <div class="layui-card-body">
         <div class="layui-form" lay-filter="custtypereport-search-form">
             <input type="hidden" id="custtypereport-hidden-maxdate" th:value="${maxdate}" />
+            <input type="hidden" id="custtypereport-hidden-devgroupid" th:value="${devgroupid}"/>
             <div class="layui-form-item" style="margin-bottom: 0;">
                 <div class="layui-inline">
                     <label class="layui-form-label">记账日期</label>
@@ -139,7 +140,10 @@
                 return true;
             },
             success: function (d) {
-                console.log(d); // 加载完成后的回调函数
+                let limit= $("#custtypereport-hidden-devgroupid").val();
+                treeSelect.checkNode(
+                    'custtypereport-search-devgroup-filter',
+                    limit);
             }
         });
 
diff --git a/src/main/resources/templates/restaurant/report/laborcount.html b/src/main/resources/templates/restaurant/report/laborcount.html
index a1476fd..1e88907 100644
--- a/src/main/resources/templates/restaurant/report/laborcount.html
+++ b/src/main/resources/templates/restaurant/report/laborcount.html
@@ -9,6 +9,7 @@
     <div class="layui-card-body">
         <div class="layui-form" lay-filter="shopreport-labercount-search-form">
             <input type="hidden" id="shopreport-labercount-hidden-maxdate" th:value="${maxdate}"/>
+            <input type="hidden" id="shopreport-labercount-hidden-devgroupid" th:value="${devgroupid}"/>
             <input type="hidden" id="shopreport-labercount-hidden-maxmonth" th:value="${maxmonth}"/>
             <div class="layui-form-item" style="margin-bottom: 0;">
                 <div class="layui-inline">
@@ -205,7 +206,11 @@
                 return true;
             },
             success: function (d) {
-                console.log(d); // 加载完成后的回调函数
+                let limit= $("#shopreport-labercount-hidden-devgroupid").val();
+
+                treeSelect.checkNode(
+                    'labercount-search-devgroup-filter',
+                    limit);
             }
         });
 
diff --git a/src/main/resources/templates/restaurant/report/laborfee.html b/src/main/resources/templates/restaurant/report/laborfee.html
index 64e7aaf..5b6d4bc 100644
--- a/src/main/resources/templates/restaurant/report/laborfee.html
+++ b/src/main/resources/templates/restaurant/report/laborfee.html
@@ -9,6 +9,7 @@
     <div class="layui-card-body">
         <div class="layui-form" lay-filter="shopreport-laborfee-search-form">
             <input type="hidden" id="shopreport-laborfee-hidden-maxdate" th:value="${maxdate}"/>
+            <input type="hidden" id="shopreport-laborfee-hidden-devgroupid" th:value="${devgroupid}"/>
             <input type="hidden" id="shopreport-laborfee-hidden-maxmonth" th:value="${maxmonth}"/>
             <div class="layui-form-item" style="margin-bottom: 0;">
                 <div class="layui-inline">
@@ -223,7 +224,11 @@
                 return true;
             },
             success: function (d) {
-                console.log(d); // 加载完成后的回调函数
+                let limit= $("#shopreport-laborfee-hidden-devgroupid").val();
+
+                treeSelect.checkNode(
+                    'laborfee-search-devgroup-filter',
+                    limit);
             }
         });
 
diff --git a/src/main/resources/templates/restaurant/termreport/index.html b/src/main/resources/templates/restaurant/termreport/index.html
new file mode 100644
index 0000000..653cb67
--- /dev/null
+++ b/src/main/resources/templates/restaurant/termreport/index.html
@@ -0,0 +1,252 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">终端消费表</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">报表中心</a>
+          <a><cite>终端消费表</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form" lay-filter="termreport-search-form">
+            <input type="hidden" id="termreport-hidden-maxdate" th:value="${maxdate}" />
+            <input type="hidden" id="termreport-hidden-devgroupid" th:value="${devgroupid}"/>
+            <div class="layui-form-item" style="margin-bottom: 0;">
+                <div class="layui-inline">
+                    <label class="layui-form-label">记账日期</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="startdate" id="termreport-search-startdate" placeholder="起始日期" th:value="${maxdate}"
+                               autocomplete="off" class="layui-input"/>
+                    </div>
+                    <div class="layui-form-mid">-</div>
+                    <div class="layui-input-inline">
+                        <input type="text" name="enddate" id="termreport-search-enddate" placeholder="截止日期" th:value="${maxdate}"
+                               autocomplete="off" class="layui-input"/>
+                    </div>
+                </div>
+
+                <div class="layui-inline">
+                    <label class="layui-form-label">选择设备组</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="groupid" id="termreport-search-devgroup" lay-filter="termreport-search-devgroup-filter"
+                               autocomplete="off" class="layui-input"/>
+                    </div>
+                </div>
+
+                <div class="layui-inline">
+                    <button id="termreport-search-btn" class="layui-btn icon-btn" data-type="search"><i
+                            class="layui-icon">&#xe615;</i>搜索
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            <div class="layui-btn-group">
+                <button id="shopreport-termreport-export-excel" class="layui-btn layui-btn-sm layui-btn-primary sw-print"><i class="layui-icon layui-icon-export"></i>导出</button>
+                <button id="shopreport-termreport-print-table" class="layui-btn layui-btn-sm layui-btn-primary sw-print"><i class="layui-icon layui-icon-print"></i>打印</button>
+            </div>
+        </div>
+        <table class="layui-table sw-table" id="shopreport-termreport-table" th:fragment="termreportTable">
+            <thead>
+            <tr>
+                <th rowspan="3" style="text-align: center;min-width: 60px;">序号</th>
+                <th rowspan="3" style="text-align: center;min-width: 100px;">食堂</th>
+                <th colspan="6" style="text-align: center;">含餐补消费支付</th>
+                <th colspan="3" style="text-align: center;">无餐补消费支付</th>
+                <th  rowspan="3" style="text-align: center;">消费金额</th>
+                <th  rowspan="3" style="text-align: center;">合计消费次数</th>
+            </tr>
+            <tr>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">早餐<br/>金额</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">早餐<br/>份数</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">午餐<br/>金额</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">午餐<br/>份数</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">晚餐<br/>金额</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">晚餐<br/>份数</th>
+                <!--<th rowspan="2" style="text-align: center;min-width: 60px;">正价金额<br/>小计</th>-->
+              <!--  <th rowspan="2" style="text-align: center;min-width: 60px;">早餐<br/>金额</th>-->
+                <th rowspan="2" style="text-align: center;min-width: 60px;">早餐<br/>份数</th>
+             <!--   <th rowspan="2" style="text-align: center;min-width: 60px;">午餐<br/>金额</th>-->
+                <th rowspan="2" style="text-align: center;min-width: 60px;">午餐<br/>份数</th>
+          <!--      <th rowspan="2" style="text-align: center;min-width: 60px;">晚餐<br/>金额</th>-->
+                <th rowspan="2" style="text-align: center;min-width: 60px;">晚餐<br/>份数</th>
+
+            </tr>
+            </thead>
+            <tbody id="shopreport-termreport-tbody" th:data-startdate="${searchBean.startdate}" th:data-enddate="${searchBean.enddate}"  th:data-opercode="${opercode}">
+            <tr th:if="${null==showlist || showlist.size()==0}">
+                <td colspan="13">无数据</td>
+            </tr>
+            <div th:remove="tag" th:if="${null!=showlist && showlist.size()>0}" th:each="data:${showlist}" >
+
+                <tr>
+                    <td style="font-weight: bold;" th:text="${data.rownum}"></td>
+                    <td style="font-weight: bold;" th:text="${data.groupname}"></td>
+                    <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.ibtotalamt,1,2)}"></td>
+                    <td style="font-weight: bold;" th:text="${data.ibtotalcnt}"></td>
+                    <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.iltotalamt,1,2)}"></td>
+                    <td style="font-weight: bold;" th:text="${data.iltotalcnt}"></td>
+                    <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.idtotalamt,1,2)}"></td>
+                    <td style="font-weight: bold;" th:text="${data.idtotalcnt}"></td>
+               <!--     <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.obtotalamt,1,2)}"></td>-->
+                    <td style="font-weight: bold;" th:text="${data.obtotalcnt}"></td>
+            <!--        <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.oltotalamt,1,2)}"></td>-->
+                    <td style="font-weight: bold;" th:text="${data.oltotalcnt}"></td>
+                 <!--   <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.odtotalamt,1,2)}"></td>-->
+                    <td style="font-weight: bold;" th:text="${data.odtotalcnt}"></td>
+                    <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.ibtotalamt+data.iltotalamt+data.idtotalamt,1,2)}"></td>
+                    <td style="font-weight: bold;" th:text="${data.ibtotalcnt+data.iltotalcnt+data.idtotalcnt+data.obtotalcnt+data.oltotalcnt+data.odtotalcnt}"></td>
+
+                </tr>
+            </div>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+<script>
+    layui.use(['form', 'layer',  'element', 'laydate','treeSelect'], function () {
+        var laydate = layui.laydate;
+        var layer = layui.layer;
+        var $ = layui.jquery;
+        var treeSelect = layui.treeSelect;
+
+        treeSelect.render({
+            elem: '#termreport-search-devgroup',
+            data: '[[@{/whitelistbind/devgrouptree}]]',
+            type: 'get',
+            placeholder: '选择设备组',
+            search: false,
+            style: {
+                folder: {
+                    enable: false
+                },
+                line: {
+                    enable: true
+                }
+            },
+            // 点击回调
+            click: function (d) {
+                var treeNode = d.current;
+                console.log(treeNode);
+                if(treeNode.grouptype == 'branch'){
+                    layer.msg("请选择末级商户", {icon: 2, time:1500});
+                    $("#dailyreport-search-devgroup").val("");
+                    treeSelect.revokeNode('termreport-search-devgroup-filter');
+                    return false;
+                }
+                return true;
+            },
+            success: function (d) {
+                let limit= $("#termreport-hidden-devgroupid").val();
+                treeSelect.checkNode(
+                    'termreport-search-devgroup-filter',
+                    limit);
+            }
+        });
+
+
+        laydate.render({
+            elem: '#termreport-search-startdate',
+            max: $("#termreport-hidden-maxdate").val(),
+            trigger: 'click'
+        });
+        laydate.render({
+            elem: '#termreport-search-enddate',
+            max: $("#termreport-hidden-maxdate").val(),
+            trigger: 'click'
+        });
+
+        $('#termreport-search-btn').click(function () {
+            var startdate = $("#termreport-search-startdate").val();
+            var enddate = $("#termreport-search-enddate").val();
+            var groupid = $("#termreport-search-devgroup").val();
+            if (null == startdate || "" == $.trim(startdate)) {
+                layer.msg('请选择起始日期', {icon: 2, time: 1500});
+                return;
+            }
+            if (null == enddate || "" == $.trim(enddate)) {
+                layer.msg('请选择截止日期', {icon: 2, time: 1500});
+                return;
+            }
+
+            $.ajax({
+                url: '[[@{/termreport/termreportlist}]]',
+                type: "POST",
+                data: {
+                    startdate: startdate,
+                    enddate: enddate,
+                    groupid: groupid,
+                    _csrf: $("meta[name='_csrf_token']").attr("value")
+                },
+                success: function (data) {
+                    $("#shopreport-termreport-table").html(data);
+                    layer.closeAll('loading');
+                },
+                error: function (status, err) {
+                    layer.closeAll('loading');
+                    layer.msg('查询失败了', {icon: 2});
+                }
+            });
+        });
+
+        $("#shopreport-termreport-export-excel").click(function(){
+            var startdate= $("#shopreport-termreport-tbody").attr("data-startdate");
+            var enddate= $("#shopreport-termreport-tbody").attr("data-enddate");
+            var groupid = $("#termreport-search-devgroup").val();
+
+            var dataUrl='[[@{/termreport/excelexport}]]?startdate='+startdate+'&enddate='+enddate+'&groupid='+groupid;
+            var xhr = new XMLHttpRequest();
+            xhr.responseType = "blob"; //设置响应类型为blob类型
+            xhr.onload = function () {
+                debugger
+                if (this.status == "200") {
+                    //获取响应文件流　
+                    var blob = this.response;
+                    // 转换完成，创建一个a标签用于下载
+                    var aElem = document.createElement('a');
+                    aElem.href = window.URL.createObjectURL(blob);
+                    aElem.download = "客户类别消费报表.xls";
+                    aElem.onload = function (e) {
+                        window.URL.revokeObjectURL(aElem.href);
+                    };
+                    $("body").append(aElem);  // 修复firefox中无法触发click
+                    aElem.click();
+                    $(aElem).remove();
+
+                }else if(this.status == "403"){
+                    layer.msg('无导出资源权限', {icon: 2});
+                } else {
+                    layer.msg('导出excel失败了', {icon: 2});
+                }
+            }
+            xhr.open("GET", dataUrl, true);
+            xhr.send();
+        });
+
+        var LODOP; //声明为全局变量
+        $("#shopreport-termreport-print-table").click(function(){
+            var startdate= $("#shopreport-termreport-tbody").attr("data-startdate");
+            var enddate= $("#shopreport-termreport-tbody").attr("data-enddate");
+            var groupid = $("#termreport-search-devgroup").val();
+
+            var opercode = $("#shopreport-termreport-tbody").attr("data-opercode");
+            var url = '/termreport/print/printtermreport?startdate=' + startdate + '&enddate=' + enddate +'&groupid=' + groupid+  '&opercode=' + opercode;
+
+            LODOP = getLodop();
+            LODOP.PRINT_INIT("客户类别消费报表");
+            LODOP.SET_PRINT_PAGESIZE(2, 0, 0,"A4");
+            LODOP.ADD_PRINT_URL(30, 20, "95%", "90%", encodeURI(url));
+            LODOP.ADD_PRINT_HTM("95%", "48%", 150, 50, "<font style='font-size:12px'><span tdata='pageNO'>##</span>/<span tdata='pageCount'>&nbsp;&nbsp;##</span></font>");
+            LODOP.SET_PRINT_STYLEA(0, "ItemType", 1);
+            LODOP.SET_PRINT_STYLEA(0, "HOrient", 3);
+            LODOP.SET_PRINT_STYLEA(0, "VOrient", 3);
+            LODOP.SET_SHOW_MODE("NP_NO_RESULT", true);
+            LODOP.SET_PRINT_MODE("FULL_WIDTH_FOR_OVERFLOW",true);
+            LODOP.PREVIEW();
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/termreport/print/printcusttypereport.html b/src/main/resources/templates/restaurant/termreport/print/printcusttypereport.html
new file mode 100644
index 0000000..db3c0b2
--- /dev/null
+++ b/src/main/resources/templates/restaurant/termreport/print/printcusttypereport.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+<head>
+    <meta charset="UTF-8">
+    <title>人员类别消费表</title>
+
+    <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}"/>
+    <link rel="stylesheet" th:href="@{/static/custom/css/custom.css}"/>
+</head>
+<body>
+<div class="layui-card">
+    <div class="layui-card-header" style="text-align: center;">
+        <h1>人员类别消费表</h1>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            <div style="float: left;padding-left: 3px;" th:text="${'区间：'+period}"></div>
+            <div style="float: right;" th:text="'单位：元'"></div>
+        </div>
+        <table class="layui-table sw-table sw-print">
+            <thead>
+            <tr>
+                <th rowspan="3" style="text-align: center;min-width: 60px;">序号<br/> <br/> </th>
+                <th rowspan="3" style="text-align: center;min-width: 160px;">食堂<br/> <br/> </th>
+                <th colspan="6" style="text-align: center;">含餐补消费支付</th>
+                <th colspan="6" style="text-align: center;">无餐补消费支付</th>
+                <th  rowspan="3" style="text-align: center;min-width: 60px;">合计<br/>消费<br/>金额</th>
+                <th  rowspan="3" style="text-align: center;min-width: 60px;">合计<br/>消费<br/>次数</th>
+            </tr>
+            <tr>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">早餐<br/>金额</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">早餐<br/>份数</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">午餐<br/>金额</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">午餐<br/>份数</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">晚餐<br/>金额</th>
+                <th rowspan="2" style="text-align: center;min-width: 60px;">晚餐<br/>份数</th>
+              <!--  <th rowspan="2" style="text-align: center;min-width: 60px;">早餐<br/>金额</th>-->
+                <th rowspan="2" style="text-align: center;min-width: 60px;">早餐<br/>份数</th>
+             <!--   <th rowspan="2" style="text-align: center;min-width: 60px;">午餐<br/>金额</th>-->
+                <th rowspan="2" style="text-align: center;min-width: 60px;">午餐<br/>份数</th>
+              <!--  <th rowspan="2" style="text-align: center;min-width: 60px;">晚餐<br/>金额</th>-->
+                <th rowspan="2" style="text-align: center;min-width: 60px;">晚餐<br/>份数</th>
+
+            </tr>
+            </thead>
+            <tbody>
+            <tr th:if="${null==showlist || showlist.size()==0}">
+                <td colspan="16">无数据</td>
+            </tr>
+            <div th:remove="tag" th:if="${null!=showlist && showlist.size()>0}" th:each="data:${showlist}" >
+
+                <tr>
+                    <td style="font-weight: bold;" th:text="${data.rownum}"></td>
+                    <td style="font-weight: bold;" th:text="${data.groupname}"></td>
+                    <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.ibtotalamt,1,2)}"></td>
+                    <td style="font-weight: bold;" th:text="${data.ibtotalcnt}"></td>
+                    <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.iltotalamt,1,2)}"></td>
+                    <td style="font-weight: bold;" th:text="${data.iltotalcnt}"></td>
+                    <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.idtotalamt,1,2)}"></td>
+                    <td style="font-weight: bold;" th:text="${data.idtotalcnt}"></td>
+                  <!--  <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.obtotalamt,1,2)}"></td>-->
+                    <td style="font-weight: bold;" th:text="${data.obtotalcnt}"></td>
+                 <!--   <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.oltotalamt,1,2)}"></td>-->
+                    <td style="font-weight: bold;" th:text="${data.oltotalcnt}"></td>
+                  <!--  <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.odtotalamt,1,2)}"></td>-->
+                    <td style="font-weight: bold;" th:text="${data.odtotalcnt}"></td>
+                    <td style="font-weight: bold;" th:text="${#numbers.formatDecimal(data.ibtotalamt+data.iltotalamt+data.idtotalamt,1,2)}"></td>
+                    <td style="font-weight: bold;" th:text="${data.ibtotalcnt+data.iltotalcnt+data.idtotalcnt+data.obtotalcnt+data.oltotalcnt+data.odtotalcnt}"></td>
+
+                </tr>
+            </div>
+            </tbody>
+        </table>
+        <div class="layui-form toolbar">
+            <div style="float: left;padding-left: 3px;" th:text="${'制表人：'+opername+' &nbsp;&nbsp; '+ printdatetime}"></div>
+        </div>
+    </div>
+    <div class="layui-card-body" style="margin-top: 25px;">
+        <table class="sw-print-sign">
+            <tr>
+                <td width="50%">大理州公安局警务保障处审核盖章：</td>
+                <td width="50%">苍山饭店审核盖章：</td>
+            </tr>
+            <tr>
+                <td>经办人：</td>
+                <td>审核人：</td>
+            </tr>
+            <tr>
+                <td>审核人：</td>
+
+            </tr>
+            <tr>
+                <td colspan="2">&nbsp;</td>
+            </tr>
+            <tr>
+                <td colspan="2">&nbsp;</td>
+            </tr>
+            <!--            <tr>-->
+            <!--                <td>市民卡公司审核盖章：</td>-->
+            <!--                <td>建桥园审核盖章：</td>-->
+            <!--            </tr>-->
+            <!--            <tr>-->
+            <!--                <td>审核人：</td>-->
+            <!--                <td>审核人：</td>-->
+            <!--            </tr>-->
+        </table>
+    </div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/restaurant/transdtl/indexview.html b/src/main/resources/templates/restaurant/transdtl/indexview.html
new file mode 100644
index 0000000..c0d4651
--- /dev/null
+++ b/src/main/resources/templates/restaurant/transdtl/indexview.html
@@ -0,0 +1,245 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">食堂流水表</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">食堂流水表</a>
+          <a><cite>食堂流水表</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            <form id="vtransdtl-form"  >
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <label class="layui-form-label">起始日期：</label>
+                        <div class="layui-input-inline">
+                            <input type="text" name="startdate" class="layui-input" th:value="${startDate}"
+                                   id="vtransdtl-startdate" placeholder="yyyy-MM-dd">
+                        </div>
+
+                    </div>
+                    <div class="layui-inline">
+                        <label class="layui-form-label">结束日期：</label>
+                        <div class="layui-input-inline">
+                            <input type="text" name="enddate" class="layui-input" th:value="${endDate}"
+                                   id="vtransdtl-enddate" placeholder="yyyy-MM-dd">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <label class="layui-form-label"> 姓名：</label>
+                        <div class="layui-input-inline">
+                            <input id="vtransdtl-custname" name="custname" class="layui-input" type="text"/>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+
+                    <div class="layui-inline">
+                        <label class="layui-form-label"> 交易号：</label>
+                        <div class="layui-input-inline">
+                            <input id="vtransdtl-refno" name="billno" class="layui-input " type="text"/>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <label class="layui-form-label">终端号：</label>
+                        <div class="layui-input-inline">
+                            <input id="vtransdtl-termid" name="termid" class="layui-input " type="text"/>
+                        </div>
+                    </div>
+
+                </div>
+
+                <div class="layui-form-item">
+
+                    <div class="layui-inline" style="margin-left:5%">
+                        <button id="vtransdtl-btn-search" class="layui-btn icon-btn" data-type="search">
+                            <i class="layui-icon">&#xe615;</i>搜索
+                        </button>
+                        <button id="vtransdtl-btn-reset" class="layui-btn layui-btn-primary">重置
+                        </button>
+                        <!--    <button id="btn-export"  lay-filter="form-submit" lay-submit  class="layui-btn layui-btn-primary">导出
+                            </button>-->
+                        <a id="vtransdtl-btn-export" href="javascript:void(0);" class="layui-btn layui-btn-primary" >导出</a>
+                    </div>
+                </div>
+
+            </form>
+
+        </div>
+        <table class="layui-table" id="vtransdtl-table" lay-filter="table"></table>
+    </div>
+</div>
+<input hidden th:value="${shopList}" id="vtransdtl-shoplist">
+<script>
+
+    var rawlist = $("#vtransdtl-shoplist").val();
+    var shoplist = JSON.parse(rawlist);
+
+    layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate'], function () {
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
+
+        var enddate = $("#vtransdtl-enddate").val();
+        var startdate=$("#vtransdtl-startdate").val();
+
+        form.render('select');
+        var laydate = layui.laydate;
+        laydate.render({
+            elem: '#vtransdtl-startdate',
+            btns: ['now', 'confirm'],
+            trigger: 'click',
+            max: enddate
+        });
+        laydate.render({
+            elem: '#vtransdtl-enddate',
+            btns: ['now', 'confirm'],
+            trigger: 'click',
+            max: enddate
+        });
+
+        // 渲染表格
+        table.render({
+            elem: '#vtransdtl-table',
+            url: '[[@{/transdtl/listview}]]',
+            where:{
+                startdate:startdate,
+                enddate:enddate
+            },
+            toolbar: true,
+            defaultToolbar: ['filter', 'print'],
+            page: true,
+            cols: [
+                [
+                    {field: 'bankcardno', title: '银行卡号',width:200, fixed: 'left'},
+                    {field: 'custname', title: '姓名',width:100, fixed: 'left'},
+                    {field: 'billno', title: '系统交易号', fixed: 'left',width:200, sort: true},
+                    {field: 'amount', title: '交易金额',width:100, sort: true,
+                        templet: function (item) {
+                            return parseFloat(item.amount).toFixed(2);
+                        }},
+                    {
+                        field: 'transdate',
+                        title: '交易日期',
+                        sort: true,
+                        width:120,
+                        templet: function (item) {
+                            var date = item.transdate;
+                            if (date != null) {
+                                return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);
+                            }
+                            return '';
+                        }
+                    },
+                    {
+                        field: 'transtime',
+                        title: '交易时间',
+                        sort: true,
+                        width:100,
+                        templet: function (item) {
+                            var time = item.transtime;
+                            if (time != null) {
+                                return time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);
+                            }
+                            return '';
+                        }
+                    },
+                    {field: 'tradeno', title: '核心跟踪号',width:120},
+                    {field: 'authno', title: '授权码',width:120},
+                    {field: 'rulename', title: '交易折扣',width:120},
+                    {field: 'deptname', title: '所属单位',width:120},
+                    {field: 'shopname', title: '商户名称',width:120},
+                    {field: 'searchno', title: '检索参考号',width:120},
+                    {field: 'serviceamt', title: '手续费',width:120},
+                    {field: 'shopid', title: '商户号',width:120},
+                    {field: 'shopname', title: '商户名称',width:120},
+                    {field: 'revertamt', title: '退货金额',width:120},
+                    {field: 'revertamt', title: '退货金额',width:120},
+                    {field: 'revbillno', title: '原系统流水号',width:120},
+                    {field: 'shopname', title: '商户名称',width:120},
+                    {field: 'termid',width:100, title: '终端号', sort: true},
+                    {
+                        field: 'status',
+                        title: '交易标志',
+                        width:100,
+                        align: 'center',
+                        templet: function (item) {
+                            return getTempDictValue('transtatusList',item.status);
+                        }
+                    },
+                    {
+                        field: 'status',
+                        title: '应答码',
+                        width:100,
+                        align: 'center',
+                        templet: function (item) {
+                            return getTempDictValue('transtatusList',item.status);
+                        }
+                    },
+                    {
+                        field: 'transtype',
+                        title: '流水类型',
+                        width:100,
+                        sort: true,
+                        align: 'center',
+                        templet: function (item) {
+                            return getTempDictValue('transtypeList',item.transtype);
+                        }
+                    },
+                    {field: 'revertamt', title: '退货金额', width:100},
+                    {field: 'cleartype', title: '清算类别', width:100},
+                    {field: 'servicetype', title: '业务类别', width:100},
+                ]
+            ]
+        });
+        $('#vtransdtl-btn-export').click(function () {
+            var url = '[[@{/transdtl/exportview}]]';
+            /* $("#form").attr("action",url);
+
+             $("#form").submit();*/
+            var param = $("#vtransdtl-form").serialize();
+
+            $("#vtransdtl-btn-export").attr("href", url + "?" + param);
+            $("#vtransdtl-btn-export")[0].click();
+        });
+        // 搜索按钮点击事件
+        $('#vtransdtl-btn-search').click(function () {
+            let custname = $('#vtransdtl-custname').val().trim();
+        //    let shopid = $('#vtransdtl-shopid').val().trim();
+            let startdate = $('#vtransdtl-startdate').val();
+            let enddate = $('#vtransdtl-enddate').val();
+            let refno = $('#vtransdtl-refno').val().trim();
+        //    let status = $('#vtransdtl-status').val();
+            let termid = $('#vtransdtl-termid').val().trim();
+            table.reload('vtransdtl-table', {
+                where: {
+                    custname: custname,
+             //       shopid: shopid,
+                    startdate: startdate,
+                    enddate: enddate,
+                    billno: refno,
+              //      status: status,
+                    termid: termid
+                }, page: {curr: 1}
+            });
+            //页面存在form需要返回false，否则layui自动刷新
+            return false;
+
+
+        });
+
+        $('#vtransdtl-btn-reset').click(function () {
+            $(".layui-input").val("");
+            $("select").val("");
+            $("#vtransdtl-startdate").val(startdate);
+            $("#vtransdtl-enddate").val(enddate);
+            return false;
+
+        });
+
+    });
+
+
+    // 工具条点击事件
+
+</script>
diff --git a/src/main/resources/templates/system/operator/index.html b/src/main/resources/templates/system/operator/index.html
index 6cbcf98..7531ec8 100644
--- a/src/main/resources/templates/system/operator/index.html
+++ b/src/main/resources/templates/system/operator/index.html
@@ -42,6 +42,7 @@
 <script type="text/html" id="oper-table-bar">
     <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
     <a class="layui-btn layui-btn-xs" lay-event="resetpwd">重置密码</a>
+    <a class="layui-btn layui-btn-xs" lay-event="setauth">设置查询权限</a>
 </script>
 
 <script>
@@ -76,8 +77,8 @@
                             }
                         }
                     },
-                    {field: 'mobile', sort: true, title: '手机号'},
-                    {field: 'email', sort: true, title: '电子邮箱'},
+                    {field: 'mobile', sort: true,width: 140, title: '手机号'},
+                 /*   {field: 'email', sort: true, title: '电子邮箱'},*/
                     {field: 'opendate', sort: true, width: 120, title: '注册日期'},
                     {align: 'center', toolbar: '#oper-table-bar', title: '操作', fixed: 'right'}
                 ]
@@ -168,6 +169,16 @@
                         layer.msg('请求失败了，请稍后再试', {icon: 2});
                     });
                 });
+            } else if (layEvent === 'setauth') { //
+                let title = '查询权限分配';
+                admin.putTempData('t_user', data);
+                admin.popupCenter({
+                    title: title,
+                    path: '[[@{/operator/getquerylimit}]]'+'?opercode='+data.opercode,
+                    finish: function () {
+                        table.reload('oper-table', {});
+                    }
+                });
             }
         });
 
diff --git a/src/main/resources/templates/system/operator/limitform.html b/src/main/resources/templates/system/operator/limitform.html
new file mode 100644
index 0000000..ccce8b8
--- /dev/null
+++ b/src/main/resources/templates/system/operator/limitform.html
@@ -0,0 +1,110 @@
+
+<form id="form" lay-filter="form" class="layui-form model-form">
+    <input name="opercode" id="querylimit-id" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label"><span style="color: red">* </span>名称</label>
+        <div class="layui-input-block">
+            <input disabled name="opername" placeholder="" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|devphyid" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"><span style="color: red">* </span>权限</label>
+        <div class="layui-input-block">
+            <input id="search-querylimit-form-devgroupid" type="text" name="devgroupid"
+                   lay-filter="search-querylimit-form-devgroupid-filter" autocomplete="off"
+                   class="layui-input"/>
+        </div>
+
+    </div>
+    <input type="hidden" id="updatelimit-form-limit" th:value="${limit}" />
+
+    <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="updatelimit-form-submit" lay-submit id="submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects','treeSelect'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var treeSelect = layui.treeSelect;
+        form.render('select');
+        form.render('radio');
+
+        treeSelect.render({
+            elem: '#search-querylimit-form-devgroupid',
+            data: '[[@{/device/binddevparagrouptree}]]',
+            type: 'get',
+            placeholder: '选择设备组',
+            search: false,
+            style: {
+                folder: {
+                    enable: false
+                },
+                line: {
+                    enable: true
+                }
+            },
+            // 点击回调
+            click: function (d) {
+                var treeNode = d.current;
+                return true;
+            },
+            success: function (d) {
+                let limit= $("#updatelimit-form-limit").val();
+
+                treeSelect.checkNode(
+                    'search-querylimit-form-devgroupid-filter',
+                    limit);
+            }
+        });
+
+        var url = '[[@{/operator/updatelimit}]]';
+
+        // 回显user数据
+        var dev = admin.getTempData('t_user');
+        if (dev) {
+             $('input[name="opercode"]').attr('readonly', 'readonly');
+            form.val('form', dev);
+        }
+
+        form.on('submit(updatelimit-form-submit)', function (data) {
+            console.log(data.field);
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                data: JSON.stringify(data.field),
+                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 {
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error: function () {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
