diff --git a/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java b/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
index 1cd837b..193273c 100644
--- a/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
@@ -96,7 +96,8 @@
      * @param stuempNo
      * @param syncStatus
      * @param operFlag
-     * @param building
+     * @param buildingname
+     * @param regionname
      * @param allocatStartDate
      * @param allocatEndDate
      * @param pageNo
@@ -113,7 +114,8 @@
                                  @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 = "buildingname", required = false, defaultValue = "") String buildingname,
+                                 @RequestParam(value = "regionname",required = false,defaultValue = "") String regionname,
                                  @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,
@@ -127,7 +129,7 @@
 
             Pagination pResult;
             pResult = webInterfaceService.getAllCardListFrSearch(factoryId, allocatStartDate, allocatEndDate,
-                    doorName, custName, stuempNo, syncStatus, allopername, operFlag, building, pageNo, pageSize);
+                    doorName, custName, stuempNo, syncStatus, allopername, operFlag, buildingname,regionname, pageNo, pageSize);
             map.put("PageResult", pResult);
             map.put("index", flag);
             map.put("result", "查询设备名单成功！");
@@ -150,7 +152,8 @@
      * @param stuempNo
      * @param syncStatus
      * @param operFlag
-     * @param building
+     * @param buildingname
+     * @param regionname
      * @param allocatStartDate
      * @param allocatEndDate
      * @param operUser
@@ -163,7 +166,8 @@
                          @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 = "buildingname", required = false, defaultValue = "") String buildingname,
+                         @RequestParam(value = "regionname",required = false,defaultValue = "") String regionname,
                          @RequestParam(value = "allocatStartDate", required = false, defaultValue = "") String allocatStartDate,
                          @RequestParam(value = "allocatEndDate", required = false, defaultValue = "") String allocatEndDate,
                          @AuthenticationPrincipal TOperator operUser) {
@@ -172,7 +176,7 @@
          */
         List<String> allopername = systemService.findOperatorsByFopercode(operUser.getOperid());
         List<TDoorcardlstInfo> cardList = webInterfaceService.getAllCardListMap(factoryId, allocatStartDate, allocatEndDate,
-                doorName, custName, stuempNo, syncStatus, allopername, operFlag, building);
+                doorName, custName, stuempNo, syncStatus, allopername, operFlag, buildingname,regionname);
 
         /**
          * 2.设置表格属性: title:标题  sheetName:工作簿名 type:表格类型
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoordtlInfo.java b/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoordtlInfo.java
index b49a994..c588233 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoordtlInfo.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoordtlInfo.java
@@ -2,9 +2,14 @@
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
 
+import javax.persistence.Entity;
+import javax.persistence.Id;
 import java.io.Serializable;
 
+@Entity
 public class TDoordtlInfo implements Serializable{
+	@Id
+	private String listid;
 	@Excel(name = "厂商名称")
 	private String factoryname;
 	@Excel(name = "设备编号")
@@ -17,9 +22,9 @@
 	private String custname;
 	@Excel(name = "楼栋",width = 30)
 	private String buildingname;
-	@Excel(name = "区域",width = 30)
+	@Excel(name = "区域")
 	private String regionname;
-	@Excel(name = "物理卡号")
+	@Excel(name = "物理卡号",width = 30)
 	private String cardphyid;
 	@Excel(name = "刷卡时间",databaseFormat = "yyyy-MM-dd",width = 20)
 	private String transdate;
@@ -30,6 +35,14 @@
 	@Excel(name = "采集时间",databaseFormat = "yyyy-MM-dd",width = 20)
 	private String coldate;
 
+	public String getListid() {
+		return listid;
+	}
+
+	public void setListid(String listid) {
+		this.listid = listid;
+	}
+
 	public String getDoorid() {
 		return doorid;
 	}
@@ -111,4 +124,20 @@
 	public void setColdate(String coldate) {
 		this.coldate = coldate;
 	}
+
+	public TDoordtlInfo(String listid, String factoryname, String doorid, String doorname, String stuempno, String custname, String buildingname, String regionname, String cardphyid, String transdate, String dtldesc, String status, String coldate) {
+		this.listid = listid;
+		this.factoryname = factoryname;
+		this.doorid = doorid;
+		this.doorname = doorname;
+		this.stuempno = stuempno;
+		this.custname = custname;
+		this.buildingname = buildingname;
+		this.regionname = regionname;
+		this.cardphyid = cardphyid;
+		this.transdate = transdate;
+		this.dtldesc = dtldesc;
+		this.status = status;
+		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
index 941cdb9..e2e1b60 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/dao/CardListDao.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/CardListDao.java
@@ -8,10 +8,10 @@
 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);
+                                             String doorName, String custName, String stuempNo, String syncStatus, List<String> opername, String operFlag, String buildingname,String regionname, 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);
+                                                    String doorName, String custName, String stuempNo, String syncStatus, List<String> operids, String operFlag, String buildingname,String regionname);
 
     public void updateDoorcardlstToNoWithIds(List<Long> listIds);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/DoordtlDao.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/DoordtlDao.java
new file mode 100644
index 0000000..35e75d8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/DoordtlDao.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.mainservice.dao;
+
+import com.supwisdom.dlpay.mainservice.bean.TDoordtlInfo;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface DoordtlDao {
+    public List<TDoordtlInfo> findExportExcelDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno,
+                                                     String custname, String buildingname, String regionname, String doorName, String factoryId, String streamstatus);
+
+    public Pagination findSystemTDoordtl(
+            String startTranDate, String endTranDate,String startTranTime, String endTranTime,String stuempno,
+            String custname,String buildingname,String doorName,String factoryId,String streamstatus,int pageNo,int pageSize,String regionname);
+
+
+    public Pagination findAllTDoordtl(
+            String operid,String startTranDate, String endTranDate,String startTranTime, String endTranTime,String stuempno,
+            String custname,String buildingname,String doorName,String factoryId,String streamstatus,int pageNo,int pageSize,String regionname);
+}
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
index 722afdd..c081d4d 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CardListDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CardListDaoImpl.java
@@ -9,7 +9,6 @@
 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;
@@ -24,7 +23,7 @@
 
     @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) {
+    public Pagination getAllCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus,List<String> operids, String operFlag, String buildingname,String regionname, int pageNo, int pageSize) {
         try {
 
             String queryString = "select a.listid, a.factoryId,d.doorName,a.custName,g.operName,a.stuempNo," +
@@ -55,8 +54,18 @@
             if (!("all").equals(operFlag)) {
                 queryString += " and a.operFlag =:operFlag";
             }
-            if (!("").equals(building)) {
-                queryString += " and a.buildingid =:building ";
+            if (!("").equals(buildingname)) {
+                queryString += " and a.buildingname like :buildingname ";
+            }
+            if (!regionname.equals("")){
+                queryString += "and a.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                        + "union all  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                        + ") select regionid from tmp  )";
             }
             if (!("").equals(custName)) {
                 queryString += " and a.custname like :custName";
@@ -76,7 +85,7 @@
             }
 
 
-            query.setParameter("operids", opername);
+            query.setParameter("operids", operids);
             if (!("all").equals(syncStatus)) {
                 query.setParameter("syncStatus", syncStatus);
             }
@@ -89,8 +98,11 @@
             if (!("all").equals(operFlag)) {
                 query.setParameter("operFlag", operFlag);
             }
-            if (!("").equals(building)) {
-                query.setParameter("building", building);
+            if (!("").equals(buildingname)) {
+                query.setParameter("buildingname", "%"+buildingname+"%");
+            }
+            if (!("").equals(regionname)){
+                query.setParameter("regionname", "%"+regionname+"%");
             }
             if (!("").equals(custName)) {
                 query.setParameter("custName", "%" + custName + "%");
@@ -98,6 +110,17 @@
             if (!("").equals(stuempNo)) {
                 query.setParameter("stuempNo", stuempNo);
             }
+
+            pageNo = pageNo <= 0 ? 1 : pageNo;
+            query.setFirstResult((pageNo - 1) * pageSize);
+            query.setMaxResults(pageSize);
+            Pagination page = new Pagination();
+            page.setPageNo(pageNo);
+            page.setPageSize(pageSize);
+
+            int totalCount = getAllCardListCount(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operids, operFlag, buildingname, regionname);
+            page.setTotalCount(totalCount);
+
             List<TDoorcardlstInfo> tDoorcardlstInfos = query.getResultList();
             SimpleDateFormat _ymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
             SimpleDateFormat ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -207,15 +230,7 @@
 
             }
 
-            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();
@@ -223,9 +238,103 @@
         return null;
     }
 
+    private int getAllCardListCount(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus,List<String> operids, String operFlag, String buildingname,String regionname){
+        try {
+            String queryString = "select count(a.listid) from TDoorcardlst a," +
+                    "TDoordev d " +
+                    " left join tb_region f on a.regionid=f.regionid " +
+                    "where  a.id.factoryid=d.id.factoryid " +
+                    " and a.id.deviceid=d.id.doorid " +
+                    " and (a.operid in (:operids) " +
+                    " or a.id.deviceid in (select oe.id.deviceid from TOperdevice oe where oe.id.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.id.factoryid =:factoryId";
+            }
+            if (!("all").equals(operFlag)) {
+                queryString += " and a.operfalg =:operFlag";
+            }
+            if (!("").equals(buildingname)) {
+                queryString += " and a.buildingname like :buildingname ";
+            }
+            if (!regionname.equals("")){
+                queryString += "and a.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                        + "union all  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                        + ") select regionid from tmp  )";
+            }
+            if (!("").equals(doorName)) {
+                queryString += " and d.doorname like :doorName";
+            }
+            if (!("").equals(custName)) {
+                queryString += " and a.custname like :custName";
+            }
+            if (!("").equals(stuempNo)) {
+                queryString += " and a.stuempno like :stuempNo";
+            }
+            Query query = entityManager.createNativeQuery(queryString);
+            query.setParameter("operids", operids);
+            if (!"".equals(allocatStartDate)) {
+                query.setParameter("allocatStartDate", allocatStartDate + "000000");
+            }
+            if (!"".equals(allocatEndDate)) {
+                query.setParameter("allocatEndDate", allocatEndDate + "235959");
+            }
+
+            if (!("all").equals(syncStatus)) {
+                query.setParameter("syncStatus", syncStatus);
+            }
+            if (!("all").equals(factoryId)) {
+                query.setParameter("factoryId", factoryId);
+            }
+            if (!("all").equals(operFlag)) {
+                query.setParameter("operFlag", operFlag);
+            }
+            if (!("").equals(buildingname)) {
+                query.setParameter("buildingname", "%"+buildingname+"%");
+            }
+            if (!("").equals(regionname)){
+                query.setParameter("regionname", "%"+regionname+"%");
+            }
+            if (!("").equals(doorName)) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!("").equals(custName)) {
+                query.setParameter("custName", "%" + custName + "%");
+            }
+            if (!("").equals(stuempNo)) {
+                query.setParameter("stuempNo", stuempNo);
+            }
+            int cnt = 0;
+            List list = query.getResultList();
+            if (list!=null && list.size()>0){
+                Object o = list.get(0);
+                cnt = Integer.parseInt(o.toString());
+            }
+            return cnt;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+
+
     @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) {
+    public List<TDoorcardlstInfo> getAllCardListMap(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, List<String> operids, String operFlag, String buildingname,String regionname) {
         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," +
@@ -255,8 +364,18 @@
             if (!("all").equals(operFlag)) {
                 queryString += " and a.operFlag =:operFlag";
             }
-            if (!("").equals(building)) {
-                queryString += " and a.buildingid =:building";
+            if (!("").equals(buildingname)) {
+                queryString += " and a.buildingname like :buildingname";
+            }
+            if (!regionname.equals("")){
+                queryString += "and a.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                        + "union all  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                        + ") select regionid from tmp  )";
             }
             if (!("").equals(custName)) {
                 queryString += " and a.custname like :custName";
@@ -275,7 +394,7 @@
             }
 
 
-            query.setParameter("operids", opername);
+            query.setParameter("operids", operids);
             if (!("all").equals(syncStatus)) {
                 query.setParameter("syncStatus", syncStatus);
             }
@@ -288,8 +407,11 @@
             if (!("all").equals(operFlag)) {
                 query.setParameter("operFlag", operFlag);
             }
-            if (!("").equals(building)) {
-                query.setParameter("buildingid", building);
+            if (!("").equals(buildingname)) {
+                query.setParameter("buildingname", "%"+buildingname+"%");
+            }
+            if (!("").equals(regionname)){
+                query.setParameter("regionname","%"+regionname+"%");
             }
             if (!("").equals(custName)) {
                 query.setParameter("custName", "%" + custName + "%");
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/DoordtlDaoImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/DoordtlDaoImpl.java
new file mode 100644
index 0000000..3323dc6
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/DoordtlDaoImpl.java
@@ -0,0 +1,416 @@
+package com.supwisdom.dlpay.mainservice.dao.impl;
+
+import com.supwisdom.dlpay.mainservice.bean.TDoordtlInfo;
+import com.supwisdom.dlpay.mainservice.dao.DoordtlDao;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import java.util.List;
+
+@Repository
+public class DoordtlDaoImpl implements DoordtlDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public List<TDoordtlInfo> findExportExcelDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingname, String regionname, String doorName, String factoryId, String streamstatus) {
+        try {
+            String queryString = "select a.dtldesc , c.factoryname,d.doorname,b.stuempno,b.custname,tb.buildingname,tr.regionname," +
+                    " to_char(to_date(a.transdate||a.transtime ,'yyyymmddhh24miss'),'yyyy-mm-dd hh24:mi:ss') as transdate, "
+                    + "case when a.status='0' then '失败' else '成功' end status,to_char(to_date(  a.coldate||a.coltime,'yyyymmddhh24miss'),'yyyy-mm-dd hh24:mi:ss') as coldate  " + "from  "
+                    + "t_doordtl a "
+                    + "left join t_customer b on a.custid=b.custid " + "left join "
+                    + "t_building tb on b.buildingid=tb.buildingid " + "left join  "
+                    + "tb_region tr on a.regionid = tr.regionid "+ "left join  "
+                    + "t_doordev d  on a.doorid = d.doorid, " + "t_keys c " + "where a.factoryid=c.factoryid  ";
+            if (!startTranDate.equals("")) {
+                queryString += "  and a.transdate>=:startTranDate and a.transdate<=:endTranDate ";
+            }
+            if (!startTranTime.equals("")) {
+                queryString += "  and a.transtime>=:startTranTime and a.transtime<=:endTranTime ";
+            }
+            if (!stuempno.equals("")) {
+                queryString += " and b.stuempno like :stuempno ";
+            }
+            if (!custname.equals("")) {
+                queryString += " and b.custname like :custname ";
+            }
+            if (!buildingname.equals("")) {
+                queryString += " and tb.buildingname like :buildingname ";
+            }
+            if (!regionname.equals("")){
+                queryString += "and tr.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                        + "union all  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                        + ") select regionid from tmp  )";
+            }
+            if (!doorName.equals("")) {
+                queryString += " and d.doorName like :doorName ";
+            }
+            if (!factoryId.equals("all")) {
+                queryString += " and c.factoryId =:factoryId ";
+            }
+            if (!streamstatus.equals("all")) {
+                queryString += " and a.status =:streamstatus ";
+            }
+            Query query = entityManager.createNativeQuery(queryString, TDoordtlInfo.class);
+            if (!startTranDate.equals("")) {
+                query.setParameter("startTranDate", startTranDate);
+                query.setParameter("endTranDate", endTranDate);
+            }
+            if (!startTranTime.equals("")) {
+                query.setParameter("startTranTime", startTranTime);
+                query.setParameter("endTranTime", endTranTime);
+            }
+            if (!stuempno.equals("")) {
+                query.setParameter("stuempno", "%" + stuempno + "%");
+            }
+            if (!custname.equals("")) {
+                query.setParameter("custname", "%" + custname + "%");
+            }
+            if (!buildingname.equals("")) {
+                query.setParameter("buildingname", "%" + buildingname + "%");
+            }
+            if (!regionname.equals("")){
+                query.setParameter("regionname", "%" + regionname + "%");
+            }
+            if (!doorName.equals("")) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!factoryId.equals("all")) {
+                query.setParameter("factoryId", factoryId);
+            }
+            if (!streamstatus.equals("all")) {
+                query.setParameter("streamstatus", streamstatus);
+            }
+            List list = query.getResultList();
+            return list;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public Pagination findSystemTDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingname, String doorName, String factoryId, String streamstatus, int pageNo, int pageSize, String regionname) {
+        String queryString = "select a.doorid, d.doorname,a.stuempno,a.custname,a.transdate||a.transtime transdate,tb.buildingname,tr.regionname, "
+                + "case when a.status='0' then '失败' else '成功' end status,a.coldate||a.coltime coldate,a.dtldesc,a.cardphyid  "
+                + "from t_doordtl a left join t_doordev d  on a.doorid = d.doorid "
+                + "left join t_building tb on a.buildingid=tb.buildingid "
+                + "left join tb_region tr on a.regionid=tr.regionid "
+                + "where 1>0 ";
+        if (!startTranDate.equals("")) {
+            queryString += " and transdate between :startTranDate and :endTranDate ";
+        }
+        if (!stuempno.equals("")) {
+            queryString += " and a.stuempno like :stuempno ";
+        }
+        if (!custname.equals("")) {
+            queryString += " and a.custname like :custname ";
+        }
+        if (!doorName.equals("")) {
+            queryString += " and d.doorName like :doorName ";
+        }
+        if (!streamstatus.equals("all")) {
+            queryString += " and a.status =:streamstatus ";
+        }
+        if(!buildingname.equals("")){
+            queryString += " and tb.buildingname like :buildingname";
+        }
+        if (!regionname.equals("")){
+            queryString += "and tr.regionid in  "
+                    +"("
+                    + "with recursive tmp as  "
+                    + "("
+                    + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                    + "union all  "
+                    + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                    + ") select regionid from tmp  )";
+        }
+        queryString += " order by a.transdate DESC";
+        Query query = entityManager.createNativeQuery(queryString, TDoordtlInfo.class);
+        if (!startTranDate.equals("")) {
+            query.setParameter("startTranDate", startTranDate);
+            query.setParameter("endTranDate", endTranDate);
+        }
+        if (!stuempno.equals("")) {
+            query.setParameter("stuempno", stuempno);
+        }
+        if (!custname.equals("")) {
+            query.setParameter("custname", "%" + custname + "%");
+        }
+        if (!doorName.equals("")) {
+            query.setParameter("doorName", "%" + doorName + "%");
+        }
+        if (!streamstatus.equals("all")) {
+            query.setParameter("streamstatus", streamstatus);
+        }
+        if(!buildingname.equals("")){
+            query.setParameter("buildingname","%"+buildingname+"%");
+        }
+        if (!regionname.equals("")){
+            query.setParameter("regionname", "%"+regionname+"%");
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TDoordtlInfo> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getSystemCount(startTranDate, endTranDate, startTranTime, endTranTime, stuempno, custname,
+                buildingname, doorName, factoryId, streamstatus,regionname);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+
+
+
+    private int getSystemCount(String startTranDate, String endTranDate, String startTranTime, String endTranTime,
+                         String stuempno, String custname, String buildingname, String doorName,
+                         String factoryId, String streamstatus,String regionname) {
+        try {
+            String queryString = "select count(*) as cnt "
+                    + " from t_doordtl a "
+                    + " left join t_doordev d  on a.doorid = d.doorid "
+                    + "left join t_building tb on a.buildingid=tb.buildingid "
+                    + "left join tb_region tr on a.regionid=tr.regionid "
+                    + " where 1>0";
+
+            if (!startTranDate.equals("")) {
+                queryString += " and transdate between :startTranDate and :endTranDate ";
+            }
+            if (!stuempno.equals("")) {
+                queryString += " and a.stuempno = :stuempno ";
+            }
+            if (!custname.equals("")) {
+                queryString += " and a.custname like :custname ";
+            }
+            if (!doorName.equals("")) {
+                queryString += " and d.doorName like :doorName ";
+            }
+            if (!streamstatus.equals("all")) {
+                queryString += " and a.status =:streamstatus ";
+            }
+            if(!buildingname.equals("")){
+                queryString += " and tb.buildingname like :buildingname";
+            }
+            if (!regionname.equals("")){
+                queryString += "and tr.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                        + "union all  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                        + ") select regionid from tmp  )";
+            }
+            Query query = entityManager.createNativeQuery(queryString);
+            query.setMaxResults(5);
+            if (!startTranDate.equals("")) {
+                query.setParameter("startTranDate", startTranDate);
+                query.setParameter("endTranDate", endTranDate);
+            }
+            if (!stuempno.equals("")) {
+                query.setParameter("stuempno", stuempno);
+            }
+            if (!custname.equals("")) {
+                query.setParameter("custname", "%" + custname + "%");
+            }
+			if (!buildingname.equals("")) {
+                query.setParameter("buildingname", "%" + buildingname + "%");
+			}
+            if (!doorName.equals("")) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!streamstatus.equals("all")) {
+                query.setParameter("streamstatus", streamstatus);
+            }
+            if(!regionname.equals("")){
+                query.setParameter("regionname","%"+regionname+"%");
+            }
+            List list = query.getResultList();
+            int cnt = 0;
+            if (list!=null && list.size()>0){
+                cnt = Integer.parseInt(list.get(0).toString());
+            }
+            return cnt;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+
+    @Transactional
+    @Override
+    public Pagination findAllTDoordtl(String operid, String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingname, String doorName, String factoryId, String streamstatus, int pageNo, int pageSize, String regionname) {
+        try{
+            String queryString = "select a.doorid,d.doorname,a.stuempno,a.custname,a.transdate||a.transtime transdate,"
+                    + " case when a.status='0' then '失败' else '成功' end status,a.coldate||a.coltime coldate,a.dtldesc,a.cardphyid,tb.buildingname,tr.regionname "
+                    + " from t_doordtl a left join t_doordev d on a.doorid = d.doorid"
+                    + " left join t_operdevice od on a.doorid = od.deviceid"
+                    + "left join t_building tb on a.buildingid=tb.buildingid "
+                    + "left join tb_region tr on a.regionid=tr.regionid "
+                    + " where 1>0 and od.operid = :operid";
+            if (!startTranDate.equals("")) {
+                queryString += " and transdate between :startTranDate and :endTranDate ";
+            }
+            if (!stuempno.equals("")) {
+                queryString += " and a.stuempno like :stuempno ";
+            }
+            if (!custname.equals("")) {
+                queryString += " and a.custname like :custname ";
+            }
+            if (!doorName.equals("")) {
+                queryString += " and d.doorName like :doorName ";
+            }
+            if (!streamstatus.equals("all")) {
+                queryString += " and a.status =:streamstatus ";
+            }
+            if(!buildingname.equals("")){
+                queryString += " and tb.buildingname like :buildingname";
+            }
+            if (!regionname.equals("")){
+                queryString += "and tr.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                        + "union all  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                        + ") select regionid from tmp  )";
+            }
+            queryString += " order by transdate DESC";
+            Query query = entityManager.createNativeQuery(queryString, TDoordtlInfo.class);
+            query.setParameter("operid",operid);
+
+            if (!startTranDate.equals("")) {
+                query.setParameter("startTranDate", startTranDate);
+                query.setParameter("endTranDate", endTranDate);
+            }
+            if (!stuempno.equals("")) {
+                query.setParameter("stuempno", stuempno);
+            }
+            if (!custname.equals("")) {
+                query.setParameter("custname", "%" + custname + "%");
+            }
+            if (!doorName.equals("")) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!streamstatus.equals("all")) {
+                query.setParameter("streamstatus", streamstatus);
+            }
+            if (!buildingname.equals("")) {
+                query.setParameter("buildingname", "%" + buildingname + "%");
+            }
+            if(regionname.equals("")){
+                query.setParameter("regionname","%"+regionname+"%");
+            }
+            pageNo = pageNo <= 0 ? 1 : pageNo;
+            query.setFirstResult((pageNo - 1) * pageSize);
+            query.setMaxResults(pageSize);
+            Pagination page = new Pagination();
+            page.setPageNo(pageNo);
+            page.setPageSize(pageSize);
+            List<TDoordtlInfo> list = query.getResultList();
+            page.setList(list);
+            int totalCount = getAllCount(operid,startTranDate, endTranDate, startTranTime, endTranTime, stuempno, custname,
+                    buildingname, doorName, factoryId, streamstatus,regionname);
+            page.setTotalCount(totalCount);
+            return page;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private int getAllCount(String operid,String startTranDate, String endTranDate, String startTranTime, String endTranTime,
+                         String stuempno, String custname, String buildingname, String doorName,
+                         String factoryId, String streamstatus,String regionname) {
+        try {
+            String queryString = "select count(*) as cnt "
+                    + " from t_doordtl a "
+                    + " left join t_doordev d  on a.doorid = d.doorid "
+                    + " left join t_operdevice od on a.doorid = od.deviceid"
+                    + " left join t_building tb on a.buildingid=tb.buildingid "
+                    + " left join tb_region tr on a.regionid=tr.regionid "
+                    + " where 1>0 and od.operid = :operid";
+
+            if (!startTranDate.equals("")) {
+                queryString += " and transdate between :startTranDate and :endTranDate ";
+            }
+            if (!stuempno.equals("")) {
+                queryString += " and a.stuempno = :stuempno ";
+            }
+            if (!custname.equals("")) {
+                queryString += " and a.custname like :custname ";
+            }
+            if (!doorName.equals("")) {
+                queryString += " and d.doorName like :doorName ";
+            }
+            if (!streamstatus.equals("all")) {
+                queryString += " and a.status =:streamstatus ";
+            }
+            if(!buildingname.equals("")){
+                queryString += " and tb.buildingname like :buildingname";
+            }
+            if (!regionname.equals("")){
+                queryString += "and tr.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                        + "union all  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                        + ") select regionid from tmp  )";
+            }
+            Query query = entityManager.createNativeQuery(queryString);
+            query.setMaxResults(5);
+            query.setParameter("operid",operid);
+            if (!startTranDate.equals("")) {
+                query.setParameter("startTranDate", startTranDate);
+                query.setParameter("endTranDate", endTranDate);
+            }
+            if (!stuempno.equals("")) {
+                query.setParameter("stuempno", stuempno);
+            }
+            if (!custname.equals("")) {
+                query.setParameter("custname", "%" + custname + "%");
+            }
+            if (!doorName.equals("")) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!streamstatus.equals("all")) {
+                query.setParameter("streamstatus", streamstatus);
+            }
+            if (!buildingname.equals("")) {
+                query.setParameter("buildingname", "%" + buildingname + "%");
+            }
+            if(!regionname.equals("")){
+                query.setParameter("regionname","%"+regionname+"%");
+            }
+            List list = query.getResultList();
+            int cnt = 0;
+            if (list!=null && list.size()>0){
+                cnt = Integer.parseInt(list.get(0).toString());
+            }
+            return cnt;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
index e7955a3..feba2d1 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.mainservice.service;
 
 import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.mainservice.bean.TDoordtlInfo;
 import com.supwisdom.dlpay.mainservice.domain.TKey;
 import com.supwisdom.dlpay.system.page.Pagination;
 
@@ -13,12 +14,25 @@
 
     //根据查询条件分页获取流水
     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);
+                                             String doorName, String custName, String stuempNo, String syncStatus, List<String> opername,String operFlag, String buildingname,String regionname, 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);
+                                                    String doorName, String custName, String stuempNo, String syncStatus, List<String> operids, String operFlag, String buildingname,String regionname);
 
     //根据名单编号将已同步的名单修改为未同步使其重新同步
     public void updateDoorcardlstToNoWithIds (List<Long> listIds);
+
+    //根据查询条件获取导出Excel数据
+    public List<TDoordtlInfo> findExportExcelDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno,
+                                                     String custname, String buildingname, String regionname, String doorName, String factoryId, String streamstatus);
+
+    //根据查询条件获取系统管理员流水数据
+    public Pagination findSystemTDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno,
+                                         String custname, String buildingname, String doorName, String factoryId, String streamstatus, int pageNo, int pageSize,String regionname);
+
+    //根据管理员id和查询条件获取相应流水数据
+    public Pagination findAllTDoordtl(
+            String operid,String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno,
+            String custname, String buildingname, String doorName, String factoryId, String streamstatus, int pageNo, int pageSize,String regionname);
 }
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
index f9f4633..e286cd3 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java
@@ -1,7 +1,9 @@
 package com.supwisdom.dlpay.mainservice.service.impl;
 
 import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
+import com.supwisdom.dlpay.mainservice.bean.TDoordtlInfo;
 import com.supwisdom.dlpay.mainservice.dao.CardListDao;
+import com.supwisdom.dlpay.mainservice.dao.DoordtlDao;
 import com.supwisdom.dlpay.mainservice.dao.KeyDao;
 import com.supwisdom.dlpay.mainservice.domain.TKey;
 import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
@@ -17,6 +19,8 @@
     KeyDao keyDao;
     @Autowired
     CardListDao cardListDao;
+    @Autowired
+    DoordtlDao doordtlDao;
 
     @Override
     public List<TKey> getAllKeys() throws Exception {
@@ -24,17 +28,32 @@
     }
 
     @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);
+    public Pagination getAllCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, List<String> opername, String operFlag, String buildingname,String regionname, int pageNo, int pageSize) {
+        return cardListDao.getAllCardListFrSearch(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, opername, operFlag, buildingname,regionname, 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);
+    public List<TDoorcardlstInfo> getAllCardListMap(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, List<String> operids, String operFlag, String buildingname,String regionname) {
+        return cardListDao.getAllCardListMap(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operids, operFlag, buildingname,regionname);
     }
 
     @Override
     public void updateDoorcardlstToNoWithIds(List<Long> listIds) {
         cardListDao.updateDoorcardlstToNoWithIds(listIds);
     }
+
+    @Override
+    public List<TDoordtlInfo> findExportExcelDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingname, String regionname, String doorName, String factoryId, String streamstatus) {
+        return doordtlDao.findExportExcelDoordtl(startTranDate, endTranDate, startTranTime, endTranTime, stuempno, custname, buildingname, regionname, doorName, factoryId, streamstatus);
+    }
+
+    @Override
+    public Pagination findSystemTDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingname, String doorName, String factoryId, String streamstatus, int pageNo, int pageSize, String regionname) {
+        return doordtlDao.findSystemTDoordtl(startTranDate, endTranDate, startTranTime, endTranTime, stuempno, custname, buildingname, doorName, factoryId, streamstatus, pageNo, pageSize, regionname);
+    }
+
+    @Override
+    public Pagination findAllTDoordtl(String operid, String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingname, String doorName, String factoryId, String streamstatus, int pageNo, int pageSize, String regionname) {
+        return null;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
index 98dd04d..f52684a 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
@@ -30,7 +30,7 @@
     private NcService ncService;
     @Autowired
     private SystemService systemService;
-
+    
     @RequestMapping("/devindex")
     public String devindex(ModelMap model) {
         return "ncmgr/nc_dev";
@@ -63,7 +63,8 @@
      * @param pageNo
      * @param pageSize
      * @param devname
-     * @param buildingid
+     * @param buildingname
+     * @param regionname
      * @param devtype
      * @return
      */
@@ -74,12 +75,13 @@
                            @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
                            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
                            @RequestParam(value = "devname", required = false, defaultValue = "") String devname,
-                           @RequestParam(value = "buildingid", required = false, defaultValue = "") String buildingid,
+                           @RequestParam(value = "buildingname", required = false, defaultValue = "") String buildingname,
+                           @RequestParam(value = "regionname",required = false,defaultValue = "") String regionname,
                            @RequestParam(value = "devtype", required = false, defaultValue = "") String devtype){
         Map map = new HashMap();
         try{
             Pagination page = null;
-            page = ncService.getNcDeviceWithPage(devname, pageNo, pageSize, map, buildingid, devtype);
+            page = ncService.getNcDeviceWithPage(devname, pageNo, pageSize, map, buildingname,regionname, devtype);
             map.put("PageResult", page);
             List<TDictionaryId> dicts = systemService.findTDictionaryByType(8);
             map.put("dicts", dicts);
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
index dfd7458..ba92967 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
@@ -2,16 +2,19 @@
 
 import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.ncmgr.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 
 import java.util.List;
 import java.util.Map;
 
 public interface NcDeviceDao {
-    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingid, String devtype);
+    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingname,String regionname, String devtype);
 
     public List<TBuilding> getAllBuilding();
 
+    public List<TRegion> getAllRegion();
+
     public TBuilding getBuidingById(String id);
 
     public List<TNcDevice> getDevByType(String type);
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java
index 7aaa0f1..a48280a 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java
@@ -50,19 +50,44 @@
         if (weekid!=0) {
             query.setParameter("wid", weekid);
         }
-        List<TNcDevweek> list = query.getResultList();
+
         pageNo = pageNo <= 0 ? 1 : pageNo;
         query.setFirstResult((pageNo - 1) * pageSize);
         query.setMaxResults(pageSize);
         Pagination page = new Pagination();
         page.setPageNo(pageNo);
         page.setPageSize(pageSize);
+        List<TNcDevweek> list = query.getResultList();
         page.setList(list);
-        int totalCount = list.size();
+        int totalCount = getNcDevWeekCount(weekid, devname);
         page.setTotalCount(totalCount);
         return page;
     }
 
+
+    private int getNcDevWeekCount(int weekid,String devname){
+        String sql = "select count(*) from T_Nc_Devweek  where 1>0 ";
+        if (!StringUtil.isEmpty(devname)) {
+            sql += " and devname like :devname ";
+        }
+        if (weekid!=0) {
+            sql+=" and weekid=:wid ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        if (!StringUtil.isEmpty(devname)) {
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if (weekid!=0) {
+            query.setParameter("wid", weekid);
+        }
+        int cnt = 0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
     @Transactional
     @Override
     public void delDevWeekById(int devid, int weekid) {
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
index 12927b3..becafab 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
@@ -3,6 +3,7 @@
 import com.supwisdom.dlpay.ncmgr.dao.NcDeviceDao;
 import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.ncmgr.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
@@ -22,13 +23,26 @@
 
     @Transactional
     @Override
-    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingid, String devtype) {
-        String sql ="select * from T_Nc_Device bean where 1>0 and operflag='A'";
+    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingname,String regionname, String devtype) {
+        String sql ="select * from T_Nc_Device bean "
+                +" left join t_building tb on bean.buildingid=tb.buildingid"
+                +" left join tb_region tr on tr.regionid=tb.regionid"
+                +" where 1>0 and operflag='A'";
         if(!devname.equals("")){
             sql+="and devname like :devname ";
         }
-        if(!buildingid.equals("")){
-            sql+="and  buildingid = :buildingid ";
+        if(!buildingname.equals("")){
+            sql+="and  buildingname like :buildingname ";
+        }
+        if (!regionname.equals("")){
+            sql += "and tr.regionid in  "
+                    +"("
+                    + "with recursive tmp as  "
+                    + "("
+                    + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                    + "union all  "
+                    + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                    + ") select regionid from tmp  )";
         }
         if(!devtype.equals("")){
             sql+="and  devtype = :devtype ";
@@ -39,25 +53,75 @@
         if(!devname.equals("")){
             query.setParameter("devname", "%"+devname+"%");
         }
-        if(!buildingid.equals("")){
-            query.setParameter("buildingid", buildingid);
+        if(!buildingname.equals("")){
+            query.setParameter("buildingname", "%"+buildingname+"%");
         }
         if(!devtype.equals("")){
             query.setParameter("devtype", devtype);
         }
-        List<TNcDevice> list = query.getResultList();
+        if (!("").equals(regionname)){
+            query.setParameter("regionname", "%"+regionname+"%");
+        }
         pageNo = pageNo <= 0 ? 1 : pageNo;
         query.setFirstResult((pageNo - 1) * pageSize);
         query.setMaxResults(pageSize);
         Pagination page = new Pagination();
         page.setPageNo(pageNo);
         page.setPageSize(pageSize);
+        List<TNcDevice> list = query.getResultList();
         page.setList(list);
-        int totalCount = list.size();
+        int totalCount = getNcDeviceCount(devname, buildingname, regionname, devtype);
         page.setTotalCount(totalCount);
         return page;
     }
 
+    private int getNcDeviceCount(String devname, String buildingname,String regionname, String devtype){
+        String sql ="select count(bean.deviceid) from T_Nc_Device bean "
+                +" left join t_building tb on bean.buildingid=tb.buildingid"
+                +" left join tb_region tr on tr.regionid=tb.regionid"
+                +" where 1>0 and operflag='A'";
+        if(!devname.equals("")){
+            sql+="and devname like :devname ";
+        }
+        if(!buildingname.equals("")){
+            sql+="and  buildingname like :buildingname ";
+        }
+        if (!regionname.equals("")){
+            sql += "and tr.regionid in  "
+                    +"("
+                    + "with recursive tmp as  "
+                    + "("
+                    + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionname like :regionname  "
+                    + "union all  "
+                    + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "
+                    + ") select regionid from tmp  )";
+        }
+        if(!devtype.equals("")){
+            sql+="and  devtype = :devtype ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingname.equals("")){
+            query.setParameter("buildingname", "%"+buildingname+"%");
+        }
+        if(!devtype.equals("")){
+            query.setParameter("devtype", devtype);
+        }
+        if (!("").equals(regionname)){
+            query.setParameter("regionname", "%"+regionname+"%");
+        }
+        List list = query.getResultList();
+        int cnt = 0;
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+
+
     @Transactional
     @Override
     public List<TBuilding> getAllBuilding() {
@@ -67,6 +131,16 @@
         return list;
     }
 
+    @Transactional
+    @Override
+    public List<TRegion> getAllRegion() {
+        String sql = " select b FROM TRegion b WHERE b.flag=1 ";
+        TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);
+        List<TRegion> list = query.getResultList();
+        return list;
+    }
+
+    @Transactional
     @Override
     public TBuilding getBuidingById(String id) {
         String sql = "select b from TBuilding b where b.flag='A' and b.buildingid=:buildingid";
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java
index 7be59b3..23c7563 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java
@@ -29,20 +29,40 @@
         if (!timename.equals("")){
             query.setParameter("timename", "%"+timename+"%");
         }
-        List<TNcTime> list = query.getResultList();
+
         pageNo = pageNo <= 0 ? 1 : pageNo;
         query.setFirstResult((pageNo - 1) * pageSize);
         query.setMaxResults(pageSize);
         Pagination page = new Pagination();
         page.setPageNo(pageNo);
         page.setPageSize(pageSize);
+        List<TNcTime> list = query.getResultList();
         page.setList(list);
-        int totalCount = list.size();
+        int totalCount = getNcTimeCount(timename);
         page.setTotalCount(totalCount);
         return page;
 
     }
 
+    private int getNcTimeCount(String timename){
+        String sql = "select count(bean.timeid) from TNcTime bean where 1>0";
+        if (!timename.equals("")) {
+            sql+=" and bean.timename like :timename ";
+        }
+        Query query = entityManager.createQuery(sql);
+        if (!timename.equals("")){
+            query.setParameter("timename", "%"+timename+"%");
+        }
+        List list = query.getResultList();
+        int cnt=0;
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+
+    }
+
+
     @Transactional
     @Override
     public List<String> getTimegrpIdById(int id) {
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeGrpDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeGrpDaoImpl.java
index 3d9e931..c0b3e60 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeGrpDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeGrpDaoImpl.java
@@ -29,19 +29,36 @@
         if (!timename.isEmpty()){
             query.setParameter("timename", "%"+timename+"%");
         }
-        List<TNcTimegrp> list = query.getResultList();
         pageNo = pageNo <= 0 ? 1 : pageNo;
         query.setFirstResult((pageNo - 1) * pageSize);
         query.setMaxResults(pageSize);
         Pagination page = new Pagination();
         page.setPageNo(pageNo);
         page.setPageSize(pageSize);
+        List<TNcTimegrp> list = query.getResultList();
         page.setList(list);
-        int totalCount = list.size();
+        int totalCount = getNcTimeGrpCount(timename);
         page.setTotalCount(totalCount);
         return page;
     }
 
+    private int getNcTimeGrpCount(String timename){
+        String sql = "select count(bean.timegrpid) from TNcTimegrp bean where 1>0 ";
+        if (!timename.isEmpty()){
+            sql+=" and bean.timegrpname like :timename ";
+        }
+        Query query = entityManager.createQuery(sql);
+        if (!timename.isEmpty()){
+            query.setParameter("timename", "%"+timename+"%");
+        }
+        int cnt = 0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
     @Transactional
     @Override
     public TNcTimegrp findByTimeGrpId(int id) {
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java
index ee9c8a8..9ab6d71 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java
@@ -29,19 +29,37 @@
         if (!StringUtil.isEmpty(time)){
             query.setParameter("timename", "%"+time+"%");
         }
-        List<TNcWeektime> list = query.getResultList();
+
         pageNo = pageNo <= 0 ? 1 : pageNo;
         query.setFirstResult((pageNo - 1) * pageSize);
         query.setMaxResults(pageSize);
         Pagination page = new Pagination();
         page.setPageNo(pageNo);
         page.setPageSize(pageSize);
+        List<TNcWeektime> list = query.getResultList();
         page.setList(list);
-        int totalCount = list.size();
+        int totalCount = getNcWeekTimeCount(time);
         page.setTotalCount(totalCount);
         return page;
     }
 
+    private int getNcWeekTimeCount(String time){
+        String sql = "select count(bean.weekid) from TNcWeektime bean where 1>0 and bean.adddelflag=1 ";
+        if (!StringUtil.isEmpty(time)){
+            sql +=" and bean.weekname like :timename ";
+        }
+        Query query = entityManager.createQuery(sql);
+        if (!StringUtil.isEmpty(time)){
+            query.setParameter("timename", "%"+time+"%");
+        }
+        int cnt = 0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
     @Transactional
     @Override
     public TNcWeektime findByWeekTimeId(int id) {
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
index 41ee916..26c89bc 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
@@ -20,6 +20,7 @@
 	private String updtime;
 	private String flag;
 	private String buildingdesc;
+	private String regionid;
 
 	// Constructors
 
@@ -34,13 +35,14 @@
 
 	/** full constructor */
 	public TBuilding(String buildingid, String buildingname, String synctime,
-                     String updtime, String flag, String buildingdesc) {
+                     String updtime, String flag, String buildingdesc,String regionid) {
 		this.buildingid = buildingid;
 		this.buildingname = buildingname;
 		this.synctime = synctime;
 		this.updtime = updtime;
 		this.flag = flag;
 		this.buildingdesc = buildingdesc;
+		this.regionid = regionid;
 	}
 
 	// Property accessors
@@ -99,4 +101,12 @@
 		this.buildingdesc = buildingdesc;
 	}
 
+	@Column(name="REGIONID",length = 32)
+	public String getRegionid() {
+		return regionid;
+	}
+
+	public void setRegionid(String regionid) {
+		this.regionid = regionid;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TRegion.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TRegion.java
new file mode 100644
index 0000000..66edb0f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TRegion.java
@@ -0,0 +1,94 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "TB_REGION")
+public class TRegion implements Serializable {
+
+    private String regionid;
+    private String address;
+    private Integer level;
+    private String parentid;
+    private String regionname;
+    private String remarks;
+    private String parentname;
+    private Integer flag;
+
+    @Id
+    @Column(name = "REGIONID", unique = true, nullable = false, length = 32)
+    public String getRegionid() {
+        return regionid;
+    }
+
+    public void setRegionid(String regionid) {
+        this.regionid = regionid;
+    }
+
+    @Column(name = "ADDRESS", length = 255)
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    @Column(name = "LEVEL", length = 32)
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    @Column(name = "PARENTID", length = 32)
+    public String getParentid() {
+        return parentid;
+    }
+
+    public void setParentid(String parentid) {
+        this.parentid = parentid;
+    }
+
+    @Column(name = "REGIONNAME", length = 200)
+    public String getRegionname() {
+        return regionname;
+    }
+
+    public void setRegionname(String regionname) {
+        this.regionname = regionname;
+    }
+
+    @Column(name = "REMARKS", length = 255)
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    @Column(name = "PARENTNAME", length = 200)
+    public String getParentname() {
+        return parentname;
+    }
+
+    public void setParentname(String parentname) {
+        this.parentname = parentname;
+    }
+
+    @Column(name = "FLAG", length = 32)
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
index 12b48f6..378138d 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
@@ -8,11 +8,14 @@
 
 public interface NcService {
     //根据查询条件分页获取所有设备
-    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, Map map, String buildingid, String devtype);
+    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, Map map, String buildingname,String regionname, String devtype);
 
     //获取所有楼栋信息
     public List<TBuilding> getAllBuilding();
 
+    //获取所有区域信息
+    public List<TRegion> getAllRegion();
+
     //根据楼栋id获取楼栋信息
     public TBuilding getBuidingById(String id);
 
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
index bf5eb5b..9aea87b 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
@@ -27,8 +27,8 @@
 
 
     @Override
-    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, Map map, String buildingid, String devtype) {
-        Pagination page = ncDeviceDao.getNcDeviceWithPage(devname, pageNo, pageSize, buildingid, devtype);
+    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, Map map, String buildingname,String regionname, String devtype) {
+        Pagination page = ncDeviceDao.getNcDeviceWithPage(devname, pageNo, pageSize, buildingname,regionname, devtype);
         map.put("devPage", page);
         return page;
     }
@@ -39,6 +39,11 @@
     }
 
     @Override
+    public List<TRegion> getAllRegion() {
+        return ncDeviceDao.getAllRegion();
+    }
+
+    @Override
     public TBuilding getBuidingById(String id) {
         return ncDeviceDao.getBuidingById(id);
     }
diff --git a/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java b/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java
index 413fd5b..f152630 100644
--- a/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java
+++ b/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java
@@ -1,7 +1,201 @@
 package com.supwisdom.dlpay.query.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.TDoordtlInfo;
+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.domain.TRegion;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
 
-@Controller("/query")
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/query")
 public class QueryController {
+
+    @Autowired
+    WebInterfaceService webInterfaceService;
+
+    @Autowired
+    SystemService systemService;
+
+    @Autowired
+    NcService ncService;
+
+    @RequestMapping("/tdoorstream")
+    public String tdoorstream(ModelMap model){
+        return "query/tdoorstream";
+    }
+
+    /**
+     * 填充流水查询列表
+     * @return
+     * @throws Exception
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getSearchFactoryIdList")
+    public Map getSearchFactoryIdList() throws Exception {
+        Map map = new HashMap<>();
+        //所有厂商
+        List<TKey> allFactoryId = webInterfaceService.getAllKeys();
+        map.put("allFactoryId", allFactoryId);
+        //流水状态
+        List<TDictionaryId> dtlStatus = systemService.findTDictionaryByType(20);
+        map.put("dtlStatus",dtlStatus);
+        return map;
+    }
+
+
+    /**
+     * 获取需Excel导出流水数据
+     * @param request
+     * @param response
+     * @param startTranDate
+     * @param endTranDate
+     * @param startTranTime
+     * @param endTranTime
+     * @param stuempno
+     * @param custname
+     * @param buildingname
+     * @param regionname
+     * @param doorName
+     * @param factoryId
+     * @param streamstatus
+     */
+    @ResponseBody
+    @RequestMapping(value = "/exportexcel")
+    public void exportexcel(HttpServletRequest request, HttpServletResponse response,
+                            @RequestParam(value = "startTranDate", required = false, defaultValue = "") String startTranDate,
+                            @RequestParam(value = "endTranDate", required = false, defaultValue = "") String endTranDate,
+                            @RequestParam(value = "startTranTime", required = false, defaultValue = "000000") String startTranTime,
+                            @RequestParam(value = "endTranTime", required = false, defaultValue = "235959") String endTranTime,
+                            @RequestParam(value = "stuempno", required = false, defaultValue = "") String stuempno,
+                            @RequestParam(value = "custname", required = false, defaultValue = "") String custname,
+                            @RequestParam(value = "buildingname", required = false, defaultValue = "") String buildingname,
+                            @RequestParam(value = "regionname",required = false,defaultValue = "") String regionname,
+                            @RequestParam(value = "doorName", required = false, defaultValue = "") String doorName,
+                            @RequestParam(value = "factoryId", required = false, defaultValue = "all") String factoryId,
+                            @RequestParam(value = "streamstatus", required = false, defaultValue = "all") String streamstatus) {
+        Map map = new HashMap();
+        try {
+            if (startTranDate.equals("Invalid date")) {
+                startTranDate = "";
+                endTranDate = "";
+                startTranTime = "";
+                endTranTime = "";
+            }
+            /**
+             * 1. 查询数据
+             */
+            // final int max_field = 9;
+            // 保存表字段
+            List<TDoordtlInfo> tDoordtlInfos = webInterfaceService.findExportExcelDoordtl(startTranDate, endTranDate, startTranTime,
+                    endTranTime, stuempno, custname, buildingname,regionname, doorName, factoryId, streamstatus);
+            /**
+             * 2.设置表格属性: title:标题  sheetName:工作簿名 type:表格类型
+             */
+            ExportParams params = new ExportParams("设备流水列表", "设备流水", ExcelType.XSSF);
+//		params.setFreezeCol(2);
+            map.put(NormalExcelConstants.DATA_LIST, tDoordtlInfos);//设置值
+            map.put(NormalExcelConstants.PARAMS, params);//设置属性
+            map.put(NormalExcelConstants.CLASS, TDoordtlInfo.class);
+            map.put(NormalExcelConstants.FILE_NAME, "设备流水名单");
+            PoiBaseView.render(map, request, response, NormalExcelConstants.EASYPOI_EXCEL_VIEW);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("result", "导出excel文件失败");
+        }
+    }
+
+    /**
+     * 获取流水信息
+     * @param map
+     * @param request
+     * @param startTranDate
+     * @param endTranDate
+     * @param startTranTime
+     * @param endTranTime
+     * @param stuempno
+     * @param custname
+     * @param buildingname
+     * @param doorName
+     * @param factoryId
+     * @param streamstatus
+     * @param pageNo
+     * @param pageSize
+     * @param regionname
+     * @param operUser
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getSearchDoorStreamList")
+    public Map getSearchDoorStreamList( HttpServletRequest request,
+                                          @RequestParam(value = "startTranDate", required = false, defaultValue = "") String startTranDate,
+                                          @RequestParam(value = "endTranDate", required = false, defaultValue = "") String endTranDate,
+                                          @RequestParam(value = "startTranTime", required = false, defaultValue = "000000") String startTranTime,
+                                          @RequestParam(value = "endTranTime", required = false, defaultValue = "235959") String endTranTime,
+                                          @RequestParam(value = "stuempno", required = false, defaultValue = "") String stuempno,
+                                          @RequestParam(value = "custname", required = false, defaultValue = "") String custname,
+                                          @RequestParam(value = "buildingname", required = false, defaultValue = "") String buildingname,
+                                          @RequestParam(value = "doorName", required = false, defaultValue = "") String doorName,
+                                          @RequestParam(value = "factoryId", required = false, defaultValue = "all") String factoryId,
+                                          @RequestParam(value = "streamstatus", required = false, defaultValue = "all") String streamstatus,
+                                          @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                                          @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                                          @RequestParam(value = "regionname", required = false, defaultValue = "") String regionname,
+                                          @AuthenticationPrincipal TOperator operUser)
+            throws UnsupportedEncodingException {
+        Map map = new HashMap();
+        SimpleDateFormat ymd = new SimpleDateFormat("yyyyMMdd");
+        boolean index = true;
+        if (factoryId.equals("") || factoryId == null) {
+            factoryId = "all";
+        }
+        try {
+            if (startTranDate.equals("Invalid date")) {
+                startTranDate = "";
+                endTranDate = "";
+                startTranTime = "";
+                endTranTime = "";
+            }
+            Pagination tDoordtlInfo = new Pagination();
+            if (operUser.getOpertype().equals("S")){
+                tDoordtlInfo = webInterfaceService.findSystemTDoordtl(startTranDate, endTranDate, startTranTime,
+                        endTranTime, stuempno, custname, buildingname, doorName, factoryId, streamstatus, pageNo, pageSize,regionname);
+            }else {
+                tDoordtlInfo = webInterfaceService.findAllTDoordtl(operUser.getOperid(), startTranDate, endTranDate, startTranTime,
+                        endTranTime, stuempno, custname, buildingname, doorName, factoryId, streamstatus, pageNo, pageSize, regionname);
+            }
+            map.put("tDoordtlInfo", tDoordtlInfo);
+            map.put("index", index);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+
 }
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 12b7613..3efac1b 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
@@ -29,14 +29,6 @@
         return "system/role/index";
     }
 
-    @RequestMapping("/query/tdoorstream")
-    public String tdoorstream(ModelMap model){
-        return "query/tdoorstream";
-    }
-
-
-
-
 
     @GetMapping("/role/list")
     //@PreAuthorize("hasPermission('/role/index','')")
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
index b42f074..a12b97d 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
@@ -36,6 +36,16 @@
         return "system/queue";
     }
 
+    @RequestMapping("/regionindex")
+    public String regionindex(){
+        return "system/region";
+    }
+
+    @RequestMapping("/buildingindex")
+    public String buildingindex(){
+        return "system/building";
+    }
+
     /**
      * 获取字典列表
      * @param dicttype
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
index de3ec24..5887a6a 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
@@ -43,19 +43,43 @@
         if(!dictcaption.equals("")){
             query.setParameter("dictcaption", "%"+dictcaption+"%");
         }
-        List<TDictionary> list = query.getResultList();
+
         pageNo = pageNo <= 0 ? 1 : pageNo;
         query.setFirstResult((pageNo - 1) * pageSize);
         query.setMaxResults(pageSize);
         Pagination page = new Pagination();
         page.setPageNo(pageNo);
         page.setPageSize(pageSize);
+        List<TDictionary> list = query.getResultList();
         page.setList(list);
-        int totalCount = list.size();
+        int totalCount = findDictionaryCount(dicttype, dictcaption);
         page.setTotalCount(totalCount);
         return page;
     }
 
+    private int findDictionaryCount(String dicttype, String dictcaption){
+        String sql = "select count(*) from t_dictionary where 1>0 ";
+        if(!dicttype.equals("all")){
+            sql+="and t.dicttype=:dicttype ";
+        }
+        if(!dictcaption.equals("")){
+            sql+="and  t.dictcaption like :dictcaption ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        if(!dicttype.equals("all")){
+            query.setParameter("dicttype", Integer.parseInt(dicttype));
+        }
+        if(!dictcaption.equals("")){
+            query.setParameter("dictcaption", "%"+dictcaption+"%");
+        }
+        int cnt = 0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
     @Transactional
     @Override
     public List<DictionaryType> findDictionaryType() {
diff --git a/src/main/resources/templates/doorlist/searchDoorlist.html b/src/main/resources/templates/doorlist/searchDoorlist.html
index 15c1d41..b874920 100644
--- a/src/main/resources/templates/doorlist/searchDoorlist.html
+++ b/src/main/resources/templates/doorlist/searchDoorlist.html
@@ -25,13 +25,13 @@
                     </el-col>
 
                     <el-col :span="8">
-                        <el-form-item label="厂商">
-                            <el-select v-model="searchDoorForm.factoryId" placeholder="请选择">
+                        <el-form-item label="名单状态">
+                            <el-select v-model="searchDoorForm.syncStatus" placeholder="请选择">
                                 <el-option
-                                        v-for="fid in factoryIds"
-                                        :key="fid.value"
-                                        :label="fid.label"
-                                        :value="fid.value">
+                                        v-for="status in syncStatus"
+                                        :key="status.value"
+                                        :label="status.label"
+                                        :value="status.value">
                                 </el-option>
                             </el-select>
                         </el-form-item>
@@ -74,28 +74,20 @@
                             </el-select>
                         </el-form-item>
                     </el-col>
-                    <el-col :span="8">
-                        <el-form-item label="名单状态">
-                            <el-select v-model="searchDoorForm.syncStatus" placeholder="请选择">
-                                <el-option
-                                        v-for="status in syncStatus"
-                                        :key="status.value"
-                                        :label="status.label"
-                                        :value="status.value">
-                                </el-option>
-                            </el-select>
-                        </el-form-item>
-                    </el-col>
+
                     <el-col :span="8">
                         <el-form-item label="楼栋">
-                            <el-select v-model="searchDoorForm.building" placeholder="请选择">
-                                <el-option
-                                        v-for="building in buildings"
-                                        :key="building.value"
-                                        :label="building.label"
-                                        :value="building.value">
-                                </el-option>
-                            </el-select>
+                            <el-input v-model="searchDoorForm.buildingname" placeholder="楼栋名称">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-form-item>
+                    </el-col>
+
+                    <el-col :span="8">
+                        <el-form-item label="区域">
+                            <el-input v-model="searchDoorForm.regionname" placeholder="区域名称">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
                         </el-form-item>
                     </el-col>
                 </el-row>
@@ -260,12 +252,12 @@
                 stuempNo: '',
                 syncStatus: '',
                 operFlag: '',
-                building: '',
+                buildingname: '',
+                regionname:''
             },
             factoryIds: [],
             syncStatus: [],
             operFlag: [],
-            buildings: [],
             selectList:[],
             dialogFormVisible: false,
             dlgAllotDevVisible: false,
@@ -370,7 +362,7 @@
                             label: operDict[i]["dictcaption"]
                         })
                     }
-                    var buildings = [];
+                    /*var buildings = [];
                     var building = data.buildings;
                     buildings.push({
                         value: "",
@@ -381,15 +373,15 @@
                             value: building[i]["buildingid"],
                             label: building[i]["buildingname"]
                         })
-                    }
+                    }*/
                     vue.factoryIds = factoryList;
                     vue.syncStatus = syncDicts;
                     vue.operFlag = operDicts;
-                    vue.buildings = buildings;
+                    //vue.buildings = buildings;
                     vue.searchDoorForm.factoryId = 'all';
                     vue.searchDoorForm.syncStatus = 'all';
                     vue.searchDoorForm.operFlag = 'all';
-                    vue.searchDoorForm.building = '';
+                    //vue.searchDoorForm.building = '';
                 }
             })
             this.searchDoorForm.allocatStartDate ='';
@@ -436,7 +428,7 @@
             + "&stuempNo=" + searchDoor.stuempNo + "&factoryId=" + searchDoor.factoryId
             + "&syncStatus=" + searchDoor.syncStatus +
             "&pageNo=" + pageno + "&pageSize=" + pagesize + "&operFlag=" + searchDoor.operFlag
-            + "&building=" + searchDoor.building;
+            + "&buildingname=" + searchDoor.buildingname+"&regionname=" +searchDoor.regionname;
         var token=$("meta[name='_csrf_token']").attr("value");
         $.ajax({
             type: "POST",
@@ -480,7 +472,7 @@
             "&doorName=" + searchDoor.doorName + "&custName=" + searchDoor.custName
             + "&stuempNo=" + searchDoor.stuempNo + "&factoryId=" + searchDoor.factoryId
             + "&syncStatus=" + searchDoor.syncStatus + "&operFlag=" + searchDoor.operFlag
-            + "&building=" + searchDoor.building;
+            + "&buildingname=" + searchDoor.buildingname+"&regionname="+searchDoor.regionname;
 //        window.location.href
         var uri = encodeURI(url);
         window.open(uri);
diff --git a/src/main/resources/templates/ncmgr/nc_dev.html b/src/main/resources/templates/ncmgr/nc_dev.html
index f4983e2..b94c176 100644
--- a/src/main/resources/templates/ncmgr/nc_dev.html
+++ b/src/main/resources/templates/ncmgr/nc_dev.html
@@ -41,22 +41,26 @@
                 </div>
                 <div class="col-md-3" >
                     <div class="form-group">
-                        <label class="control-label col-md-6 col-sm-12 col-xs-12" style="font-size: 14px;">设备所在楼栋:</span>
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">所在区域:</span>
                         </label>
-                        <div class="col-md-6 col-sm-12 col-xs-12">
-                            <el-select v-model="devform.buildingname" style="width: 140px" filterable placeholder="请选择">
-                                <el-option
-                                        v-for="building in buildings"
-                                        :key="building.value"
-                                        :label="building.label"
-                                        :value="building.value">
-                                </el-option>
-                            </el-select>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="devform.regionname" id="regionname"></el-input>
                         </div>
                     </div>
                 </div>
 
-                <div class="col-md-3" style="padding-left: 50px">
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">所在楼栋:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="devform.buildingname" id="buildingname"></el-input>
+                        </div>
+                    </div>
+                </div>
+
+
+                <div class="col-md-12" style="padding-left: 905px">
                     <div class="form-group">
                         <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addDev">添加设备</button>
@@ -108,6 +112,11 @@
                             width="140">
                     </el-table-column>
                     <el-table-column
+                            prop="regionname"
+                            label="设备所属区域"
+                            width="140">
+                    </el-table-column>
+                    <el-table-column
                             prop="ip"
                             label="IP"
                             width="150">
@@ -308,7 +317,8 @@
             devform: {
                 devname: '',
                 buildingname: '',
-                devtype: ''
+                devtype: '',
+                regionname:''
             },
             checkvisible: true,
             continueadd: true,
@@ -497,7 +507,7 @@
                     var rows = [];
                     rows.push({
                         value: '',
-                        label: "全部"
+                        label: ""
                     });
                     for (var i = 0; i < ut.length; i++) {
                         rows.push({
@@ -540,7 +550,7 @@
         $.ajax({
             type: "get",
             dataType: "json",
-            url: encodeURI("/ncmgr/loadDevList?devname=" + rolename.devname + "&pageNo=" + pageno + "&pageSize=" + pagesize + "&buildingid=" + rolename.buildingname + "&devtype=" + rolename.devtype),
+            url: encodeURI("/ncmgr/loadDevList?devname=" + rolename.devname + "&pageNo=" + pageno + "&pageSize=" + pagesize + "&buildingname=" + rolename.buildingname + "&devtype=" + rolename.devtype+"&regionname="+rolename.regionname),
             success: function (ret) {
                 _self.totSize = ret.PageResult.totalCount;
                 _self.tableData = ret.PageResult.list;
diff --git a/src/main/resources/templates/query/tdoorstream.html b/src/main/resources/templates/query/tdoorstream.html
index 583ac64..81d4f23 100644
--- a/src/main/resources/templates/query/tdoorstream.html
+++ b/src/main/resources/templates/query/tdoorstream.html
@@ -43,22 +43,17 @@
                     </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">楼栋:
                         </label>
-                        <el-select style="width:193px"
-                                   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>
+                        <el-input v-model="tdoorstream.buildingname" style="width:193px"></el-input>
                     </el-col>
 
 
                     <el-col :span="8">
                         <label class="control-label "
-                               style="margin-right:10px;font-size: 14px;width:80px">设备名称:
+                               style="margin-right:10px;font-size: 14px;width:80px">区域:
                         </label>
-                        <el-input v-model="tdoorstream.doorname" style="width:193px"></el-input>
+                        <el-input v-model="tdoorstream.regionname" style="width:193px"></el-input>
                     </el-col>
                 </el-row>
                 <el-row style="margin-top:10px">
@@ -76,13 +71,9 @@
 
                     <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">设备名称:
                         </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-input v-model="tdoorstream.doorname" style="width:193px"></el-input>
                     </el-col>
 
                     <el-col :span="8" >
@@ -179,11 +170,10 @@
                 stuempno:'',
                 custname:'',
                 factoryid:'',
-                deptfullname:'',
                 doorname:'',
-                building:'',
+                buildingname:'',
                 dtlStatus:'all',
-                region:''
+                regionname:''
             },
         },
         methods : {
@@ -262,36 +252,6 @@
                     }
                     _self.dtlstatus = dtllist;
 
-                    var ut=ret.buildings;
-                    var rows = [];
-                    rows.push({
-                        value:'',
-                        label:"全部"
-                    });
-                    for ( var i = 0; i < ut.length; i++) {
-                        rows.push({
-                            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;
                 }
             })
@@ -307,7 +267,8 @@
         var endtransdate = Formatdate(Uendtransdate);
         var stuempno = _self.tdoorstream.stuempno;
         var custname = _self.tdoorstream.custname;
-        var deptname = _self.tdoorstream.deptfullname;
+        var buildingname = _self.tdoorstream.buildingname;
+        var regionname   = _self.tdoorstream.regionname;
         var doorname = _self.tdoorstream.doorname;
         var dtlStatus = _self.tdoorstream.dtlStatus;
         if(_self.totSize>2000){
@@ -316,7 +277,7 @@
         }
         //console.log(factoryid+stuempno);
         var	url =encodeURI( "/query/exportexcel?&startTranDate="+starttransdate+"&endTranDate="
-            +endtransdate+"&stuempno="+stuempno+"&custname="+custname+"&deptname="+deptname+"&doorName="+doorname
+            +endtransdate+"&stuempno="+stuempno+"&custname="+custname+"&buildingname="+buildingname+"&regionname="+regionname+"&doorName="+doorname
             +"&streamstatus="+dtlStatus+"&factoryId="+factoryid)
         window.open(url);
 
@@ -328,17 +289,17 @@
         var endtransdate = Formatdate(Uendtransdate);
         var stuempno = _self.tdoorstream.stuempno;
         var custname = _self.tdoorstream.custname;
-        var deptname = _self.tdoorstream.deptfullname;
+        var buildingname = _self.tdoorstream.buildingname;
         var doorname = _self.tdoorstream.doorname;
-        var usetype = _self.tdoorstream.usetype;
+        var regionname = _self.tdoorstream.region;
         var dtlStatus = _self.tdoorstream.dtlStatus;
         //console.log(factoryid);
         $.ajax({
             type : "get",
             dataType : "json",
             url : encodeURI("/query/getSearchDoorStreamList?&startTranDate="+starttransdate+"&endTranDate="+endtransdate+
-                "&stuempno="+stuempno+"&custname="+custname+"&deptname="+deptname+"&doorName="+doorname+"&streamstatus="+dtlStatus+
-                "&factoryId="+factoryid +"&pageNo="+pageno+"&pageSize="+pagesize+"&usetype="+usetype),
+                "&stuempno="+stuempno+"&custname="+custname+"&buildingname="+buildingname+"&doorName="+doorname+"&streamstatus="+dtlStatus+
+                "&factoryId="+factoryid +"&pageNo="+pageno+"&pageSize="+pagesize+"&regionname="+regionname),
             success : function(ret) {
                 //	console.log(ret);
                 _self.totSize = ret.tDoordtlInfo.totalCount;
