diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/AtteRestInfo.java b/src/main/java/com/supwisdom/dlpay/atte/bean/AtteRestInfo.java
index 2c280ec..c7392b2 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/bean/AtteRestInfo.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/AtteRestInfo.java
@@ -1,17 +1,22 @@
 package com.supwisdom.dlpay.atte.bean;
 
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+
 public class AtteRestInfo {
+
     private String id; //请假条编号
     private String custid;
     private String custname;
-    private String custtypeid;
+    private Integer custtypeid;
     private String custtypename;
     private String cardno;
     private String startdate;
     private String enddate;
     private String remark;
-    private String rtype;
-    private String status;
+    private Integer rtype;
+    private Integer status;
     private String recustid;
     private String recustname;
     private String updatetime;
@@ -34,11 +39,11 @@
         this.custname = custname;
     }
 
-    public String getCusttypeid() {
+    public Integer getCusttypeid() {
         return custtypeid;
     }
 
-    public void setCusttypeid(String custtypeid) {
+    public void setCusttypeid(Integer custtypeid) {
         this.custtypeid = custtypeid;
     }
 
@@ -82,19 +87,19 @@
         this.remark = remark;
     }
 
-    public String getRtype() {
+    public Integer getRtype() {
         return rtype;
     }
 
-    public void setRtype(String rtype) {
+    public void setRtype(Integer rtype) {
         this.rtype = rtype;
     }
 
-    public String getStatus() {
+    public Integer getStatus() {
         return status;
     }
 
-    public void setStatus(String status) {
+    public void setStatus(Integer status) {
         this.status = status;
     }
 
@@ -145,4 +150,6 @@
     public void setDeptname(String deptname) {
         this.deptname = deptname;
     }
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/RestSearchBean.java b/src/main/java/com/supwisdom/dlpay/atte/bean/RestSearchBean.java
index 01342ea..6d26e33 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/bean/RestSearchBean.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/RestSearchBean.java
@@ -6,9 +6,9 @@
     private String custid;
     private String deptcode;
     private String custname;
-    private String status;
-    private String rtype;
-    private String custtypeid;
+    private Integer status;
+    private Integer rtype;
+    private Integer custtypeid;
 
     public String getStartdate() {
         return startdate;
@@ -50,27 +50,27 @@
         this.custname = custname;
     }
 
-    public String getStatus() {
+    public Integer getStatus() {
         return status;
     }
 
-    public void setStatus(String status) {
+    public void setStatus(Integer status) {
         this.status = status;
     }
 
-    public String getRtype() {
+    public Integer getRtype() {
         return rtype;
     }
 
-    public void setRtype(String rtype) {
+    public void setRtype(Integer rtype) {
         this.rtype = rtype;
     }
 
-    public String getCusttypeid() {
+    public Integer getCusttypeid() {
         return custtypeid;
     }
 
-    public void setCusttypeid(String custtypeid) {
+    public void setCusttypeid(Integer custtypeid) {
         this.custtypeid = custtypeid;
     }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java b/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java
index 1b7a009..d0ee441 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java
@@ -50,7 +50,7 @@
     public Map addRest(@RequestParam("custid") String custid,
                        @RequestParam("enddate") String enddate,
                        @RequestParam("startdate") String startdate,
-                       @RequestParam("rtype") String rtype,
+                       @RequestParam("rtype") Integer rtype,
                        @RequestParam("remark") String remark,
                        HttpServletRequest request){
         Map map=new HashMap();
@@ -60,7 +60,8 @@
             atteRest.setStartdate(startdate);
             atteRest.setEnddate(enddate);
             atteRest.setRemark(remark);
-            atteRest.setStatus("0");
+            atteRest.setStatus(0);
+            atteRest.setRtype(rtype);
             atteRest.setUpdatetime(DateUtil.getNow());
             if(!atteRestService.saveAtteRest(atteRest)){
                 map.put("errStr","添加数据失败!");
@@ -79,8 +80,8 @@
      */
     @RequestMapping(value = "/getrestlist", method = RequestMethod.POST)
     @ResponseBody
-    public Map getRestList(@RequestParam("rtype") String rtype,
-                           @RequestParam("status") String status,
+    public Map getRestList(@RequestParam("rtype") Integer rtype,
+                           @RequestParam("status") Integer status,
                            @RequestParam("custid") String custid,
                            @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
                            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
@@ -124,7 +125,7 @@
         model.addObject("custid",custid);
         model.setViewName("atte/app/index");
         List<TCustType> custtypelist=systemService.findAllCusttype();
-
+        model.addObject("custtypelist",custtypelist);
         return model;
     }
     /**
@@ -132,16 +133,16 @@
      */
     @RequestMapping(value = "/getreviewlist", method = RequestMethod.POST)
     @ResponseBody
-    public Map getreviewlist(@RequestParam("rtype") String rtype,
+    public Map getreviewlist(@RequestParam("rtype") Integer rtype,
                              @RequestParam("custid") String custid,
-                             @RequestParam(value = "custtypeid", required = false, defaultValue = "") String custtypeid,
+                             @RequestParam(value = "custtypeid", required = false, defaultValue = "") Integer custtypeid,
                              @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
                              @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
                              HttpServletRequest request){
 
       Map map=new HashMap();
         RestSearchBean searchBean=new RestSearchBean();
-        searchBean.setStatus("0");
+        searchBean.setStatus(0);
         searchBean.setCusttypeid(custtypeid);
         searchBean.setRtype(rtype);
         TCustomer cust=webInterfaceService.findCustomerById(custid);
diff --git a/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java b/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
index ce6329e..ba64171 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
@@ -2,12 +2,14 @@
 
 import com.supwisdom.dlpay.atte.bean.AtteReport;
 import com.supwisdom.dlpay.atte.bean.AttedtlSearchBean;
+import com.supwisdom.dlpay.atte.bean.RestSearchBean;
 import com.supwisdom.dlpay.atte.bean.Sum;
 import com.supwisdom.dlpay.atte.domain.TAtteClass;
 import com.supwisdom.dlpay.atte.domain.TAtteDtl;
 import com.supwisdom.dlpay.atte.domain.TSeaCusttype;
 import com.supwisdom.dlpay.atte.domain.TSeason;
 import com.supwisdom.dlpay.atte.service.AtteClassService;
+import com.supwisdom.dlpay.atte.service.AtteRestService;
 import com.supwisdom.dlpay.atte.service.CustseaService;
 import com.supwisdom.dlpay.atte.service.SeasonService;
 import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
@@ -63,6 +65,8 @@
     private SystemUtilService systemUtilService;
     @Autowired
     private ManagerService managerService;
+    @Autowired
+    private AtteRestService atteRestService;
 
     @GetMapping("/rule/index")
     public String seasonindex(){
@@ -981,12 +985,49 @@
         return "atte/report/print/p_printindex";
     }
 
-    public static void main(String[] args) {
-        String s1=DateUtil.getNow("yyyyMMdd")+"140000";
-        String s2=DateUtil.getNow("yyyyMMdd")+"143000";
-        long dif=DateUtil.getInterval(s1,s2);
-        System.out.println(dif);
-        System.out.println((int)(dif/(1000*60)));
+    /**
+     *    查询假单
+     * @param
+     */
+    @GetMapping("/rest/index")
+    public String restindex(){
+        return "atte/rest/index";
+    }
+
+    @ResponseBody
+    @RequestMapping(value="/rest/list",method = {RequestMethod.POST})
+    public Map getrestlist(HttpServletRequest request,
+                                HttpServletResponse response,
+                                @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                                @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                                @RequestParam(value = "startdate") String  startdate,
+                                @RequestParam(value = "enddate") String  enddate,
+                                @RequestBody RestSearchBean searchBean,
+                                @AuthenticationPrincipal TOperator operUser) {
+        searchBean.setStartdate(startdate);
+        searchBean.setEnddate(enddate);
+        Map map=new HashMap();
+        try {
+            Pagination page=null;
+            String opertype=operUser.getOpertype();
+            String deptcode=operUser.getDeptcode();
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                deptcode=null;
+            }else {
+                if(StringUtil.isEmpty(deptcode)){
+                    deptcode="-99";
+                }
+            }
+            searchBean.setDeptcode(deptcode);
+            page=atteRestService.getRestInfo(searchBean,pageNo,pageSize);
+            map.put("PageResult",page);
+            List<TCustType> custtypelist=systemService.findAllCusttype();
+            map.put("custtypelist",custtypelist);
+        }catch (Exception e) {
+            e.printStackTrace();
+            log.error("查询假单失败：" + e.getMessage());
+        }
+        return map;
     }
 
 
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteRestDaoImpl.java b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteRestDaoImpl.java
index 767114f..3e61c17 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteRestDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteRestDaoImpl.java
@@ -1,15 +1,12 @@
 package com.supwisdom.dlpay.atte.dao.impl;
 
-import com.supwisdom.dlpay.atte.bean.AtteDetailInfo;
 import com.supwisdom.dlpay.atte.bean.AtteRestInfo;
 import com.supwisdom.dlpay.atte.bean.RestSearchBean;
 import com.supwisdom.dlpay.atte.dao.AtteRestDao;
-import com.supwisdom.dlpay.atte.domain.TAtteClass;
 import com.supwisdom.dlpay.atte.domain.TAtteRest;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.system.page.Pagination;
 import org.hibernate.query.internal.NativeQueryImpl;
-import org.hibernate.transform.ResultTransformer;
 import org.hibernate.transform.Transformers;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -70,12 +67,12 @@
     public Pagination getRestInfo(RestSearchBean searchBean,int pageNo,int pageSize) {
         StringBuffer sql=new StringBuffer();
         sql.append(" select r.id,c.custid,c.custname,ct.custtypeid,ct.custtypename,tc.cardno,r.startdate,r.enddate,r.remark,r.rtype,r.status,r.updatetime  ");
-        sql.append(" ,td.deptcode,td.deptname,r.re_custid,(select custname from t_customer where custid=r.re_custid) recustname ");
+        sql.append(" ,td.deptcode,td.deptname,r.re_custid recustid,(select custname from t_customer where custid=r.re_custid) recustname ");
         sql.append(" from t_atte_rest r left join t_customer c on r.custid=c.custid ")
                 .append(" left join t_card tc on r.custid=tc.custid ")
                 .append(" left join tb_custtype ct on c.custtypeid=ct.custtypeid ")
                 .append(" left join tb_dept td on c.deptcode=td.deptcode ")
-                .append(" where c.status='1' and tc.status='normal' and tc.transtatus='normal' ");
+                .append(" where r.status != '4' and c.status='1' and tc.status='normal' and tc.transtatus='normal' ");
             if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
                 sql.append(" and ( (:sdate between r.startdate and r.enddate) or (:edate between r.startdate and r.enddate) ");
                 sql.append(" or (:sdate < r.startdate and :edate > r.enddate ) )");
@@ -89,14 +86,17 @@
             if(!StringUtil.isEmpty(searchBean.getCustname())){
                 sql.append(" and c.custname like :cname ");
             }
-            if(!StringUtil.isEmpty(searchBean.getStatus())){
+            if(searchBean.getStatus()!=null){
                 sql.append(" and r.status= :stat ");
             }
-            if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            if(searchBean.getCusttypeid()!=null){
                 sql.append(" and c.custtypeid= :ctypeid ");
             }
+            if(searchBean.getRtype()!=null){
+                sql.append(" and r.rtype = :rte ");
+            }
             sql.append(" order by r.startdate desc,r.enddate desc ");
-            Query query=entityManager.createNativeQuery(sql.toString(), AtteRestInfo.class);
+            Query query=entityManager.createNativeQuery(sql.toString());
         if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
             query.setParameter("sdate",searchBean.getStartdate());
             query.setParameter("edate",searchBean.getEnddate());
@@ -110,11 +110,14 @@
         if(!StringUtil.isEmpty(searchBean.getCustname())){
             query.setParameter("cname","%"+searchBean.getCustname()+"%");
         }
-        if(!StringUtil.isEmpty(searchBean.getStatus())){
+        if(searchBean.getStatus()!=null){
             query.setParameter("stat",searchBean.getStatus());
         }
-        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
-            query.setParameter("ctypeid",Integer.parseInt(searchBean.getCusttypeid()));
+        if(searchBean.getCusttypeid()!=null){
+            query.setParameter("ctypeid",searchBean.getCusttypeid());
+        }
+        if(searchBean.getRtype()!=null){
+            query.setParameter("rte",searchBean.getRtype());
         }
         pageNo = pageNo <= 0 ? 1 : pageNo;
         query.setFirstResult((pageNo - 1) * pageSize);
@@ -132,12 +135,12 @@
 
     public int getRestCount(RestSearchBean searchBean){
         StringBuffer sql=new StringBuffer();
-        sql.append(" select count(*)");
+        sql.append(" select count(r.id)");
         sql.append(" from t_atte_rest r left join t_customer c on r.custid=c.custid ")
                 .append(" left join t_card tc on r.custid=tc.custid ")
                 .append(" left join tb_custtype ct on c.custtypeid=ct.custtypeid ")
                 .append(" left join tb_dept td on c.deptcode=td.deptcode ")
-                .append(" where c.status='1' and tc.status='normal' and tc.transtatus='normal' ");
+                .append(" where r.status != '4'  and c.status='1' and tc.status='normal' and tc.transtatus='normal' ");
         if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
             sql.append(" and ( (:sdate between r.startdate and r.enddate) or (:edate between r.startdate and r.enddate) ");
             sql.append(" or (:sdate < r.startdate and :edate > r.enddate ) )");
@@ -151,14 +154,17 @@
         if(!StringUtil.isEmpty(searchBean.getCustname())){
             sql.append(" and c.custname like :cname ");
         }
-        if(!StringUtil.isEmpty(searchBean.getStatus())){
+        if(searchBean.getStatus()!=null){
             sql.append(" and r.status= :stat ");
         }
-        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+        if(searchBean.getCusttypeid()!=null){
             sql.append(" and c.custtypeid= :ctypeid ");
         }
-        sql.append(" order by r.startdate desc,r.enddate desc ");
-        Query query=entityManager.createNativeQuery(sql.toString(), AtteRestInfo.class);
+        if(searchBean.getRtype()!=null){
+            sql.append(" and r.rtype = :rte ");
+        }
+//        sql.append(" order by r.startdate desc,r.enddate desc ");
+        Query query=entityManager.createNativeQuery(sql.toString());
         if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
             query.setParameter("sdate",searchBean.getStartdate());
             query.setParameter("edate",searchBean.getEnddate());
@@ -172,11 +178,14 @@
         if(!StringUtil.isEmpty(searchBean.getCustname())){
             query.setParameter("cname","%"+searchBean.getCustname()+"%");
         }
-        if(!StringUtil.isEmpty(searchBean.getStatus())){
+        if(searchBean.getStatus()!=null){
             query.setParameter("stat",searchBean.getStatus());
         }
-        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
-            query.setParameter("ctypeid",Integer.parseInt(searchBean.getCusttypeid()));
+        if(searchBean.getCusttypeid()!=null){
+            query.setParameter("ctypeid",searchBean.getCusttypeid());
+        }
+        if(searchBean.getRtype()!=null){
+            query.setParameter("rte",searchBean.getRtype());
         }
         int cnt=0;
         Object obj=query.getSingleResult();
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteRest.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteRest.java
index fb70fa3..dbef9b8 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteRest.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteRest.java
@@ -17,10 +17,10 @@
     private String startdate;
     @Column(name="enddate",length= 8)
     private String enddate;
-    @Column(name="remark",length = 255 )
+    @Column(name="remark",length = 60 )
     private String remark;
     @Column(name="status",length = 4)
-    private String status;  // 0-未审核 1-已通过 2-未通过 3-取消
+    private Integer status;  // 0-未审核 1-已通过 2-未通过 3-取消 4-删除
     @Column(name="updatetime",length = 14)
     private String updatetime;
     @Column(name="re_custid",length = 32)
@@ -74,11 +74,11 @@
         this.remark = remark;
     }
 
-    public String getStatus() {
+    public Integer getStatus() {
         return status;
     }
 
-    public void setStatus(String status) {
+    public void setStatus(Integer status) {
         this.status = status;
     }
 
diff --git a/src/main/resources/templates/atte/rest/index.html b/src/main/resources/templates/atte/rest/index.html
new file mode 100644
index 0000000..eee12fa
--- /dev/null
+++ b/src/main/resources/templates/atte/rest/index.html
@@ -0,0 +1,500 @@
+<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 id="restapp">
+            <el-form :inline="true" ref="preportform" :model="preportform" data-parsley-validate class="form-horizontal form-label-left">
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">开始日期:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-date-picker style="width: 100%"
+                                    v-model="preportform.startdate" type="date"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">结束日期:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-date-picker style="width: 100%"
+                                    v-model="preportform.enddate" type="date"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">请假类别:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-select v-model="preportform.rtype" style="width:100%;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="rtype in rtypelist"
+                                        :key="rtype.value"
+                                        :label="rtype.label"
+                                        :value="rtype.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">姓名:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="preportform.custname" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">人员类别:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-select v-model="preportform.custtypeid" style="width:100%;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="custtypeid in custtypelist"
+                                        :key="custtypeid.value"
+                                        :label="custtypeid.label"
+                                        :value="custtypeid.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">状态:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-select v-model="preportform.status" style="width:100%;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="status in statuslist"
+                                        :key="status.value"
+                                        :label="status.label"
+                                        :value="status.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                    </div>
+                </div>
+
+
+                <div    class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;"></span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                        <button type="button" class="btn btn-info" @click="query" id="attedtl_qrybtn">查 询</button>
+                        </div>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singleTable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        border
+                        max-height="2000"
+                        style="width: 100%">
+
+                    <el-table-column
+                            prop="custname"
+                            label="姓名"
+                            sortable
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="cardno"
+                            label="卡号"
+                            sortable
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="custtypename"
+                            label="人员类别"
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="deptname"
+                            label="部门"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="startdate"
+                            label="开始日期"
+
+                            >
+                    </el-table-column>
+                    <el-table-column
+                            prop="enddate"
+                            label="截止日期"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="rtype"
+                            label="请假类型"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="status"
+                            label="状态"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="remark"
+                            label="请假事由"
+                    >
+                    </el-table-column>
+
+                </el-table>
+                <div class="clearfix"></div>
+                <el-pagination
+                        @size-change="handleSizeChange"
+                        @current-change="currPageChange"
+                        :current-page="currPage"
+                        :page-sizes="[10, 20, 50, 100]"
+                        :page-size="pageSize"
+                        layout="prev, pager, next,sizes, jumper,total"
+                        :total="totSize">
+                </el-pagination>
+            </template>
+
+        </div>
+
+
+    </div>
+</div>
+
+<script>
+    var polreport_vue = new Vue({
+        el: '#restapp',
+        data:{
+            tableData: [],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            rtypelist:[{value:11,label:'事假'},{value:12,label:'病假'},{value:13,label:'年假'},{value:14,label:'调休'},{value:15,label:'调休'}],
+            statuslist:[{value:0,label:'未审核'},{value:1,label:'已通过'},{value:2,label:'未通过'},{value:3,label:'取消'}],
+            preportform:{
+                startdate:Date.now(),
+                enddate:Date.now(),
+                custname:'',
+                custtypeid:'',
+                rtype:'',
+                status:''
+            },
+            timegrplist:[],
+            custtypelist:[],
+            deptlist:[],
+            dialogFormVisible: false,
+            dlgAllotDevVisible:false,
+            updatetitle:'修改考勤状态',
+            dtlDiaForm:{
+                atteno:'',
+                custname:'',
+                state:'',
+                remark:''
+            },
+            rules: {
+                season: [
+                    { required: true, message: '请输入时令名', trigger: 'blur' },
+                    { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'}
+                ],
+
+
+            },
+
+        },
+        methods: {
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                attedtl_commonQuery(this,this.currPage,val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                attedtl_commonQuery(this,this.currPage,this.pageSize);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            attedatefor:function(row){
+                if(row.attedate!= null){
+                    return dateformatter(row.attedate);
+                }
+            },
+            statimefor:function(row){
+                if(row.statime!= null){
+                    return timeformatter(row.statime);
+                }
+            },
+            statefor:function(row){
+                if(row.state!= null){
+                    return state_grpname(row.state);
+                }
+            },
+            oldstatefor:function(row){
+                if(row.oldstate!= null){
+                    return state_grpname(row.oldstate);
+                }
+            },
+            timenamefor:function(row){
+                if(row.timeid!=null){
+                    return timeid_grpname(row.timeid);
+                }
+            },
+            query:function () {
+                this.pagesize=10;
+                this.currPage=1;
+                attedtl_commonQuery(this,this.currPage,this.pageSize);
+            },
+            print:function () {
+                that=this;
+                print(that);
+            },
+            resetForm:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            closeDialog:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+
+            custtypefor:function (row) {
+                return custtype_grpname(row.custtypeid);
+            },
+            deptfor:function (row) {
+                return dept_grpname(row.deptcode);
+            },
+            refreshdtl:function (){
+                var _that=this;
+                refreshAtteDtl(_that);
+            }
+
+        },
+        created:function(){
+            var _self=this;
+            var token=$("meta[name='_csrf_token']").attr("value");
+            var startdate=class_Formatdate(_self.preportform.startdate);
+            var enddate=class_Formatdate(_self.preportform.enddate);
+            $.ajax({
+                type:"post",
+                dataType:"json",
+                url:"[[@{/atte/rest/list?startdate=}]]"+startdate+"&enddate="+enddate+"&pageNo="+"&pageSize=",
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data:JSON.stringify(_self.preportform),
+                success:function(ret){
+                    _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                    if(_self.totSize == 0 ){
+                        layer.msg("暂无数据", {icon: 2, time: 1000});
+                    }
+                    var custtypelist = [];
+                    var types=ret.custtypelist;
+                    for (var i = 0; i < types.length; i++) {
+                        custtypelist.push({
+                            value: types[i].custtypeid,
+                            label: types[i].custtypename
+                        });
+                    }
+                    _self.custtypelist=custtypelist;
+
+                }
+            })
+        }
+
+    })
+    function refreshAtteDtl(that){
+        var startdate=class_Formatdate(that.preportform.startdate);
+        var enddate=class_Formatdate(that.preportform.enddate);
+        if(startdate== '' || enddate=='') {
+            layer.msg("请选择日期", {icon: 2, time: 1000});
+            return;
+        }
+        if(startdate>enddate){
+            layer.msg("开始日期不能大于结束日期！", {icon: 2, time: 1000});
+            return;
+        }
+        layer.confirm('你确定要刷新所选日期的流水吗?', {icon: 3, title:'请确认',offset:'30%'},function (){
+
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"[[@{/atte/adddtlbyhand?enddate=}]]"+enddate+"&startdate="+startdate,
+                success:function(ret){
+                    layer.msg('保存信息成功!', {icon: 1, time: 1000});
+                    dtl_refreshThisTable();
+                }
+            })
+        })
+    }
+    function dateformatter(time){
+        return time.substr(0,4)+'-'+time.substr(4,2)+'-'+time.substr(6,2);
+    }
+    function timeformatter(time){
+        return time.substr(0,2)+':'+time.substr(2,2)+':'+time.substr(4,2);
+    }
+
+    function dept_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = polreport_vue.deptlist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function custtype_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = polreport_vue.typegrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function state_grpname(grpid){
+        if(grpid!=null){
+            var list = polreport_vue.stategrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+
+    function timeid_grpname(grpid){
+        if(grpid!=null){
+            var list = polreport_vue.timegrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function class_Formatdate(date){
+        if(date==null||date==''){
+            return '';
+        }
+        var d=new Date(date);
+        var month=d.getMonth() + 1+'';
+        var date=d.getDate()+'';
+        if(month.length==1){
+            month='0'+month;
+        }
+        if(date.length==1){
+            date='0'+date;
+        }
+        var formated=d.getFullYear() + '' + month + '' +date;
+
+        return formated;
+    }
+    function attedtl_commonQuery(_self,pageno,pagesize) {
+
+        var token=$("meta[name='_csrf_token']").attr("value");
+        var startdate=class_Formatdate(_self.preportform.startdate);
+        var enddate=class_Formatdate(_self.preportform.enddate);
+        $.ajax({
+            type:"post",
+            dataType:"json",
+            url:"[[@{/atte/rest/list?startdate=}]]"+startdate+"&enddate="+enddate+"&pageNo="+pageno+"&pageSize="+pagesize,
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data:JSON.stringify(_self.preportform),
+            success:function(ret){
+                _self.totSize=ret.PageResult.totalCount;
+                _self.tableData=ret.PageResult.list;
+                if(_self.totSize == 0 ){
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+
+            }
+        })
+    }
+
+    function dtl_getFillData(_self,row){
+            _self.dtlDiaForm.atteno=row.atteno;
+            _self.dtlDiaForm.custname=row.custname;
+            _self.dtlDiaForm.state=row.state;
+            _self.dtlDiaForm.remark=row.remark;
+    }
+
+    function attedtl_saveData(_that,formName) {
+            var atteno=_that.dtlDiaForm.atteno;
+            var state=_that.dtlDiaForm.state;
+            var remark=_that.dtlDiaForm.remark;
+            if(remark==null){
+                remark='';
+            }
+            var token=$("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                url: '[[@{/atte/updatetimeDtl?atteno=}]]'+atteno+"&state="+state+"&remark="+remark,
+                dataType: "json",
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                success: function (data) {
+                    if (data.errStr == undefined) {
+                        layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
+                        window.location = "login";
+                        return;
+                    }
+                    if (data.errStr != "") {
+                        layer.msg(data.errStr, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg('保存信息成功!', {icon: 1, time: 1000});
+                        _that.dialogFormVisible = false;
+                        dtl_refreshThisTable();
+                        _that.$refs[formName].resetFields();
+                    }
+                }
+            })
+
+    }
+
+    function dtl_refreshThisTable(){
+        attedtl_commonQuery(polreport_vue,polreport_vue.currPage,polreport_vue.pageSize);
+    };
+    
+
+
+
+</script>
\ No newline at end of file
