diff --git a/build.gradle b/build.gradle
index 71be02a..50b7563 100644
--- a/build.gradle
+++ b/build.gradle
@@ -65,6 +65,7 @@
     implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
 
     implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
+    compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.12'
 
     implementation 'org.postgresql:postgresql:42.2.5'
     implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
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 0d243a5..2ed3328 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/controller/VisitorManageController.java
@@ -11,15 +11,18 @@
 import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.util.DateUtil;
 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.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
 import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
+import com.supwisdom.dlpay.system.bean.RegionBean;
 import com.supwisdom.dlpay.system.domain.TCustType;
 import com.supwisdom.dlpay.system.domain.TDept;
+import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.service.SystemService;
-import com.supwisdom.dlpay.visitormanage.domain.EVisitorDtl;
-import com.supwisdom.dlpay.visitormanage.domain.VisitorSearchBean;
-import com.supwisdom.dlpay.visitormanage.domain.VisitorShowBean;
+import com.supwisdom.dlpay.util.RedisUtil;
+import com.supwisdom.dlpay.visitormanage.domain.*;
 import com.supwisdom.dlpay.visitormanage.service.VisitormanageService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -28,7 +31,9 @@
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Controller
 @RequestMapping("/visitor")
@@ -41,6 +46,8 @@
     private SystemService systemService;
     @Autowired
     private VisitormanageService visitormanageService;
+    @Autowired
+    private WebInterfaceService webInterfaceService;
 
     @RequestMapping("/index")
     public String indexView(ModelMap model) {
@@ -54,6 +61,18 @@
 
         return "visitormanage/customer/index";
     }
+    @RequestMapping("/checkin")
+    public String visitorcheck(ModelMap model) {
+        List<TCustType> lst = systemService.findAllCusttype();
+        List<TDept> dept=systemService.findAllDept();
+        Gson gson = new Gson();
+        String deptString = gson.toJson(dept);
+        model.put("deptlist", dept);
+        String typeString = gson.toJson(lst);
+        model.put("custtypelist", lst);
+
+        return "visitormanage/addVisitorCheck";
+    }
 
     @RequestMapping("/list")
     @ResponseBody
@@ -89,17 +108,69 @@
     }
 
 
-    @GetMapping("/loadadd")
-    public String loadadd(Model model) {
-        List<TCustType> list=systemService.findAllCusttype();
-        model.addAttribute("typelist",list);
-        List<TDept> deptlist=systemService.findAllDept();
-        model.addAttribute("deptlist",deptlist);
 
-        return "doorlist/customer/form";
+    @ResponseBody
+    @RequestMapping("/getcustlist")
+    public Map loadAppDevList(@RequestParam(value = "deptcode",required = true,defaultValue = "")String deptcode){
+        Map map = new HashMap();
+        try{
+            CustomerSearchBean searchBean = new CustomerSearchBean();
+                searchBean.setDeptcode(deptcode);
+            PageResult<TCustomerInfo> bean= webInterfaceService.getCustomerInfoPage(searchBean);
+            List<TCustomerInfo> custlist = bean.getData();
+            map.put("custlist",custlist);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+
+
+    }@ResponseBody
+    @RequestMapping("/getdeptlist")
+    public Map loadDeptList(){
+        Map map = new HashMap();
+        try{
+            List<TDept> deptlist=systemService.findAllDept();
+            map.put("deptlist",deptlist);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+
+
     }
+    /**
+     * 访客登记
+     * @param postData
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addvisitorcheck", method = {RequestMethod.POST})
+    public Map saveVisitorCheck (@RequestBody VisitorCheckBean postData){
+        Map map = new HashMap();
+        try{
+            EVisitorCheckDtl eVisitorCheckDtl=new EVisitorCheckDtl();
+            eVisitorCheckDtl.setCompany(postData.getCompany());
+            eVisitorCheckDtl.setCustid(postData.getCustid());
+            eVisitorCheckDtl.setDeptcode(postData.getDeptcode());
+            eVisitorCheckDtl.setPhone(postData.getPhone());
+            eVisitorCheckDtl.setRemarks(postData.getRemarks());
+            eVisitorCheckDtl.setVisitorname(postData.getVisitorname());
+            eVisitorCheckDtl.setTime(DateUtil.getNow("yyyyMMddhhmmss"));
 
+            boolean b = visitormanageService.saveVisitorCheck(eVisitorCheckDtl);
+            if(b){
+                map.put("errStr", "");
+            }else {
+                map.put("errStr", "保存失败");
 
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("errStr", "保存失败!");
+        }
+        return map;
+    }
 
 
 }
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 c9fbce8..920b9f5 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/dao/VisitorDao.java
@@ -4,6 +4,8 @@
 import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
 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;
 
@@ -17,5 +19,5 @@
 
 
     public PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean 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 d89f3ce..a877d1d 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
@@ -6,7 +6,9 @@
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.mainservice.dao.CustomerDao;
 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 org.hibernate.query.internal.NativeQueryImpl;
@@ -81,6 +83,17 @@
         BigInteger count = (BigInteger) countQuery.getSingleResult();
         return new PageResult<>(count.longValue(), list);
     }
-
+    @Transactional
+    @Override
+    public boolean saveVisitorCheck(EVisitorCheckDtl bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorCheckDtl.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorCheckDtl.java
new file mode 100644
index 0000000..b02a952
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/EVisitorCheckDtl.java
@@ -0,0 +1,113 @@
+package com.supwisdom.dlpay.visitormanage.domain;
+
+import javax.persistence.*;
+
+/**
+ * Created by shuwei on 17/6/12.
+ */
+@Entity
+@Table(name = "E_VISITOR_CHECK_DTL")
+public class EVisitorCheckDtl {
+
+    private int id;
+    private String visitorname;
+    
+    private Integer status;
+    private String phone;
+    private String time;
+    private String sex;
+    private String deptcode;
+    private String custid;
+    private String company;
+    private String remarks;
+
+
+
+
+    @Id
+    @Column(name = "ID", unique = true,  nullable = false, length = 32)
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+    @Column(name = "VISITORNAME",length = 40)
+    public String getVisitorname() {
+        return visitorname;
+    }
+
+    public void setVisitorname(String visitorname) {
+        this.visitorname = visitorname;
+    }
+
+
+
+    @Column(name = "STATUS", length = 1)
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+    @Column(name = "PHONE", length = 20)
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+    @Column(name = "time", length = 14)
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+    @Column(name = "SEX", length = 1)
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+    @Column(name = "DEPTCODE", length = 32)
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+    @Column(name = "CUSTID", length = 32)
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+    @Column(name = "COMPANY", length = 255)
+    public String getCompany() {
+        return company;
+    }
+
+    public void setCompany(String company) {
+        this.company = company;
+    }
+    @Column(name = "REMARKS", length = 255)
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckBean.java b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckBean.java
new file mode 100644
index 0000000..0160852
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/domain/VisitorCheckBean.java
@@ -0,0 +1,89 @@
+package com.supwisdom.dlpay.visitormanage.domain;
+
+import javax.persistence.*;
+
+/**
+ * Created by shuwei on 17/6/12.
+ */
+
+public class VisitorCheckBean {
+
+    private String visitorname;
+    
+    private String phone;
+    private String time;
+    private String sex;
+    private String deptcode;
+    private String custid;
+    private String company;
+    private String remarks;
+
+
+
+
+
+
+    public String getVisitorname() {
+        return visitorname;
+    }
+
+    public void setVisitorname(String visitorname) {
+        this.visitorname = visitorname;
+    }
+
+
+
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+    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;
+    }
+
+
+}
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 1b4ac25..ff85647 100644
--- a/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java
+++ b/src/main/java/com/supwisdom/dlpay/visitormanage/service/VisitormanageService.java
@@ -10,7 +10,9 @@
 import com.supwisdom.dlpay.mainservice.domain.TCard;
 import com.supwisdom.dlpay.mainservice.domain.TCustomer;
 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 org.springframework.transaction.annotation.Propagation;
@@ -23,5 +25,6 @@
 
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
     PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean 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 9261017..ebeaec7 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
@@ -13,9 +13,11 @@
 import com.supwisdom.dlpay.mainservice.domain.TKey;
 import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
 import com.supwisdom.dlpay.system.domain.TDept;
+import com.supwisdom.dlpay.system.domain.TRegion;
 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.service.VisitormanageService;
@@ -45,4 +47,8 @@
     public PageResult<EVisitorDtl> getVisitorInfoPage(VisitorSearchBean bean){
         return visitorDao.getVisitorInfoPage(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
new file mode 100644
index 0000000..d166ce0
--- /dev/null
+++ b/src/main/resources/templates/visitormanage/addVisitorCheck.html
@@ -0,0 +1,463 @@
+<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="searchDoorlist">
+            <el-form :inline="true" ref="searchDoorForm" :model="searchDoorForm" label-width="110px"
+                     data-parsley-validate class="form-horizontal form-label-left el-form-item el-form-item--mini">
+
+                <el-row :span="18">
+                        <el-col :span="18">
+                            <el-form-item label="姓名">
+
+                            <el-input v-model="searchDoorForm.visitorname" id="visitorname" placeholder="访客姓名">
+                                <i class="el-icon-edit el-input__icon" slot="icon"></i>
+                    </el-input>
+                    </el-form-item>
+                        </el-col>
+                </el-row>
+                <el-row :span="18">
+
+                        <el-col :span="18">
+                            <el-form-item label="身份证号">
+
+                            <el-input v-model="searchDoorForm.idno" id="idno" placeholder="访客身份证号">
+                                <i class="el-icon-edit el-input__icon" slot="icon"></i>
+                            </el-input>
+                    </el-form-item>
+                        </el-col>
+
+                </el-row>
+                <el-row :span="18">
+
+                        <el-col :span="18">
+                            <el-form-item label="联系方式">
+
+                            <el-input v-model="searchDoorForm.phone" id="phone" placeholder="访客联系方式">
+                                <i class="el-icon-edit el-input__icon" slot="icon"></i>
+                            </el-input>
+                    </el-form-item>
+                        </el-col>
+                </el-row>
+                <el-row :span="18">
+                    <el-col :span="18">
+                        <el-form-item label="时间">
+                            <el-date-picker type="date" v-model="searchDoorForm.time" id="time"
+                                            :picker-options="pickerOptions0" :editable="false" placeholder="访问时间"  value-format="yyyyMMdd"
+                                            style="width:100%;"></el-date-picker>
+                        </el-form-item>
+                    </el-col>
+
+
+
+                </el-row>
+                <el-row :span="18">
+                    <el-col :span="18">
+                        <el-form-item label="单位">
+                            <el-input v-model="searchDoorForm.company" id="company" placeholder="访客所在单位">
+                                <i class="el-icon-edit el-input__icon" slot="icon"></i>
+                            </el-input>
+                        </el-form-item>
+                    </el-col>
+
+
+                </el-row>
+                <el-row :span="18">
+                    <el-col :span="18">
+                        <el-form-item label="受访者部门">
+                            <el-select v-model="searchDoorForm.deptcode" id="deptcode" placeholder="请选择" @change="deptchange(searchDoorForm.deptcode)">
+                                <el-option
+                                        v-for="status in deptlist"
+                                        :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="受访者姓名">
+                            <el-select v-model="searchDoorForm.custid" id="custid" placeholder="请选择">
+                                <el-option
+                                        v-for="flag in custlist"
+                                        :key="flag.value"
+                                        :label="flag.label"
+                                        :value="flag.value">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row :span="18">
+                    <el-col :span="18">
+                        <el-form-item label="备注">
+                            <el-input v-model="searchDoorForm.remarks" id="remarks" placeholder="备注信息">
+                                <i class="el-icon-edit el-input__icon" slot="icon"></i>
+                            </el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+
+                <el-row>
+                    <el-col :span="8" :offset="16">
+                        <button type="button" style="margin-left: 48px" class="btn btn-info" @click="savevisitor(searchDoorForm)"
+                                id="searchDoorlist_qrybtn">
+                            保存
+                        </button>
+
+                    </el-col>
+                </el-row>
+
+            </el-form>
+
+
+            <el-dialog title="时间段名称" :visible.sync="dialogFormVisible" center="true" top="3%" size="tiny"
+                       :modal-append-to-body='false'>
+                <p>正在查看<span style="color:#f96" id="searchDoorlist_custNameId"></span>学生的时间段名称:</p>
+                <div style="width: 100%;">
+		            <span style="font-size: 16px!important;">时间段名称：
+                        {{alloTimeName}}
+                    </span>
+                </div>
+
+                <span slot="footer" class="dialog-footer">
+                    <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
+                  </span>
+            </el-dialog>
+
+        </div>
+    </div>
+</div>
+
+<script>
+    var searchDoorlist_vue = new Vue({
+        el: "#searchDoorlist",
+        data: {
+            tableData: [],
+            currPage: 1,
+            pageSize: 10,
+            totSize: 0,
+            currentRow: null,
+            searchDoorForm: {
+                visitorname: '',
+                idno: '',
+                time: '',
+                phone: '',
+                custid: '',
+                deptcode: '',
+                company: '',
+                remarks: '',
+            },
+            regions: [],
+            regionoptions: [],
+            deptlist: [],
+            custlist: [],
+            operFlag: [],
+            selectList: [],
+            dialogFormVisible: false,
+            dlgAllotDevVisible: false,
+            startTime: '',
+            endTime: '',
+            alloTimeName: '',
+            pickerOptions0: {
+                disabledDate: function (time) {
+                    return time.getTime() > Date.now();
+                }
+            },
+            pickerOptions1: {
+                disabledDate: function (time) {
+                    if (searchDoorlist_vue.searchDoorForm.allocatStartDate != '') {
+
+                        return time.getTime() < searchDoorlist_vue.searchDoorForm.allocatStartDate.getTime();
+                    } else {
+                        return time.getTime() > Date.now();
+                    }
+                }
+            }
+        },
+        methods: {
+
+            savevisitor: function (formName) {
+                searchDoorlist_commonQuery(this, this.searchDoorForm,formName);
+            },
+
+            deptchange: function (deptcode) {
+                var _self = this;
+                alert(deptcode);
+                getcustlist(_self, deptcode);
+            },
+            formatDate: function (row, column, cellValue) {
+                return cellValue.substr(0, 4) + "-" + cellValue.substr(4, 2) + "-" + cellValue.substr(6, 2);
+            },
+
+            handleSelect: function (val) {
+                this.selectList = val;
+            }
+
+        },
+        created: function () {
+            var _self = this;
+            $.ajax({
+                type: "get",
+                dataType: "json",
+                url: encodeURI("[[@{/visitor/getdeptlist}]]"),
+                success: function (ret) {
+                    var dlist = [];
+                    dlist.push({
+                        value: '',
+                        label: '请选择'
+                    });
+                    var rB = ret.deptlist;
+                    if (rB != null) {
+                        for (var j = 0; j < rB.length; j++) {
+                            dlist.push({
+                                value: rB[j]["deptcode"],
+                                label: rB[j]["deptname"]
+                            });
+                        }
+                    }
+
+                    searchDoorlist_vue.deptlist = dlist;
+                }
+            })
+            this.searchDoorForm.allocatStartDate = '';
+            this.searchDoorForm.allocatEndDate = '';
+        }
+    });
+    // 对Date的扩展，将 Date 转化为指定格式的String
+    // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
+    // 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
+    // 例子：
+    // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
+    // (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
+    Date.prototype.Format = function (fmt) { //author: meizz
+        var o = {
+            "M+": this.getMonth() + 1, //月份
+            "d+": this.getDate(), //日
+            "h+": this.getHours(), //小时
+            "m+": this.getMinutes(), //分
+            "s+": this.getSeconds(), //秒
+            "q+": Math.floor((this.getMonth() + 3) / 3), //季度
+            "S": this.getMilliseconds() //毫秒
+        };
+        if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+        for (var k in o)
+            if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+        return fmt;
+    }
+
+    function searchDoorlist_getTreeData(regionlst) {
+        var f = [];
+
+        //获取第一级
+        for (var i = 0; i < regionlst.length; i++) {
+            if (regionlst[i].parentid == '0') {
+                f.push({
+                    value: regionlst[i].regionid,
+                    label: regionlst[i].regionname,
+                })
+            }
+        }
+        if (f.length > 0) {
+            //获取第二级
+            searchDoorlist_pushRegion(regionlst, f);
+        } else {
+            f.push({
+                value: regionlst[0].regionid,
+                label: regionlst[0].regionname,
+            })
+            //获取第二级
+            searchDoorlist_pushRegion(regionlst, f);
+        }
+        searchDoorlist_cyclePushRegion(f, regionlst)
+        return f;
+    }
+
+    function searchDoorlist_pushRegion(regionlst, pRe) {
+        for (var i in regionlst) {
+            for (var j in pRe) {
+                if (regionlst[i].parentid == pRe[j].value) {
+                    if (pRe[j].children == undefined) {
+                        pRe[j].children = []
+                    }
+                    pRe[j].children.push({
+                        value: regionlst[i].regionid,
+                        label: regionlst[i].regionname,
+                    })
+                }
+            }
+        }
+    }
+
+    function searchDoorlist_cyclePushRegion(fList, regionlst) {
+        for (var i in fList) {
+            var s = fList[i].children;
+            if (s != undefined && s.length > 0) {
+                searchDoorlist_pushRegion(regionlst, s);
+            }
+            for (j in s) {
+                var l = s[j].children;
+                if (l != undefined && l.length > 0) {
+                    searchDoorlist_cyclePushRegion(s, regionlst)
+                }
+            }
+        }
+    }
+
+    function getcustlist(_self, deptcode) {
+
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("[[@{/visitor/getcustlist?deptcode=}]]" + deptcode),
+            success: function (ret) {
+                var bList = [];
+                bList.push({
+                    value: '',
+                    label: '请选择'
+                });
+                var rB = ret.custlist;
+                if (rB != null) {
+                    for (var j = 0; j < rB.length; j++) {
+                        bList.push({
+                            value: rB[j]["custid"],
+                            label: rB[j]["custname"]
+                        });
+                    }
+                }
+
+                _self.custlist = bList;
+            }
+        })
+
+
+    }
+
+
+    function searchDoorlist_commonQuery(_self, searchDoor,formName) {
+        var url = "[[@{/visitor/addvisitorcheck?}]]";
+        var token = $("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data: JSON.stringify(searchDoor),
+            success: function (data) {
+                if (data.errStr != "") {
+                    layer.msg(data.errStr, {icon: 2,time:1000});
+                } else {
+                    layer.msg('保存信息成功!', {icon: 1,time:1000});
+                    _self.$refs[formName].resetFields();
+                    _self.dialogFormVisible = false;
+                    _self.regionidDis = false;
+                }
+            }
+        });
+    }
+
+    function searchDoorlist_timeformatter(time) {
+
+        return time.substr(0, 4) + '-' + time.substr(4, 2) + '-' + time.substr(6, 2) + ' '
+            + time.substr(8, 2) + ':' + time.substr(10, 2) + ':' + time.substr(12, 2);
+//        console.log([year,month,date].join('-')+' '+[hour,moment,second].join(':'));
+//        return [year,month,date].join('-')+' '+[hour,moment,second].join(':');
+
+    }
+
+    function searchDoorlist_exportExcel(_self, searchDoor) {
+        var startStr = '';
+        var endStr = '';
+        if (_self.totSize > 1000) {
+            layer.msg('数量过大请输入条件', {icon: 2, time: 1000});
+            return;
+        }
+        if (searchDoor.allocatStartDate != '') {
+            if (searchDoor.allocatEndDate == '') {
+                layer.msg('请选择结束时间', {icon: 2, time: 1000});
+                return;
+            } else {
+                startStr = searchDoor.allocatStartDate.Format('yyyyMMdd');
+                endStr = searchDoor.allocatEndDate.Format('yyyyMMdd');
+            }
+        }
+        var url = "[[@{/doorlistMgr/exportExcel?}]]" + "allocatStartDate=" + startStr + "&allocatEndDate=" + endStr +
+            "&devname=" + searchDoor.devname + "&custname=" + searchDoor.custname
+            + "&cardno=" + searchDoor.cardno
+            + "&syncflag=" + searchDoor.syncflag + "&operflag=" + searchDoor.operflag
+            + "&buildingid=" + searchDoor.buildingid + "&regionid=" + searchDoor.regionid;
+//        window.location.href
+        var uri = encodeURI(url);
+        window.open(uri);
+    }
+
+    function searchDoorlist_reIssuedList() {
+        var listIds = searchDoorlist_vue.selectList;
+        if (listIds == '') {
+            layer.msg('请选择要重新下发的名单！', {icon: 2, time: 1000});
+        } else {
+            layer.confirm('确定要重新下发这些名单吗？', {icon: 3, title: '请确认', offset: '30%'}, function (index) {
+                var url = "[[@{/doorlistMgr/reSaveDoorCardList}]]";
+                var token = $("meta[name='_csrf_token']").attr("value");
+                $.ajax({
+                    type: "POST",
+                    url: url,
+                    dataType: "json",
+                    contentType: "application/json",
+                    headers: {
+                        'Accept': 'application/json',
+                        'Content-Type': 'application/json',
+                        'X-CSRF-TOKEN': token,
+                    },
+                    data: JSON.stringify(listIds),
+                    success: function (data) {
+                        layer.msg(data.result, {time: 2000})
+                        searchDoorlist_refreshThisTable();
+                    }
+                });
+            })
+        }
+    }
+
+    function searchDoorlist_getRegionBuilding(_self, value) {
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("[[@{/ncmgr/getRegionBuilding?regionid=}]]" + value),
+            success: function (ret) {
+                var custlist = [];
+                custlist.push({
+                    value: '',
+                    label: '全部'
+                });
+                var rB = ret.custlist;
+                if (rB != null) {
+                    for (var j = 0; j < rB.length; j++) {
+                        bList.push({
+                            value: rB[j]["custid"],
+                            label: rB[j]["custname"]
+                        });
+                    }
+                }
+
+                _self.building = custlist;
+            }
+        })
+    }
+
+    function refreshThisTable() {
+        $("#searchDoorlist_qrybtn").click();
+    }
+</script>
\ No newline at end of file
