diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java b/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java
index 2ed3328..7f9fc76 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java
@@ -61,6 +61,18 @@
 
         return "visitormanage/customer/index";
     }
+    @RequestMapping("/showchecklist")
+    public String showchecklist(ModelMap model) {
+        List<TCustType> lst = systemService.findAllCusttype();
+        List<TDept> dept=systemService.findAllDept();
+        Gson gson = new Gson();
+        String deptString = gson.toJson(dept);
+        model.put("deptlist", deptString);
+        String typeString = gson.toJson(lst);
+        model.put("custtypelist", typeString);
+
+        return "visitormanage/customer/visitorchecklist";
+    }
     @RequestMapping("/checkin")
     public String visitorcheck(ModelMap model) {
         List<TCustType> lst = systemService.findAllCusttype();
@@ -106,6 +118,38 @@
             return new PageResult<>(99, "系统查询错误");
         }
     }
+    @RequestMapping("/checklist")
+    @ResponseBody
+    public PageResult<VisitorShowBean> getCheckList(@RequestParam("page") Integer pageNo,
+                                               @RequestParam("limit") Integer pageSize,
+                                               @RequestParam(value = "searchkey", required = false) String searchKey,
+                                               @RequestParam(value = "sex", required = false) String sex,
+                                               @RequestParam(value = "startdate", required = false) String startdate,
+                                               @RequestParam(value = "enddate", required = false) String enddate
+    ) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            VisitorCheckSearchBean searchBean = new VisitorCheckSearchBean();
+            if(startdate!=null){
+                startdate=startdate.replace("-","");
+            }if(enddate!=null){
+                enddate=enddate.replace("-","");
+            }
+            searchBean.setPageNo(pageNo);
+            searchBean.setVisitorname(searchKey);
+            searchBean.setSex(sex);
+            searchBean.setStartdate(startdate);
+            searchBean.setEnddate(enddate);
+            searchBean.setPageSize(pageSize);
+            PageResult<VisitorShowBean> bean= visitormanageService.getCheckInfoPage(searchBean);
+
+            return bean;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
 
 
 
@@ -149,6 +193,7 @@
     public Map saveVisitorCheck (@RequestBody VisitorCheckBean postData){
         Map map = new HashMap();
         try{
+            String time = DateUtil.getNow("yyyyMMddhhmmss");
             EVisitorCheckDtl eVisitorCheckDtl=new EVisitorCheckDtl();
             eVisitorCheckDtl.setCompany(postData.getCompany());
             eVisitorCheckDtl.setCustid(postData.getCustid());
@@ -156,7 +201,11 @@
             eVisitorCheckDtl.setPhone(postData.getPhone());
             eVisitorCheckDtl.setRemarks(postData.getRemarks());
             eVisitorCheckDtl.setVisitorname(postData.getVisitorname());
-            eVisitorCheckDtl.setTime(DateUtil.getNow("yyyyMMddhhmmss"));
+            eVisitorCheckDtl.setTransdate(time.substring(0,8));
+            eVisitorCheckDtl.setStatus(1);
+            eVisitorCheckDtl.setIdno(postData.getIdno());
+            eVisitorCheckDtl.setSex(postData.getSex());
+            eVisitorCheckDtl.setTranstime(time.substring(8));
 
             boolean b = visitormanageService.saveVisitorCheck(eVisitorCheckDtl);
             if(b){
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java
index 920b9f5..7e6f387 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java
@@ -5,9 +5,7 @@
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.mainservice.domain.TCustomer;
 import com.supwisdom.dlpay.system.domain.TRegion;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorCheckDtl;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
-import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+import com.supwisdom.dlpay.visitormanage.domain.*;
 
 import java.util.List;
 
@@ -19,5 +17,6 @@
 
 
     public PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean param);
+    public PageResult<VisitorShowBean> getCheckInfoPage(VisitorCheckSearchBean param);
     public boolean saveVisitorCheck(EVisitorCheckDtl bean);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/dao/impl/VisitorDaoImpl.java b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/impl/VisitorDaoImpl.java
index a877d1d..421d5c7 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/dao/impl/VisitorDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/impl/VisitorDaoImpl.java
@@ -8,9 +8,7 @@
 import com.supwisdom.dlpay.mainservice.domain.TCustomer;
 import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.visitormanage.dao.VisitorDao;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorCheckDtl;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
-import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+import com.supwisdom.dlpay.visitormanage.domain.*;
 import org.hibernate.query.internal.NativeQueryImpl;
 import org.hibernate.transform.Transformers;
 import org.springframework.stereotype.Repository;
@@ -85,6 +83,58 @@
     }
     @Transactional
     @Override
+    public PageResult<VisitorShowBean> getCheckInfoPage(VisitorCheckSearchBean param) {
+
+        String visitorname = param.getVisitorname();
+        String sex = param.getSex();
+        String startdate = param.getStartdate();
+        String enddate = param.getEnddate();
+        String sql = "select a.visitorname,a.idno,a.phone,a.transdate,a.transtime,a.deptcode,a.custid,a.company,a.sex,a.remarks,b.custname,c.deptname from E_VISITOR_CHECK_DTL a left join t_customer b on a.custid=b.custid left join tb_dept c on c.deptcode=a.deptcode " +
+                " where a.status='1'   ";
+        String countSql = "select count(*) as cnt  from E_VISITOR_CHECK_DTL a left join t_customer b on a.custid=b.custid left join tb_dept c on c.deptcode=a.deptcode  " +
+                " where a.status='1' ";
+
+        if (!StringUtil.isEmpty(visitorname)){
+            sql += " and a.visitorname like :visitorname ";
+            countSql += " and a.visitorname like :visitorname ";
+        }if (!StringUtil.isEmpty(sex)){
+            sql += " and a.sex = :sex ";
+            countSql += " and a.sex = :sex ";
+        }if (!StringUtil.isEmpty(startdate)){
+            sql += " and a.transdate >= :startdate ";
+            countSql += " and a.transdate >= :startdate ";
+        }if (!StringUtil.isEmpty(enddate)){
+            sql += " and a.transdate <= :enddate ";
+            countSql += " and a.transdate <= :enddate ";
+        }
+        sql +=" order by a.transtime desc ";
+
+
+        Query query = entityManager.createNativeQuery(sql);
+        Query countQuery = entityManager.createNativeQuery(countSql);
+        if (!StringUtil.isEmpty(visitorname)){
+            query.setParameter("visitorname", "%"+visitorname+"%");
+            countQuery.setParameter("visitorname", "%"+visitorname+"%");
+        }if (!StringUtil.isEmpty(sex)){
+            query.setParameter("sex", sex);
+            countQuery.setParameter("sex", sex);
+        }if (!StringUtil.isEmpty(startdate)){
+            query.setParameter("startdate", startdate);
+            countQuery.setParameter("startdate", startdate);
+        }if (!StringUtil.isEmpty(enddate)){
+            query.setParameter("enddate", enddate);
+            countQuery.setParameter("enddate", enddate);
+        }
+        query.setFirstResult((param.getPageNo() - 1) * param.getPageSize());
+        query.setMaxResults(param.getPageSize()); //分页显示
+
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(VisitorShowBean.class));
+        List<VisitorShowBean> list = query.getResultList();
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+    @Transactional
+    @Override
     public boolean saveVisitorCheck(EVisitorCheckDtl bean) {
         boolean flag=false;
         try {
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorCheckDtl.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorCheckDtl.java
index b02a952..564d5c8 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorCheckDtl.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorCheckDtl.java
@@ -11,10 +11,11 @@
 
     private int id;
     private String visitorname;
-    
+    private String idno;
     private Integer status;
     private String phone;
-    private String time;
+    private String transtime;
+    private String transdate;
     private String sex;
     private String deptcode;
     private String custid;
@@ -42,8 +43,15 @@
     public void setVisitorname(String visitorname) {
         this.visitorname = visitorname;
     }
+    @Column(name = "IDNO",length = 18)
 
+    public String getIdno() {
+        return idno;
+    }
 
+    public void setIdno(String idno) {
+        this.idno = idno;
+    }
 
     @Column(name = "STATUS", length = 1)
     public Integer getStatus() {
@@ -61,14 +69,27 @@
     public void setPhone(String phone) {
         this.phone = phone;
     }
-    @Column(name = "time", length = 14)
-    public String getTime() {
-        return time;
+    @Column(name = "TRANSTIME", length = 6)
+
+    public String getTranstime() {
+        return transtime;
     }
 
-    public void setTime(String time) {
-        this.time = time;
+    public void setTranstime(String transtime) {
+        this.transtime = transtime;
     }
+    @Column(name = "TRANSDATE", length = 8)
+
+    public String getTransdate() {
+        return transdate;
+    }
+
+    public void setTransdate(String transdate) {
+        this.transdate = transdate;
+    }
+
+
+
     @Column(name = "SEX", length = 1)
     public String getSex() {
         return sex;
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckBean.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckBean.java
index 0160852..2b465fc 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckBean.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckBean.java
@@ -9,7 +9,7 @@
 public class VisitorCheckBean {
 
     private String visitorname;
-    
+    private String idno;
     private String phone;
     private String time;
     private String sex;
@@ -19,10 +19,6 @@
     private String remarks;
 
 
-
-
-
-
     public String getVisitorname() {
         return visitorname;
     }
@@ -31,8 +27,13 @@
         this.visitorname = visitorname;
     }
 
+    public String getIdno() {
+        return idno;
+    }
 
-
+    public void setIdno(String idno) {
+        this.idno = idno;
+    }
 
     public String getPhone() {
         return phone;
@@ -41,6 +42,7 @@
     public void setPhone(String phone) {
         this.phone = phone;
     }
+
     public String getTime() {
         return time;
     }
@@ -48,6 +50,7 @@
     public void setTime(String time) {
         this.time = time;
     }
+
     public String getSex() {
         return sex;
     }
@@ -55,6 +58,7 @@
     public void setSex(String sex) {
         this.sex = sex;
     }
+
     public String getDeptcode() {
         return deptcode;
     }
@@ -62,6 +66,7 @@
     public void setDeptcode(String deptcode) {
         this.deptcode = deptcode;
     }
+
     public String getCustid() {
         return custid;
     }
@@ -69,6 +74,7 @@
     public void setCustid(String custid) {
         this.custid = custid;
     }
+
     public String getCompany() {
         return company;
     }
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckSearchBean.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckSearchBean.java
new file mode 100644
index 0000000..a5a8829
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckSearchBean.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.visitormanage.domain;
+
+import com.supwisdom.dlpay.system.bean.PageBean;
+
+public class VisitorCheckSearchBean extends PageBean {
+    private String visitorname;
+    private String startdate;
+    private String enddate;
+    private String sex;
+
+    public String getVisitorname() {
+        return visitorname;
+    }
+
+    public void setVisitorname(String visitorname) {
+        this.visitorname = visitorname;
+    }
+
+    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 String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorShowBean.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorShowBean.java
index d315796..000e877 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorShowBean.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorShowBean.java
@@ -2,57 +2,36 @@
 
 
 public class VisitorShowBean {
-    private String custid;
-    private Integer custtype;
-    private String custname;
+    private String visitorname;
     private String phone;
-    private String cardno;
-    private String cardphyid;
-    private String bankcardno;
+    private String idno;
+    private String transdate;
+    private String transtime;
     private String deptcode;
-    private String custtypeid;
-    private String checkstatus;
-    private String status;
+    private String deptname;
+    private String custid;
+    private String custname;
+    private String company;
+    private String remarks;
+    private String sex;
 
 
-    public String getDeptcode() {
-        return deptcode;
+    private Integer status;
+
+    public String getIdno() {
+        return idno;
     }
 
-    public void setDeptcode(String deptcode) {
-        this.deptcode = deptcode;
+    public void setIdno(String idno) {
+        this.idno = idno;
     }
 
-    public String getCusttypeid() {
-        return custtypeid;
+    public String getVisitorname() {
+        return visitorname;
     }
 
-    public void setCusttypeid(String custtypeid) {
-        this.custtypeid = custtypeid;
-    }
-
-    public String getCustid() {
-        return custid;
-    }
-
-    public void setCustid(String custid) {
-        this.custid = custid;
-    }
-
-    public Integer getCusttype() {
-        return custtype;
-    }
-
-    public void setCusttype(Integer custtype) {
-        this.custtype = custtype;
-    }
-
-    public String getCustname() {
-        return custname;
-    }
-
-    public void setCustname(String custname) {
-        this.custname = custname;
+    public void setVisitorname(String visitorname) {
+        this.visitorname = visitorname;
     }
 
     public String getPhone() {
@@ -63,45 +42,83 @@
         this.phone = phone;
     }
 
-    public String getCardno() {
-        return cardno;
+    public String getTransdate() {
+        return transdate;
     }
 
-    public void setCardno(String cardno) {
-        this.cardno = cardno;
+    public void setTransdate(String transdate) {
+        this.transdate = transdate;
     }
 
-    public String getCardphyid() {
-        return cardphyid;
+    public String getTranstime() {
+        return transtime;
     }
 
-    public void setCardphyid(String cardphyid) {
-        this.cardphyid = cardphyid;
+    public void setTranstime(String transtime) {
+        this.transtime = transtime;
     }
 
-    public String getBankcardno() {
-        return bankcardno;
+    public String getDeptcode() {
+        return deptcode;
     }
 
-    public void setBankcardno(String bankcardno) {
-
-        this.bankcardno = bankcardno;
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
     }
 
-    public String getCheckstatus() {
-        return checkstatus;
+    public String getDeptname() {
+        return deptname;
     }
 
-    public void setCheckstatus(String checkstatus) {
-
-        this.checkstatus = checkstatus;
+    public void setDeptname(String deptname) {
+        this.deptname = deptname;
     }
 
-    public String getStatus() {
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getCompany() {
+        return company;
+    }
+
+    public void setCompany(String company) {
+        this.company = company;
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public Integer getStatus() {
         return status;
     }
 
-    public void setStatus(String status) {
+    public void setStatus(Integer status) {
         this.status = status;
     }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java b/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java
index ff85647..0527279 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java
@@ -12,9 +12,7 @@
 import com.supwisdom.dlpay.mainservice.domain.TKey;
 import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorCheckDtl;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
-import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+import com.supwisdom.dlpay.visitormanage.domain.*;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -26,5 +24,7 @@
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
     PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean bean);
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    PageResult<VisitorShowBean> getCheckInfoPage(VisitorCheckSearchBean bean);
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
     public boolean saveVisitorCheck(EVisitorCheckDtl bean);
     }
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/service/impl/VisitormanageServiceImpl.java b/src/main/java/com/supwisdom/dlpay/visitormanage/service/impl/VisitormanageServiceImpl.java
index ebeaec7..5e77a73 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/service/impl/VisitormanageServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/service/impl/VisitormanageServiceImpl.java
@@ -17,9 +17,7 @@
 import com.supwisdom.dlpay.system.page.Pagination;
 import com.supwisdom.dlpay.system.service.SystemService;
 import com.supwisdom.dlpay.visitormanage.dao.VisitorDao;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorCheckDtl;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
-import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
+import com.supwisdom.dlpay.visitormanage.domain.*;
 import com.supwisdom.dlpay.visitormanage.service.VisitormanageService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -48,6 +46,10 @@
         return visitorDao.getVisitorInfoPage(bean);
     }
     @Override
+    public PageResult<VisitorShowBean> getCheckInfoPage(VisitorCheckSearchBean bean){
+        return visitorDao.getCheckInfoPage(bean);
+    }
+    @Override
     public boolean saveVisitorCheck(EVisitorCheckDtl bean) {
         return visitorDao.saveVisitorCheck(bean);
     }
diff --git a/src/main/resources/templates/visitormanage/addVisitorCheck.html b/src/main/resources/templates/visitormanage/addVisitorCheck.html
index d166ce0..bd0d532 100644
--- a/src/main/resources/templates/visitormanage/addVisitorCheck.html
+++ b/src/main/resources/templates/visitormanage/addVisitorCheck.html
@@ -22,6 +22,20 @@
                         </el-col>
                 </el-row>
                 <el-row :span="18">
+                    <el-col :span="18">
+                        <el-form-item label="性别">
+                            <el-select v-model="searchDoorForm.sex" id="sex" placeholder="请选择" >
+                                <el-option
+                                        v-for="status in sexlist"
+                                        :key="status.value"
+                                        :label="status.label"
+                                        :value="status.value">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row :span="18">
 
                         <el-col :span="18">
                             <el-form-item label="身份证号">
@@ -150,6 +164,7 @@
                 idno: '',
                 time: '',
                 phone: '',
+                sex: '',
                 custid: '',
                 deptcode: '',
                 company: '',
@@ -161,6 +176,7 @@
             custlist: [],
             operFlag: [],
             selectList: [],
+            sexlist: [],
             dialogFormVisible: false,
             dlgAllotDevVisible: false,
             startTime: '',
@@ -225,10 +241,25 @@
                     }
 
                     searchDoorlist_vue.deptlist = dlist;
+                    var sexl = [];
+                    sexl.push({
+                        value: '',
+                        label: '请选择'
+                    });
+                    sexl.push({
+                        value: '1',
+                        label: '男'
+                    });
+                    sexl.push({
+                        value: '2',
+                        label: '女'
+                    });
+                    searchDoorlist_vue.sexlist = sexl;
                 }
             })
             this.searchDoorForm.allocatStartDate = '';
             this.searchDoorForm.allocatEndDate = '';
+
         }
     });
     // 对Date的扩展，将 Date 转化为指定格式的String
diff --git a/src/main/resources/templates/visitormanage/customer/visitorchecklist.html b/src/main/resources/templates/visitormanage/customer/visitorchecklist.html
new file mode 100644
index 0000000..48c1ddb
--- /dev/null
+++ b/src/main/resources/templates/visitormanage/customer/visitorchecklist.html
@@ -0,0 +1,197 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">访客记录</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">访客登记管理</a>
+          <a><cite>访客记录</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索：
+            <input id="visitor-search-value" class="layui-input search-input" type="text" placeholder="输入姓名"/>&emsp;
+            <select id="visitor-search-sex" class="layui-input search-input" type="" >
+                <option value="">性别</option>
+                <option value="1">男</option>
+                <option value="2">女</option>
+            </select>&emsp;
+            <input id="visitor-search-startdate" class="layui-input search-input" type="date" />&emsp;
+            <label>~&nbsp;</label>
+            <input id="visitor-search-enddate" class="layui-input search-input" type="date" />&emsp;
+            <button id="customer-btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+           <!-- <button id="customer-btn-import" class="layui-btn icon-btn" ><i class="layui-icon"></i>批量导入</button>-->
+          <!--  <a id="customer-btn-export" href="javascript:void(0);" class="layui-btn layui-btn-primary" >导出</a>-->
+        </div>
+        <table class="layui-table" id="customer-table" lay-filter="customer-table"></table>
+    </div>
+</div>
+<input hidden th:value="${custtypelist}" id="custtypelist">
+<input hidden th:value="${deptlist}" id="deptlist">
+<script>
+
+    var ctlist=$("#custtypelist").val();
+    var custtypelist=JSON.parse(ctlist);
+    var dplist=$("#deptlist").val();
+    var deptlist=JSON.parse(dplist);
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
+
+        form.render('select');
+
+        // 渲染表格
+        table.render({
+            elem: '#customer-table',
+            url: '[[@{/visitor/checklist}]]',
+            page: true,
+            minWidth: 80,
+            cols: [
+                [
+                    {field: 'visitorname',  title: '姓名'},
+
+
+                    /*{
+                        field: 'checkstatus', title: '审核状态', align: 'center', width: 120, sort: true, templet: function (d) {
+                            if ('uncheck' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-orange">待审核</span>'
+                            } else if ('normal' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-green">成功</span>';
+                            } else if ('fail' == d.checkstatus) {
+                                return '<span class="layui-badge layui-bg-gray">失败</span>';
+                            } else {
+                                return d.checkstatus;
+                            }
+                        }
+                    },*/
+                    {
+                        field: 'sex',
+                        title: '性别',
+                        align: 'center',
+                        templet: function (item) {
+                            if(item.sex==1){
+                                return "男"
+                            }else {
+                                return "女"
+                            }
+                        }
+                    },
+                    {field: 'phone',  title: '联系方式'},
+
+                    {
+                        field: 'transdate', width:200, title: '日期',align: 'center', templet: function (item) {
+                            return item.transdate.substring(0,4)+"-"+item.transdate.substring(4,6)+"-"+item.transdate.substring(6,8);
+                        }
+                    },{
+                        field: 'transtime', width:200, title: '时间', align: 'center',templet: function (item) {
+                            return item.transtime.substring(0,2)+":"+item.transtime.substring(2,4)+":"+item.transtime.substring(4,6);
+                        }
+                    },
+                    {field: 'idno', align: 'center',  title: '身份证号'},
+                    {field: 'company', align: 'center',  title: '单位'},
+                    {field: 'custname', align: 'center',  title: '受访人'},
+                    {field: 'deptname', align: 'center',  title: '受访人部门'},
+                    {field: 'remarks', align: 'center',  title: '备注'}
+                ]
+            ]
+        });
+        $('#customer-btn-export').click(function () {
+            var url = '[[@{/customer/export}]]';
+            /* $("#form").attr("action",url);
+
+             $("#form").submit();*/
+
+            $("#customer-btn-export").attr("href", url );
+            $("#customer-btn-export")[0].click();
+        });
+        // 搜索按钮点击事件
+        $('#customer-btn-search').click(function () {
+            let key = $('#visitor-search-value').val().trim();
+            let sex = $('#visitor-search-sex').val().trim();
+            let startdate = $('#visitor-search-startdate').val().trim();
+            let enddate = $('#visitor-search-enddate').val().trim();
+            if(enddate!=null&&enddate!=""){
+                if(startdate!=null&&startdate!=""){
+                    if(startdate>enddate){
+                        alert("请输入正确的日期")
+                        return;
+                    }
+                }
+
+            }
+            table.reload('customer-table', {where: {searchkey: key,sex: sex,startdate:startdate,enddate:enddate }, page: {curr: 1}});
+        });
+        $('#customer-btn-add').click(function () {
+            showModel();
+        });
+       /* $('#customer-btn-import').click(function () {
+            showDownload();
+        });
+        let showDownload = function () {
+            let title ='导入';
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/customer/loadimport}]]',
+                finish: function () {
+                    table.reload('customer-table', {});
+                }
+            });
+        };*/
+        let showModel = function (data) {
+            let title = data ? '修改人员信息' : '添加人员信息';
+            admin.putTempData('t_cust', data);
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/customer/loadadd}]]',
+                finish: function () {
+                    table.reload('customer-table', {});
+                }
+            });
+        };
+
+
+        // 工具条点击事件
+        table.on('tool(customer-table)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            console.log(data);
+            if (layEvent === 'edit') {
+                showModel(data);
+            } else if (layEvent === 'del') {
+                showDelete(data);
+            }
+        });
+        let showDelete = function (data) {
+            console.log(data);
+            layer.confirm('确定要删除吗？', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('[[@{/customer/delete}]]', {
+                    custid: data.custid,
+                    _csrf: token
+                }, function (data) {
+                    console.log(data.code);
+                    layer.closeAll('loading');
+                    if (data.code == 200) {
+                        layer.msg(data.msg, {icon: 1});
+                    } else if (data.code == 401) {
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        layer.msg(data.msg, {icon: 2});
+                    }
+                    table.reload('customer-table', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    layer.msg('请求失败了，请稍后再试', {icon: 2});
+                });
+            });
+        };
+
+    });
+</script>
