diff --git a/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java b/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
new file mode 100644
index 0000000..1cd837b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
@@ -0,0 +1,219 @@
+package com.supwisdom.dlpay.doorlist.controller;
+
+import cn.afterturn.easypoi.entity.vo.NormalExcelConstants;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.afterturn.easypoi.view.PoiBaseView;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.mainservice.domain.TKey;
+import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
+import com.supwisdom.dlpay.ncmgr.service.NcService;
+import com.supwisdom.dlpay.system.domain.TDictionaryId;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.SystemService;
+import com.supwisdom.dlpay.util.RedisUtil;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/doorlistMgr")
+public class DoorlistMgrController {
+
+    protected static Logger logger = Logger.getLogger(DoorlistMgrController.class);
+
+    @Autowired
+    SystemService systemService;
+    @Autowired
+    WebInterfaceService webInterfaceService;
+    @Autowired
+    NcService ncService;
+
+    @RequestMapping("/downDoorList")
+    public String downDoorList(ModelMap model){
+        return "doorlist/addDoorlist";
+    }
+
+    @RequestMapping("/deleteDoorList")
+    public String deleteDoorList(ModelMap model){
+        return "doorlist/deleteDoorlist";
+    }
+
+    @RequestMapping("/searchDoorlist")
+    public String searchDoorlist(ModelMap model){
+        return "doorlist/searchDoorlist";
+    }
+
+    /**
+     * 填充查询门禁列表下拉菜单
+     * @return
+     * @throws Exception
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getFillFormList")
+    public Map getFillFormList() throws Exception {
+        Map map = new HashMap();
+        //名单状态
+        List<TDictionaryId> syncDicts = systemService.findTDictionaryByType(3);
+        map.put("syncDicts", syncDicts);
+        //厂商id
+        List<TKey> allFactoryId = webInterfaceService.getAllKeys();
+        map.put("allFactoryId", allFactoryId);
+        //操作标记
+        List<TDictionaryId> operDicts = new ArrayList<TDictionaryId>();
+        operDicts.addAll(systemService.findByType(2, "A"));
+        operDicts.addAll(systemService.findByType(2, "D"));
+        operDicts.addAll(systemService.findByType(2, "C"));
+        map.put("operDicts", operDicts);
+
+        //所有楼栋
+        List<TBuilding> buildings = ncService.getAllBuilding();
+        map.put("buildings", buildings);
+        return map;
+    }
+
+    /**
+     * 查询设备名单
+     * @param request
+     * @param factoryId
+     * @param doorName
+     * @param custName
+     * @param stuempNo
+     * @param syncStatus
+     * @param operFlag
+     * @param building
+     * @param allocatStartDate
+     * @param allocatEndDate
+     * @param pageNo
+     * @param pageSize
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getAllCardList")
+    public Map getAllCardList(HttpServletRequest request,
+                                 @RequestParam(value = "factoryId", required = false, defaultValue = "all") String factoryId,
+                                 @RequestParam(value = "doorName", required = false, defaultValue = "") String doorName,
+                                 @RequestParam(value = "custName", required = false, defaultValue = "") String custName,
+                                 @RequestParam(value = "stuempNo", required = false, defaultValue = "") String stuempNo,
+                                 @RequestParam(value = "syncStatus", required = false, defaultValue = "all") String syncStatus,
+                                 @RequestParam(value = "operFlag", required = false, defaultValue = "all") String operFlag,
+                                 @RequestParam(value = "building", required = false, defaultValue = "") String building,
+                                 @RequestParam(value = "allocatStartDate", required = false, defaultValue = "") String allocatStartDate,
+                                 @RequestParam(value = "allocatEndDate", required = false, defaultValue = "") String allocatEndDate,
+                                 @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                                 @RequestParam(value = "pageSize", required = false, defaultValue = "15") int pageSize,
+                                 @AuthenticationPrincipal TOperator operUser) {
+
+        Map map = new HashMap();
+        try {
+            List<String> allopername = systemService.findOperatorsByFopercode(operUser.getOperid());
+            boolean flag = true;
+
+            Pagination pResult;
+            pResult = webInterfaceService.getAllCardListFrSearch(factoryId, allocatStartDate, allocatEndDate,
+                    doorName, custName, stuempNo, syncStatus, allopername, operFlag, building, pageNo, pageSize);
+            map.put("PageResult", pResult);
+            map.put("index", flag);
+            map.put("result", "查询设备名单成功！");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("result", "查询设备名单失败！");
+            logger.error("查询设备名单失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 注解方式导出设备名单Excel
+     * @param modelMap
+     * @param request
+     * @param response
+     * @param factoryId
+     * @param doorName
+     * @param custName
+     * @param stuempNo
+     * @param syncStatus
+     * @param operFlag
+     * @param building
+     * @param allocatStartDate
+     * @param allocatEndDate
+     * @param operUser
+     */
+    @RequestMapping(value = "/exportExcel", method = RequestMethod.GET)
+    public void download(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response,
+                         @RequestParam(value = "factoryId", required = false, defaultValue = "all") String factoryId,
+                         @RequestParam(value = "doorName", required = false, defaultValue = "") String doorName,
+                         @RequestParam(value = "custName", required = false, defaultValue = "") String custName,
+                         @RequestParam(value = "stuempNo", required = false, defaultValue = "") String stuempNo,
+                         @RequestParam(value = "syncStatus", required = false, defaultValue = "all") String syncStatus,
+                         @RequestParam(value = "operFlag", required = false, defaultValue = "all") String operFlag,
+                         @RequestParam(value = "building", required = false, defaultValue = "") String building,
+                         @RequestParam(value = "allocatStartDate", required = false, defaultValue = "") String allocatStartDate,
+                         @RequestParam(value = "allocatEndDate", required = false, defaultValue = "") String allocatEndDate,
+                         @AuthenticationPrincipal TOperator operUser) {
+        /**
+         * 1.查询值
+         */
+        List<String> allopername = systemService.findOperatorsByFopercode(operUser.getOperid());
+        List<TDoorcardlstInfo> cardList = webInterfaceService.getAllCardListMap(factoryId, allocatStartDate, allocatEndDate,
+                doorName, custName, stuempNo, syncStatus, allopername, operFlag, building);
+
+        /**
+         * 2.设置表格属性: title:标题  sheetName:工作簿名 type:表格类型
+         */
+        ExportParams params = new ExportParams("设备名单列表", "设备名单", ExcelType.XSSF);
+
+        modelMap.put(NormalExcelConstants.DATA_LIST, cardList);//设置值
+        modelMap.put(NormalExcelConstants.PARAMS, params);//设置属性
+        modelMap.put(NormalExcelConstants.CLASS, TDoorcardlstInfo.class);
+        modelMap.put(NormalExcelConstants.FILE_NAME, "下发设备名单");
+        PoiBaseView.render(modelMap, request, response, NormalExcelConstants.EASYPOI_EXCEL_VIEW);
+
+    }
+
+    /**
+     * 重新下发名单
+     * @param request
+     * @param tDoorcardlstInfos
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/reSaveDoorCardList", method = {RequestMethod.POST})
+    public Map reSaveDoorCardList(HttpServletRequest request,
+                                     @RequestBody TDoorcardlstInfo[] tDoorcardlstInfos){
+        Map map = new HashMap();
+        String msg = "";
+        try {
+            List<Long> listIds = new ArrayList<>();
+            for (TDoorcardlstInfo tDoorcardlstInfo:tDoorcardlstInfos){
+                listIds.add(Long.valueOf(tDoorcardlstInfo.getListid()));
+            }
+            webInterfaceService.updateDoorcardlstToNoWithIds(listIds);
+            RedisUtil.incr("zcard_max_version");
+            map.put("result","重新下发设备名单成功！");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("result","重新下发设备名单失败！");
+            msg = "重新下发设备名单异常";
+            logger.error("重定向出错："+e.getMessage());
+        }
+        map.put("msg",msg);
+        return map;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
index cfcbeea..c5c4872 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -51,6 +51,8 @@
   @Transient
   private String roleids;
 
+  private TOperator father;
+
   @Transient
   private Collection<? extends GrantedAuthority> authorities;  //权限
 
@@ -210,4 +212,14 @@
   public void setRoleids(String roleids) {
     this.roleids = roleids;
   }
+
+  @ManyToOne(fetch = FetchType.EAGER)
+  @JoinColumn(name = "foperid")
+  public TOperator getFather() {
+    return father;
+  }
+
+  public void setFather(TOperator father) {
+    this.father = father;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
index 9d44ea9..33c2ecb 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
@@ -133,4 +133,17 @@
   }
 
 
+  public static String intOrLikeIntListTransToStr(List list) {
+    StringBuffer buf = new StringBuffer(" ( ");
+    for (int i = 0; i < list.size(); i++) {
+      buf.append(list.get(i));
+      if (i == list.size() - 1) {
+        buf.append(")");
+      } else {
+        buf.append(",");
+      }
+    }
+    return buf.toString();
+  }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoorcardlstInfo.java b/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoorcardlstInfo.java
new file mode 100644
index 0000000..7e0d970
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoorcardlstInfo.java
@@ -0,0 +1,228 @@
+package com.supwisdom.dlpay.mainservice.bean;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+@Entity
+public class TDoorcardlstInfo implements Serializable {
+
+    @Id
+    private String listid;
+
+    private String factoryId;
+    @Excel(name = "厂商")
+    private String factoryName;
+    @Excel(name = "设备名称", width = 15)
+    private String doorName;
+    @Excel(name = "姓名", width = 15)
+    private String custName;
+    @Excel(name = "分配操作员", width = 15)
+    private String operName;
+    @Excel(name = "学/工号", width = 15)
+    private String stuempNo;
+    @Excel(name = "楼栋", width = 15)
+    private String buildingName;
+    @Excel(name = "区域",width = 15)
+    private String regionName;
+    @Excel(name = "名单状态")
+    private String syncStatus;
+    private String operFlagIndex;
+    @Excel(name = "操作标记")
+    private String operFlag;
+    @Excel(name = "分配时间", databaseFormat = "yyyy-MM-dd", width = 20)
+    private String allocatTime;
+    @Excel(name = "同步时间", databaseFormat = "yyyy-MM-dd", width = 20)
+    private String syncTime;
+    @Excel(name = "反馈时间", databaseFormat = "yyyy-MM-dd", width = 20)
+    private String feedbackTime;
+    @Excel(name = "反馈信息", width = 15)
+    private String retmsg;
+    @Excel(name = "名单备注", width = 15)
+    private String reason;
+    @Excel(name = "设备使用类型", width = 15)
+    private String usetype;
+    private String closedate;
+
+    public String getRetmsg() {
+        return retmsg;
+    }
+
+    public void setRetmsg(String retmsg) {
+        this.retmsg = retmsg;
+    }
+
+    public String getClosedate() {
+        return closedate;
+    }
+
+    public void setClosedate(String closedate) {
+        this.closedate = closedate;
+    }
+
+    public String getOperFlagIndex() {
+        return operFlagIndex;
+    }
+
+    public void setOperFlagIndex(String operFlagIndex) {
+        this.operFlagIndex = operFlagIndex;
+    }
+
+    public String getListid() {
+        return listid;
+    }
+
+    public void setListid(String listid) {
+        this.listid = listid;
+    }
+
+    public String getFactoryId() {
+        return factoryId;
+    }
+
+    public void setFactoryId(String factoryId) {
+        this.factoryId = factoryId;
+    }
+
+    public String getFactoryName() {
+        return factoryName;
+    }
+
+    public void setFactoryName(String factoryName) {
+        this.factoryName = factoryName;
+    }
+
+    public String getDoorName() {
+        return doorName;
+    }
+
+    public void setDoorName(String doorName) {
+        this.doorName = doorName;
+    }
+
+    public String getCustName() {
+        return custName;
+    }
+
+    public void setCustName(String custName) {
+        this.custName = custName;
+    }
+
+    public String getOperName() {
+        return operName;
+    }
+
+    public void setOperName(String operName) {
+        this.operName = operName;
+    }
+
+    public String getStuempNo() {
+        return stuempNo;
+    }
+
+    public void setStuempNo(String stuempNo) {
+        this.stuempNo = stuempNo;
+    }
+
+    public String getBuildingName() {
+        return buildingName;
+    }
+
+    public void setBuildingName(String buildingName) {
+        this.buildingName = buildingName;
+    }
+
+    public String getRegionName() {
+        return regionName;
+    }
+
+    public void setRegionName(String regionName) {
+        this.regionName = regionName;
+    }
+
+    public String getSyncStatus() {
+        return syncStatus;
+    }
+
+    public void setSyncStatus(String syncStatus) {
+        this.syncStatus = syncStatus;
+    }
+
+    public String getOperFlag() {
+        return operFlag;
+    }
+
+    public void setOperFlag(String operFlag) {
+        this.operFlag = operFlag;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+    /*public String getTimeName() {
+            return timeName;
+        }
+        public void setTimeName(String timeName) {
+            this.timeName = timeName;
+        }*/
+
+    public String getUsetype() {
+        return usetype;
+    }
+
+    public void setUsetype(String usetype) {
+        this.usetype = usetype;
+    }
+
+    public String getAllocatTime() {
+        return allocatTime;
+    }
+
+    public void setAllocatTime(String allocatTime) {
+        this.allocatTime = allocatTime;
+    }
+
+    public String getSyncTime() {
+        return syncTime;
+    }
+
+    public void setSyncTime(String syncTime) {
+        this.syncTime = syncTime;
+    }
+
+    public String getFeedbackTime() {
+        return feedbackTime;
+    }
+
+    public void setFeedbackTime(String feedbackTime) {
+        this.feedbackTime = feedbackTime;
+    }
+
+    public TDoorcardlstInfo(String listid, String factoryId, String factoryName, String doorName, String custName, String operName, String stuempNo, String buildingName, String regionName, String syncStatus, String operFlagIndex, String operFlag, String allocatTime, String syncTime, String feedbackTime, String retmsg, String reason, String usetype, String closedate) {
+        this.listid = listid;
+        this.factoryId = factoryId;
+        this.factoryName = factoryName;
+        this.doorName = doorName;
+        this.custName = custName;
+        this.operName = operName;
+        this.stuempNo = stuempNo;
+        this.buildingName = buildingName;
+        this.regionName = regionName;
+        this.syncStatus = syncStatus;
+        this.operFlagIndex = operFlagIndex;
+        this.operFlag = operFlag;
+        this.allocatTime = allocatTime;
+        this.syncTime = syncTime;
+        this.feedbackTime = feedbackTime;
+        this.retmsg = retmsg;
+        this.reason = reason;
+        this.usetype = usetype;
+        this.closedate = closedate;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoordtlInfo.java b/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoordtlInfo.java
new file mode 100644
index 0000000..b49a994
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoordtlInfo.java
@@ -0,0 +1,114 @@
+package com.supwisdom.dlpay.mainservice.bean;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+
+import java.io.Serializable;
+
+public class TDoordtlInfo implements Serializable{
+	@Excel(name = "厂商名称")
+	private String factoryname;
+	@Excel(name = "设备编号")
+	private String doorid;
+	@Excel(name = "设备名称")
+	private String doorname;
+	@Excel(name = "学/工号",width = 20)
+	private String stuempno;
+	@Excel(name = "姓名")
+	private String custname;
+	@Excel(name = "楼栋",width = 30)
+	private String buildingname;
+	@Excel(name = "区域",width = 30)
+	private String regionname;
+	@Excel(name = "物理卡号")
+	private String cardphyid;
+	@Excel(name = "刷卡时间",databaseFormat = "yyyy-MM-dd",width = 20)
+	private String transdate;
+	@Excel(name = "描述")
+	private String dtldesc;
+	@Excel(name = "流水状态")
+	private String status;
+	@Excel(name = "采集时间",databaseFormat = "yyyy-MM-dd",width = 20)
+	private String coldate;
+
+	public String getDoorid() {
+		return doorid;
+	}
+
+	public String getCardphyid() {
+		return cardphyid;
+	}
+
+	public void setCardphyid(String cardphyid) {
+		this.cardphyid = cardphyid;
+	}
+
+	public void setDoorid(String doorid) {
+		this.doorid = doorid;
+	}
+
+	public String getDtldesc() {
+		return dtldesc;
+	}
+	public void setDtldesc(String dtldesc) {
+		this.dtldesc = dtldesc;
+	}
+	public String getFactoryname() {
+		return factoryname;
+	}
+	public void setFactoryname(String factoryname) {
+		this.factoryname = factoryname;
+	}
+	public String getDoorname() {
+		return doorname;
+	}
+	public void setDoorname(String doorname) {
+		this.doorname = doorname;
+	}
+	public String getStuempno() {
+		return stuempno;
+	}
+	public void setStuempno(String stuempno) {
+		this.stuempno = stuempno;
+	}
+	public String getCustname() {
+		return custname;
+	}
+	public void setCustname(String custname) {
+		this.custname = custname;
+	}
+
+	public String getBuildingname() {
+		return buildingname;
+	}
+
+	public void setBuildingname(String buildingname) {
+		this.buildingname = buildingname;
+	}
+
+	public String getRegionname() {
+		return regionname;
+	}
+
+	public void setRegionname(String regionname) {
+		this.regionname = regionname;
+	}
+
+	public String getTransdate() {
+		return transdate;
+	}
+	public void setTransdate(String transdate) {
+		this.transdate = transdate;
+	}
+	public String getStatus() {
+		return status;
+	}
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	public String getColdate() {
+		return coldate;
+	}
+	public void setColdate(String coldate) {
+		this.coldate = coldate;
+	}
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/CardListDao.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/CardListDao.java
new file mode 100644
index 0000000..941cdb9
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/CardListDao.java
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.mainservice.dao;
+
+import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface CardListDao {
+
+    public Pagination getAllCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate,
+                                             String doorName, String custName, String stuempNo, String syncStatus, List<String> opername, String operFlag, String building, int pageNo, int pageSize);
+
+    public List<TDoorcardlstInfo> getAllCardListMap(String factoryId, String allocatStartDate, String allocatEndDate,
+                                                    String doorName, String custName, String stuempNo, String syncStatus, List<String> opername, String operFlag, String building);
+
+    public void updateDoorcardlstToNoWithIds(List<Long> listIds);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/KeyDao.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/KeyDao.java
new file mode 100644
index 0000000..a67bed9
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/KeyDao.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.mainservice.dao;
+
+import com.supwisdom.dlpay.mainservice.domain.TKey;
+
+import java.util.List;
+
+public interface KeyDao {
+    public List<TKey> getAllKeys() throws Exception;
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CardListDaoImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CardListDaoImpl.java
new file mode 100644
index 0000000..722afdd
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CardListDaoImpl.java
@@ -0,0 +1,421 @@
+package com.supwisdom.dlpay.mainservice.dao.impl;
+
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.mainservice.dao.CardListDao;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.util.RedisUtil;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+@Repository
+public class CardListDaoImpl implements CardListDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getAllCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus,List<String> opername, String operFlag, String building, int pageNo, int pageSize) {
+        try {
+
+            String queryString = "select a.listid, a.factoryId,d.doorName,a.custName,g.operName,a.stuempNo," +
+                    "a.syncStatus,a.operFlag operFlagIndex,a.updatetime allocatTime,a.syncTime,a.closedate," +
+                    "b.updatetime feedbackTime,b.retmsg,a.reason ,a.buildingName,f.regionName" +
+                    " from t_doorcardlst a left join t_rtnresult b on a.listid=b.listid " +
+                    " left join tb_region f on a.regionid=f.regionid " +
+                    " left join t_doordev d on a.deviceid=d.doorid" +
+                    " left join tb_operator g on a.operid=g.operid" +
+                    " where 1>0 " +
+                    "  and (a.operid in (:operids ) " +
+                    " or a.deviceid in (select deviceid from T_OPERDEVICE o where o.operid in(:operids)))";
+            if (!"".equals(allocatStartDate)) {
+                queryString += " and a.updatetime>=:allocatStartDate ";
+            }
+            if (!"".equals(allocatEndDate)) {
+                queryString += " and a.updatetime<=:allocatEndDate ";
+            }
+            if (!("all").equals(syncStatus)) {
+                queryString += " and a.syncstatus =:syncStatus";
+            }
+            if (!("all").equals(factoryId)) {
+                queryString += " and a.factoryid =:factoryId";
+            }
+            if (!("").equals(doorName)) {
+                queryString += " and d.doorname like :doorName";
+            }
+            if (!("all").equals(operFlag)) {
+                queryString += " and a.operFlag =:operFlag";
+            }
+            if (!("").equals(building)) {
+                queryString += " and a.buildingid =:building ";
+            }
+            if (!("").equals(custName)) {
+                queryString += " and a.custname like :custName";
+            }
+            if (!("").equals(stuempNo)) {
+                queryString += " and a.stuempno like :stuempNo";
+            }
+            queryString += " ORDER by a.listid DESC";
+
+            Query query = entityManager.createNativeQuery(queryString, TDoorcardlstInfo.class);
+
+            if (!"".equals(allocatStartDate)) {
+                query.setParameter("allocatStartDate", allocatStartDate + "000000");
+            }
+            if (!"".equals(allocatEndDate)) {
+                query.setParameter("allocatEndDate", allocatEndDate + "235959");
+            }
+
+
+            query.setParameter("operids", opername);
+            if (!("all").equals(syncStatus)) {
+                query.setParameter("syncStatus", syncStatus);
+            }
+            if (!("all").equals(factoryId)) {
+                query.setParameter("factoryId", factoryId);
+            }
+            if (!("").equals(doorName)) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!("all").equals(operFlag)) {
+                query.setParameter("operFlag", operFlag);
+            }
+            if (!("").equals(building)) {
+                query.setParameter("building", building);
+            }
+            if (!("").equals(custName)) {
+                query.setParameter("custName", "%" + custName + "%");
+            }
+            if (!("").equals(stuempNo)) {
+                query.setParameter("stuempNo", stuempNo);
+            }
+            List<TDoorcardlstInfo> tDoorcardlstInfos = query.getResultList();
+            SimpleDateFormat _ymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
+            SimpleDateFormat ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            for (TDoorcardlstInfo grp : tDoorcardlstInfos) {
+                List<String> factory = RedisUtil.lrange("dict_4", 0, -1);
+                List<String> operflag = RedisUtil.lrange("dict_2", 0, -1);
+                List<String> sync = RedisUtil.lrange("dict_3", 0, -1);
+                if(operflag!= null && operflag.size()>0){
+                    String operFlagIndex = grp.getOperFlagIndex();
+                    for (String s : operflag) {
+                        String[] split = s.split("_");
+                        if (operFlagIndex.equals(split[0])){
+                            grp.setOperFlag(split[1]);
+                            break;
+                        }
+                    }
+                }
+                if(sync!= null && sync.size()>0){
+                    String syncStatus1 = grp.getSyncStatus();
+                    for (String s : sync) {
+                        String[] split = s.split("_");
+                        if (syncStatus1.equals(split[0])){
+                            grp.setSyncStatus(split[1]);
+                            break;
+                        }else {
+                            grp.setSyncStatus("");
+                        }
+                    }
+                }
+                if(factory != null && factory.size()>0){
+                    String factoryId1 = grp.getFactoryId();
+                    for (String s : factory) {
+                        String[] split = s.split("_");
+                        if (factoryId1.equals(split[0])){
+                            grp.setFactoryName(split[1]);
+                            break;
+                        }else {
+                            grp.setFactoryName("");
+                        }
+                    }
+                }else {
+                    queryString = "select a.id.dictcaption from TDictionary a where a.id.dicttype=:dicttype and a.id.dictval=:dictval";
+                    query = entityManager.createQuery(queryString);
+                    query.setParameter("dicttype", 4);
+                    query.setParameter("dictval", grp.getFactoryId());
+                    if(null != query.getSingleResult()){
+                        grp.setFactoryName(query.getSingleResult().toString());
+                    }else {
+                        grp.setFactoryName("");
+                    }
+
+                    query.setParameter("dicttype", 3);
+                    query.setParameter("dictval", grp.getSyncStatus());
+                    if(null != query.getSingleResult()) {
+                        grp.setSyncStatus(query.getSingleResult().toString());
+                    }else {
+                        grp.setSyncStatus("");
+                    }
+                    query.setParameter("dicttype", 2);
+                    if (grp.getOperFlagIndex() != null) {
+                        query.setParameter("dictval", grp.getOperFlagIndex());
+                        grp.setOperFlag(query.getSingleResult().toString());
+                    }
+                }
+
+
+                String time = grp.getAllocatTime();
+                Date date;
+                String hms = "000000";
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setAllocatTime(ymdhms.format(date));
+                    } else {
+
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time + "");
+                        grp.setAllocatTime(ymdhms.format(date));
+                    }
+
+                }
+
+                time = grp.getSyncTime();
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setSyncTime(ymdhms.format(date));
+                    } else {
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time);
+                        grp.setSyncTime(ymdhms.format(date));
+                    }
+
+                }
+
+                time = grp.getFeedbackTime();
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setFeedbackTime(ymdhms.format(date));
+                    } else {
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time);
+                        grp.setFeedbackTime(ymdhms.format(date));
+                    }
+                }
+
+            }
+
+            pageNo = pageNo <= 0 ? 1 : pageNo;
+            query.setFirstResult((pageNo - 1) * pageSize);
+            query.setMaxResults(pageSize);
+            Pagination page = new Pagination();
+            page.setPageNo(pageNo);
+            page.setPageSize(pageSize);
+            page.setList(tDoorcardlstInfos);
+            int totalCount = tDoorcardlstInfos.size();
+            page.setTotalCount(totalCount);
+            return page;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public List<TDoorcardlstInfo> getAllCardListMap(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, List<String> opername, String operFlag, String building) {
+        try {
+            String queryString = "select a.listid, a.factoryId,d.doorName,a.custName,g.operName,a.stuempNo," +
+                    "a.syncStatus,a.operFlag operFlagIndex,a.updatetime allocatTime,a.syncTime,a.closedate," +
+                    "b.updatetime feedbackTime,b.retmsg,a.reason ,a.buildingName,f.regionName" +
+                    " from t_doorcardlst a left join t_rtnresult b on a.listid=b.listid " +
+                    " left join tb_region f on a.regionid=f.regionid " +
+                    " left join t_doordev d on a.deviceid=d.doorid" +
+                    " left join tb_operator g on a.operid=g.operid" +
+                    " where 1>0 " +
+                    "  and (a.operid in (:operids ) " +
+                    " or a.deviceid in (select deviceid from T_OPERDEVICE o where o.operid in(:operids)))";
+            if (!"".equals(allocatStartDate)) {
+                queryString += " and a.updatetime>=:allocatStartDate ";
+            }
+            if (!"".equals(allocatEndDate)) {
+                queryString += " and a.updatetime<=:allocatEndDate ";
+            }
+            if (!("all").equals(syncStatus)) {
+                queryString += " and a.syncstatus =:syncStatus";
+            }
+            if (!("all").equals(factoryId)) {
+                queryString += " and a.factoryid =:factoryId";
+            }
+            if (!("").equals(doorName)) {
+                queryString += " and d.doorname like :doorName";
+            }
+            if (!("all").equals(operFlag)) {
+                queryString += " and a.operFlag =:operFlag";
+            }
+            if (!("").equals(building)) {
+                queryString += " and a.buildingid =:building";
+            }
+            if (!("").equals(custName)) {
+                queryString += " and a.custname like :custName";
+            }
+            if (!("").equals(stuempNo)) {
+                queryString += " and a.stuempno like :stuempNo";
+            }
+            queryString += " order by a.listid DESC";
+
+            Query query = entityManager.createNativeQuery(queryString, TDoorcardlstInfo.class);
+            if (!"".equals(allocatStartDate)) {
+                query.setParameter("allocatStartDate", allocatStartDate + "000000");
+            }
+            if (!"".equals(allocatEndDate)) {
+                query.setParameter("allocatEndDate", allocatEndDate + "235959");
+            }
+
+
+            query.setParameter("operids", opername);
+            if (!("all").equals(syncStatus)) {
+                query.setParameter("syncStatus", syncStatus);
+            }
+            if (!("all").equals(factoryId)) {
+                query.setParameter("factoryId", factoryId);
+            }
+            if (!("").equals(doorName)) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!("all").equals(operFlag)) {
+                query.setParameter("operFlag", operFlag);
+            }
+            if (!("").equals(building)) {
+                query.setParameter("buildingid", building);
+            }
+            if (!("").equals(custName)) {
+                query.setParameter("custName", "%" + custName + "%");
+            }
+            if (!("").equals(stuempNo)) {
+                query.setParameter("stuempNo", "%" + stuempNo + "%");
+            }
+
+            List<TDoorcardlstInfo> tDoorcardlstInfos = query.getResultList();
+            SimpleDateFormat _ymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
+            SimpleDateFormat ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            for (TDoorcardlstInfo grp : tDoorcardlstInfos) {
+                List<String> factory = RedisUtil.lrange("dict_4", 0, -1);
+                List<String> operflag = RedisUtil.lrange("dict_2", 0, -1);
+                List<String> sync = RedisUtil.lrange("dict_3", 0, -1);
+                if(operflag!= null && operflag.size()>0){
+                    String operFlagIndex = grp.getOperFlagIndex();
+                    for (String s : operflag) {
+                        String[] split = s.split("_");
+                        if (operFlagIndex.equals(split[0])){
+                            grp.setOperFlag(split[1]);
+                            break;
+                        }
+                    }
+                }
+                if(sync!= null && sync.size()>0){
+                    String syncStatus1 = grp.getSyncStatus();
+                    for (String s : sync) {
+                        String[] split = s.split("_");
+                        if (syncStatus1.equals(split[0])){
+                            grp.setSyncStatus(split[1]);
+                            break;
+                        }else {
+                            grp.setSyncStatus("");
+                        }
+                    }
+                }
+                if(factory != null && factory.size()>0){
+                    String factoryId1 = grp.getFactoryId();
+                    for (String s : factory) {
+                        String[] split = s.split("_");
+                        if (factoryId1.equals(split[0])){
+                            grp.setFactoryName(split[1]);
+                            break;
+                        }else {
+                            grp.setFactoryName("");
+                        }
+                    }
+                }else {
+                    queryString = "select a.id.dictcaption from TDictionary a where a.id.dicttype=:dicttype and a.id.dictval=:dictval";
+                    query = entityManager.createQuery(queryString);
+                    query.setParameter("dicttype", 4);
+                    query.setParameter("dictval", grp.getFactoryId());
+                    if(null != query.getSingleResult()){
+                        grp.setFactoryName(query.getSingleResult().toString());
+                    }else {
+                        grp.setFactoryName("");
+                    }
+
+                    query.setParameter("dicttype", 3);
+                    query.setParameter("dictval", grp.getSyncStatus());
+                    if(null != query.getSingleResult()) {
+                        grp.setSyncStatus(query.getSingleResult().toString());
+                    }else {
+                        grp.setSyncStatus("");
+                    }
+                    query.setParameter("dicttype", 2);
+                    if (grp.getOperFlagIndex() != null) {
+                        query.setParameter("dictval", grp.getOperFlagIndex());
+                        grp.setOperFlag(query.getSingleResult().toString());
+                    }
+                }
+
+                String time = grp.getAllocatTime();
+                Date date;
+                String hms = "000000";
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setAllocatTime(ymdhms.format(date));
+                    } else {
+
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time + "");
+                        grp.setAllocatTime(ymdhms.format(date));
+                    }
+
+                }
+
+                time = grp.getSyncTime();
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setSyncTime(ymdhms.format(date));
+                    } else {
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time);
+                        grp.setSyncTime(ymdhms.format(date));
+                    }
+
+                }
+
+                time = grp.getFeedbackTime();
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setFeedbackTime(ymdhms.format(date));
+                    } else {
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time);
+                        grp.setFeedbackTime(ymdhms.format(date));
+                    }
+                }
+            }
+            return tDoorcardlstInfos;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public void updateDoorcardlstToNoWithIds(List<Long> listIds) {
+        String sql = "update T_DOORCARDLST set version = version+1,syncstatus='0',SYNCTIME='', UPDATETIME=to_char(current_timestamp, 'YYYYMMDDHH24MISS') where listid in " + StringUtil.intOrLikeIntListTransToStr(listIds);
+        Query query = entityManager.createNativeQuery(sql);
+        query.executeUpdate();
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/KeyDaoImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/KeyDaoImpl.java
new file mode 100644
index 0000000..789dfb3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/KeyDaoImpl.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.mainservice.dao.impl;
+
+import com.supwisdom.dlpay.mainservice.dao.KeyDao;
+import com.supwisdom.dlpay.mainservice.domain.TKey;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+import java.util.List;
+
+@Repository
+public class KeyDaoImpl implements KeyDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public List<TKey> getAllKeys() throws Exception {
+        String sql = "select bean from TKey bean order by bean.factoryid desc";
+        TypedQuery<TKey> query = entityManager.createQuery(sql, TKey.class);
+        return query.getResultList();
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/domain/TKey.java b/src/main/java/com/supwisdom/dlpay/mainservice/domain/TKey.java
new file mode 100644
index 0000000..319a24e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/domain/TKey.java
@@ -0,0 +1,75 @@
+package com.supwisdom.dlpay.mainservice.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * Author. jov
+ * Date. 14-12-16
+ * Describtion.
+ */
+@Entity
+@Table(name = "T_KEYS")
+public class TKey {
+    private String factoryid;
+    private String keyval;
+    private String ip;
+    private String factoryname;
+    private String queueflag;
+    
+    public TKey() {
+    }
+
+    public TKey(String factoryid, String keyval) {
+        this.factoryid = factoryid;
+        this.keyval = keyval;
+    }
+
+    @Id
+    @Column(name = "FACTORYID", nullable = false, length = 9)
+    public String getFactoryid() {
+        return factoryid;
+    }
+
+    public void setFactoryid(String factoryid) {
+        this.factoryid = factoryid;
+    }
+
+    @Column(name = "KEYVAL", length = 32)
+    public String getKeyval() {
+        return keyval;
+    }
+
+    public void setKeyval(String keyval) {
+        this.keyval = keyval;
+    }
+
+    @Column(name = "IP", length = 120)
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+    @Column(name = "FACTORYNAME", length = 150)
+    public String getFactoryname() {
+		return this.factoryname;
+	}
+
+	public void setFactoryname(String factoryname) {
+		this.factoryname = factoryname;
+	}
+	
+	@Column(name = "QUEUEFLAG", length = 12)
+	public String getQueueflag() {
+		return this.queueflag;
+	}
+
+	public void setQueueflag(String queueflag) {
+		this.queueflag = queueflag;
+	}
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
new file mode 100644
index 0000000..e7955a3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.mainservice.service;
+
+import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.mainservice.domain.TKey;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface WebInterfaceService {
+
+    //获取所有厂商
+    public List<TKey> getAllKeys() throws Exception;
+
+    //根据查询条件分页获取流水
+    public Pagination getAllCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate,
+                                             String doorName, String custName, String stuempNo, String syncStatus, List<String> opername,String operFlag, String building, int pageNo, int pageSize);
+
+    //根据查询条件获取导出表单信息
+    public List<TDoorcardlstInfo> getAllCardListMap(String factoryId, String allocatStartDate, String allocatEndDate,
+                                                    String doorName, String custName, String stuempNo, String syncStatus, List<String> opername, String operFlag, String building);
+
+    //根据名单编号将已同步的名单修改为未同步使其重新同步
+    public void updateDoorcardlstToNoWithIds (List<Long> listIds);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java
new file mode 100644
index 0000000..f9f4633
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.mainservice.service.impl;
+
+import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.mainservice.dao.CardListDao;
+import com.supwisdom.dlpay.mainservice.dao.KeyDao;
+import com.supwisdom.dlpay.mainservice.domain.TKey;
+import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class WebInterfaceServiceImpl implements WebInterfaceService {
+    @Autowired
+    KeyDao keyDao;
+    @Autowired
+    CardListDao cardListDao;
+
+    @Override
+    public List<TKey> getAllKeys() throws Exception {
+        return keyDao.getAllKeys();
+    }
+
+    @Override
+    public Pagination getAllCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, List<String> opername, String operFlag, String building, int pageNo, int pageSize) {
+        return cardListDao.getAllCardListFrSearch(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, opername, operFlag, building, pageNo, pageSize);
+    }
+
+    @Override
+    public List<TDoorcardlstInfo> getAllCardListMap(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, List<String> opername, String operFlag, String building) {
+        return cardListDao.getAllCardListMap(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, opername, operFlag, building);
+    }
+
+    @Override
+    public void updateDoorcardlstToNoWithIds(List<Long> listIds) {
+        cardListDao.updateDoorcardlstToNoWithIds(listIds);
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java b/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java
new file mode 100644
index 0000000..413fd5b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.query.controller;
+
+import org.springframework.stereotype.Controller;
+
+@Controller("/query")
+public class QueryController {
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java b/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
index bbd7a5c..a08eece 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
@@ -28,7 +28,7 @@
     }
 
     @GetMapping("/function/list")
-    @PreAuthorize("hasPermission('/function/index','')")
+    //@PreAuthorize("hasPermission('/function/index','')")
     @ResponseBody
     public PageResult<TFunction> getDataList(@RequestParam("page") Integer pageNo,
                                              @RequestParam("limit") Integer pageSize,
@@ -48,13 +48,13 @@
     }
 
     @GetMapping("/function/loadadd")
-    @PreAuthorize("hasPermission('/function/loadadd','')")
+    //@PreAuthorize("hasPermission('/function/loadadd','')")
     public String loadadd() {
         return "system/function/form";
     }
 
     @PostMapping("/function/add")
-    @PreAuthorize("hasPermission('/function/add','')")
+    //@PreAuthorize("hasPermission('/function/add','')")
     @ResponseBody
     public JsonResult add(@RequestBody TFunction function) {
         if (function != null) {
@@ -64,7 +64,7 @@
         }
     }
     @PostMapping("/function/delfunc")
-    @PreAuthorize("hasPermission('/function/delfunc','')")
+    //@PreAuthorize("hasPermission('/function/delfunc','')")
     @ResponseBody
     public JsonResult delfunc(@RequestParam Integer funcid) {
         return functionService.deleteFunction(funcid);
@@ -83,7 +83,7 @@
     }
 
     @GetMapping("/function/loadsubadd")
-    @PreAuthorize("hasPermission('/function/loadsubadd','')")
+    //@PreAuthorize("hasPermission('/function/loadsubadd','')")
     public String loadsubadd(Model model) {
         List<TFunction> functionList = functionService.getParentFunction();
         model.addAttribute("list", functionList);
@@ -91,7 +91,7 @@
     }
 
     @GetMapping("/function/loadres")
-    @PreAuthorize("hasPermission('/function/loadres','')")
+    //@PreAuthorize("hasPermission('/function/loadres','')")
     public String loadres(@RequestParam Integer functionid, Model model) {
         TFunction function = functionService.getFunctionById(functionid);
         List<TResource> resources = functionService.getResources(functionid);
@@ -100,7 +100,7 @@
         return "system/function/reslist";
     }
     @GetMapping("/function/reslist")
-    @PreAuthorize("hasPermission('/function/loadres','')")
+    //@PreAuthorize("hasPermission('/function/loadres','')")
     @ResponseBody
     public PageResult<TResource> reslist(@RequestParam Integer functionid, Model model) {
         List<TResource> resources = functionService.getResources(functionid);
@@ -114,7 +114,7 @@
     }
 
     @PostMapping("/function/addres")
-    @PreAuthorize("hasPermission('/function/addres','')")
+    //@PreAuthorize("hasPermission('/function/addres','')")
     @ResponseBody
     public JsonResult addres(@RequestBody TResource resource) {
         if (resource != null) {
@@ -130,7 +130,7 @@
         return "system/function/resform";
     }
     @PostMapping("/function/delres")
-    @PreAuthorize("hasPermission('/function/delres','')")
+    //@PreAuthorize("hasPermission('/function/delres','')")
     @ResponseBody
     public JsonResult delres(@RequestParam Integer resid) {
         return functionService.deleteResource(resid);
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
index dc0ef57..b1599d1 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -31,7 +31,7 @@
     private RoleService roleService;
 
     @GetMapping("/index")
-    @PreAuthorize("hasPermission('/operator/index','')")
+    //@PreAuthorize("hasPermission('/operator/index','')")
     public String indexView(Model model) {
         return "system/operator/index";
     }
@@ -64,7 +64,7 @@
     }
 
     @GetMapping("/load4add")
-    @PreAuthorize("hasPermission('/operator/load4add','')")
+    //@PreAuthorize("hasPermission('/operator/load4add','')")
     public String load4addOperator(Model model) {
         model.addAttribute("roles", roleService.findAllRoles());
         return "system/operator/operator";
@@ -90,7 +90,7 @@
     }
 
     @PostMapping("/add")
-    @PreAuthorize("hasPermission('/operator/add','')")
+    //@PreAuthorize("hasPermission('/operator/add','')")
     @ResponseBody
     public JsonResult add(@RequestParam("operid") String operid, @RequestParam("opercode") String opercode,
                           @RequestParam("opername") String opername, @RequestParam("sex") String sex,
@@ -115,7 +115,7 @@
     }
 
     @PostMapping("/resetpwd")
-    @PreAuthorize("hasPermission('/operator/resetpwd','')")
+    //@PreAuthorize("hasPermission('/operator/resetpwd','')")
     @ResponseBody
     public JsonResult resetpwd(@RequestParam("operid") String operid) {
         if (operatorService.resetPwd(operid)) {
@@ -126,7 +126,7 @@
     }
 
     @PostMapping("/updatestate")
-    @PreAuthorize("hasPermission('/operator/updatestate','')")
+    //@PreAuthorize("hasPermission('/operator/updatestate','')")
     @ResponseBody
     public JsonResult updatestate(@RequestParam("operid") String operid, @RequestParam("state") String state) {
         if (operatorService.updateState(operid, state)) {
@@ -142,7 +142,7 @@
     }
 
     @GetMapping("/logslist")
-    @PreAuthorize("hasPermission('/operator/logslist','')")
+    //@PreAuthorize("hasPermission('/operator/logslist','')")
     @ResponseBody
     public PageResult<TOperLog> logslist(@RequestParam("page") Integer pageNo,
                                          @RequestParam("limit") Integer pageSize,
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
index 48d2bfc..12b7613 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
@@ -29,21 +29,6 @@
         return "system/role/index";
     }
 
-    @RequestMapping("/doorlistMgr/downDoorList")
-    public String downDoorList(ModelMap model){
-        return "doorlist/addDoorlist";
-    }
-
-    @RequestMapping("/doorlistMgr/deleteDoorList")
-    public String deleteDoorList(ModelMap model){
-        return "doorlist/deleteDoorlist";
-    }
-
-    @RequestMapping("/doorlistMgr/searchDoorlist")
-    public String searchDoorlist(ModelMap model){
-        return "doorlist/searchDoorlist";
-    }
-
     @RequestMapping("/query/tdoorstream")
     public String tdoorstream(ModelMap model){
         return "query/tdoorstream";
@@ -54,7 +39,7 @@
 
 
     @GetMapping("/role/list")
-    @PreAuthorize("hasPermission('/role/index','')")
+    //@PreAuthorize("hasPermission('/role/index','')")
     @ResponseBody
     public PageResult<TRole> getDataList(@RequestParam("page") Integer pageNo,
                                          @RequestParam("limit") Integer pageSize,
@@ -79,7 +64,7 @@
     }
 
     @PostMapping("/role/add")
-    @PreAuthorize("hasPermission('/role/add','')")
+    //@PreAuthorize("hasPermission('/role/add','')")
     @ResponseBody
     public JsonResult add(@RequestBody TRole role) {
         if (role != null) {
@@ -90,13 +75,13 @@
     }
 
     @GetMapping("/role/loadfunc")
-    @PreAuthorize("hasPermission('/role/loadfunc','')")
+    //@PreAuthorize("hasPermission('/role/loadfunc','')")
     public String loadfunc() {
         return "system/role/func";
     }
 
     @PostMapping("/role/addfunc")
-    @PreAuthorize("hasPermission('/role/addfunc','')")
+    //@PreAuthorize("hasPermission('/role/addfunc','')")
     @ResponseBody
     public JsonResult addfunc(@RequestParam String roleId,
                               @RequestParam String funcs) {
@@ -112,7 +97,7 @@
         return result;
     }
     @PostMapping("/role/del")
-    @PreAuthorize("hasPermission('/role/del','')")
+    //@PreAuthorize("hasPermission('/role/del','')")
     @ResponseBody
     public JsonResult del(@RequestParam String  roleid) {
         return roleService.deleteRole(roleid);
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/OperatorDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/OperatorDao.java
new file mode 100644
index 0000000..31bf34d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/OperatorDao.java
@@ -0,0 +1,8 @@
+package com.supwisdom.dlpay.system.dao;
+
+import java.util.List;
+
+public interface OperatorDao {
+
+    public List<String> findOperatorsByFopercode(String operid);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/OperatorDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/OperatorDaoImpl.java
new file mode 100644
index 0000000..9949432
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/OperatorDaoImpl.java
@@ -0,0 +1,69 @@
+package com.supwisdom.dlpay.system.dao.impl;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.system.dao.OperatorDao;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.ArrayList;
+import java.util.List;
+
+@Repository
+public class OperatorDaoImpl implements OperatorDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public List<String> findOperatorsByFopercode(String operid) {
+        try{
+            String sql = "select bean from TOperator bean where bean.status='0' and bean.father.opercode =?1 ";
+            TypedQuery<TOperator> query = entityManager.createQuery(sql, TOperator.class);
+            query.setParameter(1, operid);
+            List<TOperator> tOperators = new ArrayList<TOperator>();
+            tOperators.addAll(query.getResultList());
+            List<String> allopercode = new ArrayList<String>();
+            if(tOperators != null && tOperators.size() > 0){
+                for(TOperator grp:tOperators){
+                    allopercode.add(grp.getOpercode());
+                }
+                boolean index = false;
+                List<TOperator> lstsons = new ArrayList<TOperator>();
+                List<TOperator> lstson = new ArrayList<TOperator>();
+                lstson.addAll(tOperators);
+                while(lstson != null && lstson.size() > 0){
+                    if(index){
+                        for(TOperator grp:lstson){
+                            allopercode.add(grp.getOpercode());
+                        }
+                    }
+                    index = true;
+                    if(!lstsons.isEmpty()){
+                        lstsons.clear();
+                    }
+                    for(TOperator grp:lstson){
+                        String queryString = "select bean from TOperator bean where bean.father.opercode =?1";
+                        query = entityManager.createQuery(queryString, TOperator.class);
+                        query.setParameter(1, grp.getOpercode());
+                        lstsons.addAll(query.getResultList());
+                    }
+                    if(!lstson.isEmpty()){
+                        lstson.clear();
+                    }
+                    lstson.addAll(lstsons);
+                }
+            }
+            allopercode.add(operid);
+
+            return allopercode;
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
index 32155a5..24ec522 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
@@ -9,16 +9,27 @@
 import java.util.List;
 
 public interface SystemService {
+
+    //根据查询条件分页查询字典
     public Pagination findDictionary(String dicttype, String dictcaption, Integer pageNo, Integer pageSize);
 
+    //获取所有字典类型
     public List<DictionaryType> findDictionaryType();
 
+    //保存字典值
     public boolean saveDictionary(String dicttype, String dicttypename, String dictval, String dictcaption);
 
+    //根据类型获取字典值
     public List<TDictionaryId> findTDictionaryByType(int type);
 
+    //根据类型和值获取字典值
     public List<TDictionaryId> findByType(int type, String dicVal);
 
+    //修改字典值
     public TDictionary updateDictionary(String dicttype, String dicttypename, String dictval, String dictcaption, String oriengaltype, String oriengalval);
 
+    //根据操作员id获取有权限的操作员
+    public List<String> findOperatorsByFopercode(String operid);
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
index 32e4ce7..6b47410 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.system.service.impl;
 
 import com.supwisdom.dlpay.system.dao.DictionaryDao;
+import com.supwisdom.dlpay.system.dao.OperatorDao;
 import com.supwisdom.dlpay.system.domain.DictionaryType;
 import com.supwisdom.dlpay.system.domain.TDictionary;
 import com.supwisdom.dlpay.system.domain.TDictionaryId;
@@ -15,6 +16,9 @@
 public class SystemServiceImpl implements SystemService {
     @Autowired
     private DictionaryDao dictionaryDao;
+    @Autowired
+    private OperatorDao operatorDao;
+
     @Override
     public Pagination findDictionary(String dicttype, String dictcaption, Integer pageNo, Integer pageSize) {
         return dictionaryDao.findDictionary(dicttype, dictcaption, pageNo, pageSize);
@@ -52,4 +56,10 @@
     public TDictionary updateDictionary(String dicttype, String dicttypename, String dictval, String dictcaption, String oriengaltype, String oriengalval) {
         return dictionaryDao.updateDictionary(dicttype, dicttypename, dictval, dictcaption, oriengaltype, oriengalval);
     }
+
+    @Override
+    public List<String> findOperatorsByFopercode(String operid) {
+        return operatorDao.findOperatorsByFopercode(operid);
+    }
+
 }
diff --git a/src/main/resources/templates/doorlist/searchDoorlist.html b/src/main/resources/templates/doorlist/searchDoorlist.html
index 0794d86..15c1d41 100644
--- a/src/main/resources/templates/doorlist/searchDoorlist.html
+++ b/src/main/resources/templates/doorlist/searchDoorlist.html
@@ -87,13 +87,13 @@
                         </el-form-item>
                     </el-col>
                     <el-col :span="8">
-                        <el-form-item label="设备类型">
-                            <el-select v-model="searchDoorForm.useType" placeholder="请选择">
+                        <el-form-item label="楼栋">
+                            <el-select v-model="searchDoorForm.building" placeholder="请选择">
                                 <el-option
-                                        v-for="usetype in useTypes"
-                                        :key="usetype.value"
-                                        :label="usetype.label"
-                                        :value="usetype.value">
+                                        v-for="building in buildings"
+                                        :key="building.value"
+                                        :label="building.label"
+                                        :value="building.value">
                                 </el-option>
                             </el-select>
                         </el-form-item>
@@ -133,6 +133,11 @@
                         width="100">
                 </el-table-column>
                 <el-table-column
+                        prop="buildingname"
+                        label="楼栋"
+                        min-width="140">
+                </el-table-column>
+                <el-table-column
                         prop="doorName"
                         label="设备名称"
                         width="180">
@@ -148,10 +153,15 @@
                         width="150">
                 </el-table-column>
                 <el-table-column
-                        prop="deptName"
-                        label="部门"
+                        prop="buildingName"
+                        label="楼栋"
                         width="180">
                 </el-table-column>
+                    <el-table-column
+                            prop="regionName"
+                            label="区域"
+                            width="130">
+                    </el-table-column>
                 <el-table-column
                         prop="closedate"
                         label="有效期"
@@ -198,12 +208,7 @@
                         label="名单备注"
                         min-width="200">
                 </el-table-column>
-                <el-table-column
-                        prop="usetype"
-                        label="设备使用类型"
-                        min-width="140"
-                        :formatter="usetypeform">
-                </el-table-column>
+
                 </el-table>
                 <div class="clearfix"></div>
                 <el-pagination
@@ -255,12 +260,12 @@
                 stuempNo: '',
                 syncStatus: '',
                 operFlag: '',
-                useType: '',
+                building: '',
             },
             factoryIds: [],
             syncStatus: [],
             operFlag: [],
-            useTypes: [],
+            buildings: [],
             selectList:[],
             dialogFormVisible: false,
             dlgAllotDevVisible: false,
@@ -296,9 +301,6 @@
             currRowChange: function (val) {
                 this.currentRow = val;
             },
-            handleRowClick: function (row, event, column) {
-                fillDialog(row);
-            },
             query: function () {
                 this.pagesize = 10;
                 this.currPage = 1;
@@ -318,19 +320,7 @@
             formatDate:function (row, column, cellValue){
                 return cellValue.substr(0,4)+"-"+cellValue.substr(4,2)+"-"+cellValue.substr(6,2);
             },
-            usetypeform: function (row, column, cellValue) {
-                if (row.usetype == 'MJ') {
-                    return '门禁';
-                } else if (row.usetype == 'TD') {
-                    return '通道';
-                } else if (row.usetype == 'KQ') {
-                    return "考勤";
-                } else if (row.usetype == 'HY') {
-                    return "会议签到";
-                } else {
-                    return row.usetype;
-                }
-            },
+
             handleSelect:function(val){
                 this.selectList=val;
             }
@@ -380,26 +370,26 @@
                             label: operDict[i]["dictcaption"]
                         })
                     }
-                    var useTypes = [];
-                    var useType = data.useTypes;
-                    useTypes.push({
-                        value: "all",
+                    var buildings = [];
+                    var building = data.buildings;
+                    buildings.push({
+                        value: "",
                         label: "全部"
                     })
-                    for (var i = 0; i < useType.length; i++) {
-                        useTypes.push({
-                            value: useType[i]["dictval"],
-                            label: useType[i]["dictcaption"]
+                    for (var i = 0; i < building.length; i++) {
+                        buildings.push({
+                            value: building[i]["buildingid"],
+                            label: building[i]["buildingname"]
                         })
                     }
                     vue.factoryIds = factoryList;
                     vue.syncStatus = syncDicts;
                     vue.operFlag = operDicts;
-                    vue.useTypes = useTypes;
+                    vue.buildings = buildings;
                     vue.searchDoorForm.factoryId = 'all';
                     vue.searchDoorForm.syncStatus = 'all';
                     vue.searchDoorForm.operFlag = 'all';
-                    vue.searchDoorForm.useType = 'all';
+                    vue.searchDoorForm.building = '';
                 }
             })
             this.searchDoorForm.allocatStartDate ='';
@@ -428,23 +418,6 @@
         return fmt;
     }
 
-    function fillDialog(rowData) {
-        if (rowData.operFlagIndex == "D") {
-            layer.msg('已删除的名单没有时间段和节假日名称！', {icon: 2, time: 1000});
-        } else {
-            var url = "/doorlistMgr/getTimeAndHolidayName.json?" + "&listid=" + rowData.listid;
-            $.get(url).success(function (data, status) {
-                if (data.alloTimeName == undefined) {
-                    layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
-                    window.location = "login";
-                    return;
-                }
-                vue.alloTimeName = data.alloTimeName;
-                vue.alloHolidayName = data.alloHolidayName;
-                vue.dialogFormVisible = true;
-            });
-        }
-    }
 
     function commonQuery(_self, searchDoor, pageno, pagesize) {
         var startStr = '';
@@ -458,17 +431,23 @@
                 endStr = searchDoor.allocatEndDate.Format('yyyyMMdd');
             }
         }
-        var url = "/doorlistMgr/getAllCardList.json?" + "&allocatStartDate=" + startStr + "&allocatEndDate=" + endStr +
+        var url = "/doorlistMgr/getAllCardList?" + "&allocatStartDate=" + startStr + "&allocatEndDate=" + endStr +
             "&doorName=" + searchDoor.doorName + "&custName=" + searchDoor.custName
             + "&stuempNo=" + searchDoor.stuempNo + "&factoryId=" + searchDoor.factoryId
             + "&syncStatus=" + searchDoor.syncStatus +
             "&pageNo=" + pageno + "&pageSize=" + pagesize + "&operFlag=" + searchDoor.operFlag
-            + "&useType=" + searchDoor.useType;
+            + "&building=" + searchDoor.building;
+        var token=$("meta[name='_csrf_token']").attr("value");
         $.ajax({
             type: "POST",
             dataType: "json",
             url: encodeURI(url),
             contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
             success: function (ret) {
                 if (ret.PageResult != null) {
                     _self.totSize = ret.PageResult.totalCount;
@@ -497,11 +476,11 @@
                 endStr = searchDoor.allocatEndDate.Format('yyyyMMdd');
             }
         }
-        var url = "/doorlistMgr/exportExcel.json?" + "&allocatStartDate=" + startStr + "&allocatEndDate=" + endStr +
+        var url = "/doorlistMgr/exportExcel?" + "&allocatStartDate=" + startStr + "&allocatEndDate=" + endStr +
             "&doorName=" + searchDoor.doorName + "&custName=" + searchDoor.custName
             + "&stuempNo=" + searchDoor.stuempNo + "&factoryId=" + searchDoor.factoryId
             + "&syncStatus=" + searchDoor.syncStatus + "&operFlag=" + searchDoor.operFlag
-            + "&useType=" + searchDoor.useType;
+            + "&building=" + searchDoor.building;
 //        window.location.href
         var uri = encodeURI(url);
         window.open(uri);
@@ -514,11 +493,17 @@
         }else {
             layer.confirm('确定要重新下发这些名单吗？', {icon: 3, title:'请确认',offset:'30%'},function(index){
                 var url = "/doorlistMgr/reSaveDoorCardList.json";
+                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})
diff --git a/src/main/resources/templates/query/tdoorstream.html b/src/main/resources/templates/query/tdoorstream.html
index 3ab95b3..583ac64 100644
--- a/src/main/resources/templates/query/tdoorstream.html
+++ b/src/main/resources/templates/query/tdoorstream.html
@@ -43,11 +43,11 @@
                     </el-col>
                     <el-col :span="8">
                         <label class="control-label "
-                               style="margin-right:10px;font-size: 14px;width:80px">设备类型:</span>
+                               style="margin-right:10px;font-size: 14px;width:80px">楼栋:</span>
                         </label>
                         <el-select style="width:193px"
-                                   v-model="tdoorstream.usetype" placeholder="请选择" @change="query">
-                            <el-option v-for="item in usetypes"
+                                   v-model="tdoorstream.building" placeholder="请选择" >
+                            <el-option v-for="item in buildings"
                                        :key="item.value" :label="item.label" :value="item.value">
                             </el-option>
                         </el-select>
@@ -72,6 +72,19 @@
                             </el-option>
                         </el-select>
                     </el-col>
+
+
+                    <el-col :span="8">
+                        <label class="control-label "
+                               style="margin-right:10px;font-size: 14px;width:80px">区域:</span>
+                        </label>
+                        <el-select style="width:193px" v-model="tdoorstream.region" placeholder="请选择" >
+                            <el-option v-for="item in regions"
+                                       :key="item.value" :label="item.label" :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </el-col>
+
                     <el-col :span="8" >
                         <button type="button" class="btn btn-info" @click="query"
                                 id="qrybtn" style="margin-left:95px">查 询</button>
@@ -108,6 +121,12 @@
                             prop="transdate" label="刷卡时间" width="210" sortable :formatter="dateFormat">
                     </el-table-column>
                     <el-table-column
+                            prop="buildingname" label="楼栋" width="200">
+                    </el-table-column>
+                    <el-table-column
+                            prop="regionname" label="区域" width="125">
+                    </el-table-column>
+                    <el-table-column
                             prop="dtldesc" label="描述" width="125">
                     </el-table-column>
                     <el-table-column
@@ -152,7 +171,8 @@
             },
 
             tlist:[],
-            usetypes:[],
+            buildings:[],
+            regions:[],
             dtlstatus:[],
             currentRow : null,
             tdoorstream : {
@@ -161,8 +181,9 @@
                 factoryid:'',
                 deptfullname:'',
                 doorname:'',
-                usetype:'',
-                dtlStatus:'all'
+                building:'',
+                dtlStatus:'all',
+                region:''
             },
         },
         methods : {
@@ -241,7 +262,7 @@
                     }
                     _self.dtlstatus = dtllist;
 
-                    var ut=ret.usetypes;
+                    var ut=ret.buildings;
                     var rows = [];
                     rows.push({
                         value:'',
@@ -249,13 +270,28 @@
                     });
                     for ( var i = 0; i < ut.length; i++) {
                         rows.push({
-                            value:ut[i].dictval,
-                            label:ut[i].dictcaption
+                            value:ut[i].buildingid,
+                            label:ut[i].buildingname
                         });
                     }
                     vue.usetypes=rows;
                     vue.tdoorstream.usetype='';
 
+                    var rg=ret.regions;
+                    var rgion = [];
+                    rgion.push({
+                        value:'',
+                        label:"全部"
+                    });
+                    for (var j = 0; j < rg.length; j++){
+                        rgion.push({
+                            value:rg[j].regionid,
+                            label:rg[j].regionname
+                        });
+                    }
+                    vue.regions=rgion;
+                    vue.tdoorstream.region='';
+
                     _self.loading=false;
                 }
             })
