diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 1ea7143..3fa666b 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -21,5 +21,3 @@
 auth.password.bcrypt.seed=
 spring.jackson.serialization.fail-on-empty-beans=false
 server.port=8099
-
-server.context-path=/
\ No newline at end of file
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 193273c..a766f1e 100644
--- a/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
@@ -5,12 +5,14 @@
 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.framework.util.StringUtil;
 import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
 import com.supwisdom.dlpay.mainservice.domain.TKey;
 import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
 import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.ncmgr.service.NcService;
 import com.supwisdom.dlpay.system.domain.TDictionaryId;
+import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 import com.supwisdom.dlpay.system.service.SystemService;
 import com.supwisdom.dlpay.util.RedisUtil;
@@ -66,24 +68,40 @@
      */
     @ResponseBody
     @RequestMapping(value = "/getFillFormList")
-    public Map getFillFormList() throws Exception {
+    public Map getFillFormList(@AuthenticationPrincipal TOperator operUser) throws Exception {
         Map map = new HashMap();
-        //名单状态
-        List<TDictionaryId> syncDicts = systemService.findTDictionaryByType(3);
-        map.put("syncDicts", syncDicts);
-        //厂商id
-        List<TKey> allFactoryId = webInterfaceService.getAllKeys();
-        map.put("allFactoryId", allFactoryId);
-        //操作标记
-        List<TDictionaryId> operDicts = new ArrayList<TDictionaryId>();
-        operDicts.addAll(systemService.findByType(2, "A"));
-        operDicts.addAll(systemService.findByType(2, "D"));
-        operDicts.addAll(systemService.findByType(2, "C"));
-        map.put("operDicts", operDicts);
+        try {
+            String opertype = operUser.getOpertype();
+            //名单状态
+            List<TDictionaryId> syncDicts = systemService.findTDictionaryByType(3);
+            map.put("syncDicts", syncDicts);
+            //厂商id
+            List<TKey> allFactoryId = webInterfaceService.getAllKeys();
+            map.put("allFactoryId", allFactoryId);
+            //操作标记
+            List<TDictionaryId> operDicts = new ArrayList<TDictionaryId>();
+            operDicts.addAll(systemService.findByType(2, "A"));
+            operDicts.addAll(systemService.findByType(2, "D"));
+            operDicts.addAll(systemService.findByType(2, "C"));
+            map.put("operDicts", operDicts);
 
-        //所有楼栋
-        List<TBuilding> buildings = ncService.getAllBuilding();
-        map.put("buildings", buildings);
+            List<TRegion> regions = null;
+            List<TBuilding> buildings = null;
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))) {
+                regions = systemService.getAllRegions();
+                buildings = ncService.getAllBuilding();
+                map.put("regions", regions);
+                map.put("buildings", buildings);
+            }else if (!StringUtil.isEmpty(operUser.getRegionid())){
+                regions = systemService.getRegionListById(operUser.getRegionid());
+                map.put("regions", regions);
+                buildings = systemService.getBuildingByRegionId(operUser.getRegionid());
+                map.put("buildings", buildings);
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
         return map;
     }
 
@@ -96,8 +114,8 @@
      * @param stuempNo
      * @param syncStatus
      * @param operFlag
-     * @param buildingname
-     * @param regionname
+     * @param buildingid
+     * @param regionid
      * @param allocatStartDate
      * @param allocatEndDate
      * @param pageNo
@@ -114,8 +132,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 = "buildingname", required = false, defaultValue = "") String buildingname,
-                                 @RequestParam(value = "regionname",required = false,defaultValue = "") String regionname,
+                                 @RequestParam(value = "buildingid", required = false, defaultValue = "") String buildingid,
+                                 @RequestParam(value = "regionid",required = false,defaultValue = "") String regionid,
                                  @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,
@@ -124,12 +142,14 @@
 
         Map map = new HashMap();
         try {
-            List<String> allopername = systemService.findOperatorsByFopercode(operUser.getOperid());
+            String opertype = operUser.getOpertype();
             boolean flag = true;
-
-            Pagination pResult;
-            pResult = webInterfaceService.getAllCardListFrSearch(factoryId, allocatStartDate, allocatEndDate,
-                    doorName, custName, stuempNo, syncStatus, allopername, operFlag, buildingname,regionname, pageNo, pageSize);
+            Pagination pResult  = new Pagination();
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                pResult = webInterfaceService.getSystemCardListFrSearch(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operFlag, buildingid, regionid, pageNo, pageSize);
+            }else if (!StringUtil.isEmpty(operUser.getRegionid())){
+                pResult = webInterfaceService.getOperatorCardListFrSearch(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operFlag, buildingid, regionid, pageNo, pageSize,operUser.getRegionid());
+            }
             map.put("PageResult", pResult);
             map.put("index", flag);
             map.put("result", "查询设备名单成功！");
@@ -152,8 +172,8 @@
      * @param stuempNo
      * @param syncStatus
      * @param operFlag
-     * @param buildingname
-     * @param regionname
+     * @param buildingid
+     * @param regionid
      * @param allocatStartDate
      * @param allocatEndDate
      * @param operUser
@@ -166,17 +186,23 @@
                          @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 = "buildingname", required = false, defaultValue = "") String buildingname,
-                         @RequestParam(value = "regionname",required = false,defaultValue = "") String regionname,
+                         @RequestParam(value = "buildingid", required = false, defaultValue = "") String buildingid,
+                         @RequestParam(value = "regionid",required = false,defaultValue = "") String regionid,
                          @RequestParam(value = "allocatStartDate", required = false, defaultValue = "") String allocatStartDate,
                          @RequestParam(value = "allocatEndDate", required = false, defaultValue = "") String allocatEndDate,
                          @AuthenticationPrincipal TOperator operUser) {
+        String opertype = operUser.getOpertype();
         /**
          * 1.查询值
          */
-        List<String> allopername = systemService.findOperatorsByFopercode(operUser.getOperid());
-        List<TDoorcardlstInfo> cardList = webInterfaceService.getAllCardListMap(factoryId, allocatStartDate, allocatEndDate,
-                doorName, custName, stuempNo, syncStatus, allopername, operFlag, buildingname,regionname);
+        List<TDoorcardlstInfo> cardList = null;
+        if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))) {
+            cardList=webInterfaceService.getSystemCardListMap(factoryId, allocatStartDate, allocatEndDate,
+                    doorName, custName, stuempNo, syncStatus, operFlag, buildingid, regionid);
+        }else if (!StringUtil.isEmpty(operUser.getRegionid())){
+            cardList = webInterfaceService.getOperatorCardListMap(factoryId, allocatStartDate, allocatEndDate,
+                    doorName, custName, stuempNo, syncStatus, operFlag, buildingid, regionid,operUser.getRegionid());
+        }
 
         /**
          * 2.设置表格属性: title:标题  sheetName:工作簿名 type:表格类型
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 e2e1b60..b7540d9 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/dao/CardListDao.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/CardListDao.java
@@ -7,11 +7,17 @@
 
 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 buildingname,String regionname, int pageNo, int pageSize);
+    public Pagination getSystemCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate,
+                                             String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid, int pageNo, int pageSize);
 
-    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);
+    public Pagination getOperatorCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate,
+                                                String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid, int pageNo, int pageSize,String operRegionid);
+
+    public List<TDoorcardlstInfo> getSystemCardListMap(String factoryId, String allocatStartDate, String allocatEndDate,
+                                                    String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid);
+
+    public List<TDoorcardlstInfo> getOperatorCardListMap(String factoryId, String allocatStartDate, String allocatEndDate,
+                                                       String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid,String operRegionid);
 
     public void updateDoorcardlstToNoWithIds(List<Long> listIds);
 }
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 c081d4d..ff69c48 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
@@ -23,19 +23,18 @@
 
     @Transactional
     @Override
-    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) {
+    public Pagination getSystemCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid, int pageNo, int pageSize) {
         try {
 
             String queryString = "select a.listid, a.factoryId,d.doorName,a.custName,g.operName,a.stuempNo," +
                     "a.syncStatus,a.operFlag operFlagIndex,a.updatetime allocatTime,a.syncTime,a.closedate," +
                     "b.updatetime feedbackTime,b.retmsg,a.reason ,a.buildingName,f.regionName" +
-                    " from t_doorcardlst a left join t_rtnresult b on a.listid=b.listid " +
+                    " from t_doorcardlst a " +
+                    " left join t_rtnresult b on a.listid=b.listid " +
                     " left join tb_region f on a.regionid=f.regionid " +
                     " left join t_doordev d on a.deviceid=d.doorid" +
                     " left join tb_operator g on a.operid=g.operid" +
-                    " where 1>0 " +
-                    "  and (a.operid in (:operids ) " +
-                    " or a.deviceid in (select deviceid from T_OPERDEVICE o where o.operid in(:operids)))";
+                    " where 1>0 " ;
             if (!"".equals(allocatStartDate)) {
                 queryString += " and a.updatetime>=:allocatStartDate ";
             }
@@ -54,15 +53,15 @@
             if (!("all").equals(operFlag)) {
                 queryString += " and a.operFlag =:operFlag";
             }
-            if (!("").equals(buildingname)) {
-                queryString += " and a.buildingname like :buildingname ";
+            if (!("").equals(buildingid)) {
+                queryString += " and a.buildingid = :buildingid ";
             }
-            if (!regionname.equals("")){
+            if (!regionid.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  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :regionid  "
                         + "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  )";
@@ -85,7 +84,6 @@
             }
 
 
-            query.setParameter("operids", operids);
             if (!("all").equals(syncStatus)) {
                 query.setParameter("syncStatus", syncStatus);
             }
@@ -98,11 +96,11 @@
             if (!("all").equals(operFlag)) {
                 query.setParameter("operFlag", operFlag);
             }
-            if (!("").equals(buildingname)) {
-                query.setParameter("buildingname", "%"+buildingname+"%");
+            if (!("").equals(buildingid)) {
+                query.setParameter("buildingid", buildingid);
             }
-            if (!("").equals(regionname)){
-                query.setParameter("regionname", "%"+regionname+"%");
+            if (!("").equals(regionid)){
+                query.setParameter("regionid", regionid);
             }
             if (!("").equals(custName)) {
                 query.setParameter("custName", "%" + custName + "%");
@@ -118,7 +116,7 @@
             page.setPageNo(pageNo);
             page.setPageSize(pageSize);
 
-            int totalCount = getAllCardListCount(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operids, operFlag, buildingname, regionname);
+            int totalCount = getSystemCardListCount(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operFlag, buildingid, regionid);
             page.setTotalCount(totalCount);
 
             List<TDoorcardlstInfo> tDoorcardlstInfos = query.getResultList();
@@ -238,15 +236,13 @@
         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){
+    private int getSystemCardListCount(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid){
         try {
-            String queryString = "select count(a.listid) from TDoorcardlst a," +
-                    "TDoordev d " +
+            String queryString = "select count(*) from T_Doordev d,T_Doorcardlst a" +
                     " 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)))";
+                    "where  a.factoryid=d.factoryid " +
+                    " and a.deviceid=d.doorid ";
+
             if (!"".equals(allocatStartDate)) {
                 queryString += " and a.updatetime>=:allocatStartDate ";
             }
@@ -260,17 +256,17 @@
                 queryString += " and a.id.factoryid =:factoryId";
             }
             if (!("all").equals(operFlag)) {
-                queryString += " and a.operfalg =:operFlag";
+                queryString += " and a.operflag =:operFlag";
             }
-            if (!("").equals(buildingname)) {
-                queryString += " and a.buildingname like :buildingname ";
+            if (!("").equals(buildingid)) {
+                queryString += " and a.buildingid = :buildingid ";
             }
-            if (!regionname.equals("")){
+            if (!regionid.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  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :regionid  "
                         + "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  )";
@@ -285,7 +281,6 @@
                 queryString += " and a.stuempno like :stuempNo";
             }
             Query query = entityManager.createNativeQuery(queryString);
-            query.setParameter("operids", operids);
             if (!"".equals(allocatStartDate)) {
                 query.setParameter("allocatStartDate", allocatStartDate + "000000");
             }
@@ -302,11 +297,335 @@
             if (!("all").equals(operFlag)) {
                 query.setParameter("operFlag", operFlag);
             }
-            if (!("").equals(buildingname)) {
-                query.setParameter("buildingname", "%"+buildingname+"%");
+            if (!("").equals(buildingid)) {
+                query.setParameter("buildingid", buildingid);
             }
-            if (!("").equals(regionname)){
-                query.setParameter("regionname", "%"+regionname+"%");
+            if (!("").equals(regionid)){
+                query.setParameter("regionid", regionid);
+            }
+            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 Pagination getOperatorCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid, String regionid, int pageNo, int pageSize, String operRegionid) {
+        try {
+
+            String queryString = "select a.listid, a.factoryId,d.doorName,a.custName,g.operName,a.stuempNo," +
+                    "a.syncStatus,a.operFlag operFlagIndex,a.updatetime allocatTime,a.syncTime,a.closedate," +
+                    "b.updatetime feedbackTime,b.retmsg,a.reason ,a.buildingName,f.regionName" +
+                    " from t_doorcardlst a left join t_rtnresult b on a.listid=b.listid " +
+                    " left join tb_region f on a.regionid=f.regionid " +
+                    " left join t_doordev d on a.deviceid=d.doorid" +
+                    " left join tb_operator g on a.operid=g.operid" +
+                    " where 1>0 " ;
+            if (!"".equals(allocatStartDate)) {
+                queryString += " and a.updatetime>=:allocatStartDate ";
+            }
+            if (!"".equals(allocatEndDate)) {
+                queryString += " and a.updatetime<=:allocatEndDate ";
+            }
+            if (!("all").equals(syncStatus)) {
+                queryString += " and a.syncstatus =:syncStatus";
+            }
+            if (!("all").equals(factoryId)) {
+                queryString += " and a.factoryid =:factoryId";
+            }
+            if (!("").equals(doorName)) {
+                queryString += " and d.doorname like :doorName";
+            }
+            if (!("all").equals(operFlag)) {
+                queryString += " and a.operFlag =:operFlag";
+            }
+            if (!("").equals(buildingid)) {
+                queryString += " and a.buildingid = :buildingid ";
+            }
+
+            if (!regionid.equals("")){
+                queryString += "and a.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :operRegionid  "
+                        + "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  where tmp.regionid=:regionid)";
+            }else {
+                queryString += "and a.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :operRegionid  "
+                        + "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";
+            }
+            if (!("").equals(stuempNo)) {
+                queryString += " and a.stuempno like :stuempNo";
+            }
+            queryString += " ORDER by a.listid DESC";
+
+            Query query = entityManager.createNativeQuery(queryString, TDoorcardlstInfo.class);
+
+            if (!"".equals(allocatStartDate)) {
+                query.setParameter("allocatStartDate", allocatStartDate + "000000");
+            }
+            if (!"".equals(allocatEndDate)) {
+                query.setParameter("allocatEndDate", allocatEndDate + "235959");
+            }
+
+
+            if (!("all").equals(syncStatus)) {
+                query.setParameter("syncStatus", syncStatus);
+            }
+            if (!("all").equals(factoryId)) {
+                query.setParameter("factoryId", factoryId);
+            }
+            if (!("").equals(doorName)) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!("all").equals(operFlag)) {
+                query.setParameter("operFlag", operFlag);
+            }
+            if (!("").equals(buildingid)) {
+                query.setParameter("buildingid", buildingid);
+            }
+            query.setParameter("operRegionid", operRegionid);
+            if (!("").equals(regionid)){
+                query.setParameter("regionid", regionid);
+            }
+            if (!("").equals(custName)) {
+                query.setParameter("custName", "%" + custName + "%");
+            }
+            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 = getOperatorCardListCount(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operFlag, buildingid, regionid,operRegionid);
+            page.setTotalCount(totalCount);
+
+            List<TDoorcardlstInfo> tDoorcardlstInfos = query.getResultList();
+            SimpleDateFormat _ymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
+            SimpleDateFormat ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            for (TDoorcardlstInfo grp : tDoorcardlstInfos) {
+                List<String> factory = RedisUtil.lrange("dict_4", 0, -1);
+                List<String> operflag = RedisUtil.lrange("dict_2", 0, -1);
+                List<String> sync = RedisUtil.lrange("dict_3", 0, -1);
+                if(operflag!= null && operflag.size()>0){
+                    String operFlagIndex = grp.getOperFlagIndex();
+                    for (String s : operflag) {
+                        String[] split = s.split("_");
+                        if (operFlagIndex.equals(split[0])){
+                            grp.setOperFlag(split[1]);
+                            break;
+                        }
+                    }
+                }
+                if(sync!= null && sync.size()>0){
+                    String syncStatus1 = grp.getSyncStatus();
+                    for (String s : sync) {
+                        String[] split = s.split("_");
+                        if (syncStatus1.equals(split[0])){
+                            grp.setSyncStatus(split[1]);
+                            break;
+                        }else {
+                            grp.setSyncStatus("");
+                        }
+                    }
+                }
+                if(factory != null && factory.size()>0){
+                    String factoryId1 = grp.getFactoryId();
+                    for (String s : factory) {
+                        String[] split = s.split("_");
+                        if (factoryId1.equals(split[0])){
+                            grp.setFactoryName(split[1]);
+                            break;
+                        }else {
+                            grp.setFactoryName("");
+                        }
+                    }
+                }else {
+                    queryString = "select a.id.dictcaption from TDictionary a where a.id.dicttype=:dicttype and a.id.dictval=:dictval";
+                    query = entityManager.createQuery(queryString);
+                    query.setParameter("dicttype", 4);
+                    query.setParameter("dictval", grp.getFactoryId());
+                    if(null != query.getSingleResult()){
+                        grp.setFactoryName(query.getSingleResult().toString());
+                    }else {
+                        grp.setFactoryName("");
+                    }
+
+                    query.setParameter("dicttype", 3);
+                    query.setParameter("dictval", grp.getSyncStatus());
+                    if(null != query.getSingleResult()) {
+                        grp.setSyncStatus(query.getSingleResult().toString());
+                    }else {
+                        grp.setSyncStatus("");
+                    }
+                    query.setParameter("dicttype", 2);
+                    if (grp.getOperFlagIndex() != null) {
+                        query.setParameter("dictval", grp.getOperFlagIndex());
+                        grp.setOperFlag(query.getSingleResult().toString());
+                    }
+                }
+
+
+                String time = grp.getAllocatTime();
+                Date date;
+                String hms = "000000";
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setAllocatTime(ymdhms.format(date));
+                    } else {
+
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time + "");
+                        grp.setAllocatTime(ymdhms.format(date));
+                    }
+
+                }
+
+                time = grp.getSyncTime();
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setSyncTime(ymdhms.format(date));
+                    } else {
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time);
+                        grp.setSyncTime(ymdhms.format(date));
+                    }
+
+                }
+
+                time = grp.getFeedbackTime();
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setFeedbackTime(ymdhms.format(date));
+                    } else {
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time);
+                        grp.setFeedbackTime(ymdhms.format(date));
+                    }
+                }
+
+            }
+
+            page.setList(tDoorcardlstInfos);
+            return page;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private int getOperatorCardListCount(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid,String operRegionid){
+        try {
+            String queryString = "select count(*) from T_Doordev d,T_Doorcardlst a" +
+                    " left join tb_region f on a.regionid=f.regionid " +
+                    "where  a.factoryid=d.factoryid " +
+                    " and a.deviceid=d.doorid ";
+
+            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.operflag =:operFlag";
+            }
+            if (!("").equals(buildingid)) {
+                queryString += " and a.buildingid = :buildingid ";
+            }
+            if (!regionid.equals("")){
+                queryString += "and a.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :operRegionid  "
+                        + "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  where tmp.regionid=:regionid)";
+            }else {
+                queryString += "and a.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :operRegionid  "
+                        + "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);
+            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(buildingid)) {
+                query.setParameter("buildingid", buildingid);
+            }
+            query.setParameter("operRegionid", operRegionid);
+            if (!("").equals(regionid)){
+                query.setParameter("regionid", regionid);
             }
             if (!("").equals(doorName)) {
                 query.setParameter("doorName", "%" + doorName + "%");
@@ -331,10 +650,9 @@
     }
 
 
-
     @Transactional
     @Override
-    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) {
+    public List<TDoorcardlstInfo> getSystemCardListMap(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid) {
         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," +
@@ -343,9 +661,7 @@
                     " left join tb_region f on a.regionid=f.regionid " +
                     " left join t_doordev d on a.deviceid=d.doorid" +
                     " left join tb_operator g on a.operid=g.operid" +
-                    " where 1>0 " +
-                    "  and (a.operid in (:operids ) " +
-                    " or a.deviceid in (select deviceid from T_OPERDEVICE o where o.operid in(:operids)))";
+                    " where 1>0 ";
             if (!"".equals(allocatStartDate)) {
                 queryString += " and a.updatetime>=:allocatStartDate ";
             }
@@ -364,15 +680,15 @@
             if (!("all").equals(operFlag)) {
                 queryString += " and a.operFlag =:operFlag";
             }
-            if (!("").equals(buildingname)) {
-                queryString += " and a.buildingname like :buildingname";
+            if (!("").equals(buildingid)) {
+                queryString += " and a.buildingid = :buildingid";
             }
-            if (!regionname.equals("")){
+            if (!regionid.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  "
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :regionid  "
                         + "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  )";
@@ -394,7 +710,6 @@
             }
 
 
-            query.setParameter("operids", operids);
             if (!("all").equals(syncStatus)) {
                 query.setParameter("syncStatus", syncStatus);
             }
@@ -407,11 +722,219 @@
             if (!("all").equals(operFlag)) {
                 query.setParameter("operFlag", operFlag);
             }
-            if (!("").equals(buildingname)) {
-                query.setParameter("buildingname", "%"+buildingname+"%");
+            if (!("").equals(buildingid)) {
+                query.setParameter("buildingid", buildingid);
             }
-            if (!("").equals(regionname)){
-                query.setParameter("regionname","%"+regionname+"%");
+            if (!("").equals(regionid)){
+                query.setParameter("regionid",regionid);
+            }
+            if (!("").equals(custName)) {
+                query.setParameter("custName", "%" + custName + "%");
+            }
+            if (!("").equals(stuempNo)) {
+                query.setParameter("stuempNo", "%" + stuempNo + "%");
+            }
+
+            List<TDoorcardlstInfo> tDoorcardlstInfos = query.getResultList();
+            SimpleDateFormat _ymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
+            SimpleDateFormat ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            for (TDoorcardlstInfo grp : tDoorcardlstInfos) {
+                List<String> factory = RedisUtil.lrange("dict_4", 0, -1);
+                List<String> operflag = RedisUtil.lrange("dict_2", 0, -1);
+                List<String> sync = RedisUtil.lrange("dict_3", 0, -1);
+                if(operflag!= null && operflag.size()>0){
+                    String operFlagIndex = grp.getOperFlagIndex();
+                    for (String s : operflag) {
+                        String[] split = s.split("_");
+                        if (operFlagIndex.equals(split[0])){
+                            grp.setOperFlag(split[1]);
+                            break;
+                        }
+                    }
+                }
+                if(sync!= null && sync.size()>0){
+                    String syncStatus1 = grp.getSyncStatus();
+                    for (String s : sync) {
+                        String[] split = s.split("_");
+                        if (syncStatus1.equals(split[0])){
+                            grp.setSyncStatus(split[1]);
+                            break;
+                        }else {
+                            grp.setSyncStatus("");
+                        }
+                    }
+                }
+                if(factory != null && factory.size()>0){
+                    String factoryId1 = grp.getFactoryId();
+                    for (String s : factory) {
+                        String[] split = s.split("_");
+                        if (factoryId1.equals(split[0])){
+                            grp.setFactoryName(split[1]);
+                            break;
+                        }else {
+                            grp.setFactoryName("");
+                        }
+                    }
+                }else {
+                    queryString = "select a.id.dictcaption from TDictionary a where a.id.dicttype=:dicttype and a.id.dictval=:dictval";
+                    query = entityManager.createQuery(queryString);
+                    query.setParameter("dicttype", 4);
+                    query.setParameter("dictval", grp.getFactoryId());
+                    if(null != query.getSingleResult()){
+                        grp.setFactoryName(query.getSingleResult().toString());
+                    }else {
+                        grp.setFactoryName("");
+                    }
+
+                    query.setParameter("dicttype", 3);
+                    query.setParameter("dictval", grp.getSyncStatus());
+                    if(null != query.getSingleResult()) {
+                        grp.setSyncStatus(query.getSingleResult().toString());
+                    }else {
+                        grp.setSyncStatus("");
+                    }
+                    query.setParameter("dicttype", 2);
+                    if (grp.getOperFlagIndex() != null) {
+                        query.setParameter("dictval", grp.getOperFlagIndex());
+                        grp.setOperFlag(query.getSingleResult().toString());
+                    }
+                }
+
+                String time = grp.getAllocatTime();
+                Date date;
+                String hms = "000000";
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setAllocatTime(ymdhms.format(date));
+                    } else {
+
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time + "");
+                        grp.setAllocatTime(ymdhms.format(date));
+                    }
+
+                }
+
+                time = grp.getSyncTime();
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setSyncTime(ymdhms.format(date));
+                    } else {
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time);
+                        grp.setSyncTime(ymdhms.format(date));
+                    }
+
+                }
+
+                time = grp.getFeedbackTime();
+                if (time != null) {
+                    if (time.length() == 14) {
+                        date = _ymdhms.parse(time);
+                        grp.setFeedbackTime(ymdhms.format(date));
+                    } else {
+                        time += hms.substring(0, 14 - time.length());
+                        date = _ymdhms.parse(time);
+                        grp.setFeedbackTime(ymdhms.format(date));
+                    }
+                }
+            }
+            return tDoorcardlstInfos;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public List<TDoorcardlstInfo> getOperatorCardListMap(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid, String regionid, String operRegionid) {
+        try {
+            String queryString = "select a.listid, a.factoryId,d.doorName,a.custName,g.operName,a.stuempNo," +
+                    "a.syncStatus,a.operFlag operFlagIndex,a.updatetime allocatTime,a.syncTime,a.closedate," +
+                    "b.updatetime feedbackTime,b.retmsg,a.reason ,a.buildingName,f.regionName" +
+                    " from t_doorcardlst a left join t_rtnresult b on a.listid=b.listid " +
+                    " left join tb_region f on a.regionid=f.regionid " +
+                    " left join t_doordev d on a.deviceid=d.doorid" +
+                    " left join tb_operator g on a.operid=g.operid" +
+                    " where 1>0 " ;
+            if (!"".equals(allocatStartDate)) {
+                queryString += " and a.updatetime>=:allocatStartDate ";
+            }
+            if (!"".equals(allocatEndDate)) {
+                queryString += " and a.updatetime<=:allocatEndDate ";
+            }
+            if (!("all").equals(syncStatus)) {
+                queryString += " and a.syncstatus =:syncStatus";
+            }
+            if (!("all").equals(factoryId)) {
+                queryString += " and a.factoryid =:factoryId";
+            }
+            if (!("").equals(doorName)) {
+                queryString += " and d.doorname like :doorName";
+            }
+            if (!("all").equals(operFlag)) {
+                queryString += " and a.operFlag =:operFlag";
+            }
+            if (!("").equals(buildingid)) {
+                queryString += " and a.buildingid = :buildingid";
+            }
+            if (!regionid.equals("")){
+                queryString += "and a.regionid in  "
+                        +"("
+                        + "with recursive tmp as  "
+                        + "("
+                        + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :operRegionid  "
+                        + "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  where tmp.regionid=:regionid)";
+            }else {
+                queryString += "and a.regionid in  "
+                    +"("
+                    + "with recursive tmp as  "
+                    + "("
+                    + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr where regionid = :operRegionid  "
+                    + "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";
+            }
+            if (!("").equals(stuempNo)) {
+                queryString += " and a.stuempno like :stuempNo";
+            }
+            queryString += " order by a.listid DESC";
+
+            Query query = entityManager.createNativeQuery(queryString, TDoorcardlstInfo.class);
+            if (!"".equals(allocatStartDate)) {
+                query.setParameter("allocatStartDate", allocatStartDate + "000000");
+            }
+            if (!"".equals(allocatEndDate)) {
+                query.setParameter("allocatEndDate", allocatEndDate + "235959");
+            }
+
+
+            if (!("all").equals(syncStatus)) {
+                query.setParameter("syncStatus", syncStatus);
+            }
+            if (!("all").equals(factoryId)) {
+                query.setParameter("factoryId", factoryId);
+            }
+            if (!("").equals(doorName)) {
+                query.setParameter("doorName", "%" + doorName + "%");
+            }
+            if (!("all").equals(operFlag)) {
+                query.setParameter("operFlag", operFlag);
+            }
+            if (!("").equals(buildingid)) {
+                query.setParameter("buildingid", buildingid);
+            }
+            if (!("").equals(regionid)){
+                query.setParameter("regionid",regionid);
             }
             if (!("").equals(custName)) {
                 query.setParameter("custName", "%" + custName + "%");
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 feba2d1..ad4deba 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
@@ -12,13 +12,20 @@
     //获取所有厂商
     public List<TKey> getAllKeys() throws Exception;
 
-    //根据查询条件分页获取流水
-    public Pagination getAllCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate,
-                                             String doorName, String custName, String stuempNo, String syncStatus, List<String> opername,String operFlag, String buildingname,String regionname, int pageNo, int pageSize);
+    //根据查询条件分页获取所有流水
+    public Pagination getSystemCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate,
+                                             String doorName, String custName, String stuempNo, String syncStatus,String operFlag, String buildingid,String regionid, int pageNo, int pageSize);
 
-    //根据查询条件获取导出表单信息
-    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);
+    //根据查询条件分页获取管理员权限的流水
+    public Pagination getOperatorCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate,
+                                                  String doorName, String custName, String stuempNo, String syncStatus,String operFlag, String buildingid,String regionid, int pageNo, int pageSize,String operRegionid);
+
+    //根据查询条件获取所有导出表单信息
+    public List<TDoorcardlstInfo> getSystemCardListMap(String factoryId, String allocatStartDate, String allocatEndDate,
+                                                    String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid);
+
+    public List<TDoorcardlstInfo> getOperatorCardListMap(String factoryId, String allocatStartDate, String allocatEndDate,
+                                                       String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid,String regionid,String operRegionid);
 
     //根据名单编号将已同步的名单修改为未同步使其重新同步
     public void updateDoorcardlstToNoWithIds (List<Long> listIds);
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java
index e286cd3..1636a09 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
@@ -28,13 +28,23 @@
     }
 
     @Override
-    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);
+    public Pagination getSystemCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus,  String operFlag, String buildingid,String regionid, int pageNo, int pageSize) {
+        return cardListDao.getSystemCardListFrSearch(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operFlag, buildingid,regionid, pageNo, pageSize);
     }
 
     @Override
-    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);
+    public Pagination getOperatorCardListFrSearch(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid, String regionid, int pageNo, int pageSize, String operRegionid) {
+        return cardListDao.getOperatorCardListFrSearch(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operFlag, buildingid, regionid, pageNo, pageSize, operRegionid);
+    }
+
+    @Override
+    public List<TDoorcardlstInfo> getSystemCardListMap(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus,  String operFlag, String buildingid,String regionid) {
+        return cardListDao.getSystemCardListMap(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus,  operFlag, buildingid,regionid);
+    }
+
+    @Override
+    public List<TDoorcardlstInfo> getOperatorCardListMap(String factoryId, String allocatStartDate, String allocatEndDate, String doorName, String custName, String stuempNo, String syncStatus, String operFlag, String buildingid, String regionid, String operRegionid) {
+        return cardListDao.getOperatorCardListMap(factoryId, allocatStartDate, allocatEndDate, doorName, custName, stuempNo, syncStatus, operFlag, buildingid, regionid, operRegionid);
     }
 
     @Override
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/OperatorDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/OperatorDao.java
index 31bf34d..4079c55 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/OperatorDao.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/OperatorDao.java
@@ -4,5 +4,5 @@
 
 public interface OperatorDao {
 
-    public List<String> findOperatorsByFopercode(String operid);
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java
index 5c39b62..9e5c8e7 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java
@@ -15,6 +15,8 @@
 
     public TRegion getRegionById(String regionid);
 
+    public List<TRegion> getRegionListById(String regionid);
+
     public List<TRegion> getRegionListByLevel(int level);
 
     public List<TRegion> getAllRegions();
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/OperatorDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/OperatorDaoImpl.java
index 9949432..243801f 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/OperatorDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/OperatorDaoImpl.java
@@ -18,52 +18,5 @@
     @PersistenceContext
     EntityManager entityManager;
 
-    @Transactional
-    @Override
-    public List<String> findOperatorsByFopercode(String operid) {
-        try{
-            String sql = "select bean from TOperator bean where bean.status='0' and bean.father.opercode =?1 ";
-            TypedQuery<TOperator> query = entityManager.createQuery(sql, TOperator.class);
-            query.setParameter(1, operid);
-            List<TOperator> tOperators = new ArrayList<TOperator>();
-            tOperators.addAll(query.getResultList());
-            List<String> allopercode = new ArrayList<String>();
-            if(tOperators != null && tOperators.size() > 0){
-                for(TOperator grp:tOperators){
-                    allopercode.add(grp.getOpercode());
-                }
-                boolean index = false;
-                List<TOperator> lstsons = new ArrayList<TOperator>();
-                List<TOperator> lstson = new ArrayList<TOperator>();
-                lstson.addAll(tOperators);
-                while(lstson != null && lstson.size() > 0){
-                    if(index){
-                        for(TOperator grp:lstson){
-                            allopercode.add(grp.getOpercode());
-                        }
-                    }
-                    index = true;
-                    if(!lstsons.isEmpty()){
-                        lstsons.clear();
-                    }
-                    for(TOperator grp:lstson){
-                        String queryString = "select bean from TOperator bean where bean.father.opercode =?1";
-                        query = entityManager.createQuery(queryString, TOperator.class);
-                        query.setParameter(1, grp.getOpercode());
-                        lstsons.addAll(query.getResultList());
-                    }
-                    if(!lstson.isEmpty()){
-                        lstson.clear();
-                    }
-                    lstson.addAll(lstsons);
-                }
-            }
-            allopercode.add(operid);
 
-            return allopercode;
-        }catch(Exception e){
-            e.printStackTrace();
-        }
-        return null;
-    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java
index fe077a8..05ba7a9 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java
@@ -153,6 +153,22 @@
 
     @Transactional
     @Override
+    public List<TRegion> getRegionListById(String regionid) {
+        String sql = "select bean.regionid,bean.address,bean.level,bean.parentid,bean.regionname,bean.remarks,bean.parentname,bean.flag " +
+                "from TB_REGION bean where flag=1 "+
+                "and bean.regionid in  " +
+                "(with recursive tmp as  (select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr " +
+                " where regionid= :regionid 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(sql, TRegion.class);
+        query.setParameter("regionid", regionid);
+        List list = query.getResultList();
+
+        return list;
+    }
+
+    @Transactional
+    @Override
     public List<TRegion> getRegionListByLevel(int level) {
         String sql = "select bean from TRegion bean where bean.flag=1 and bean.level=:level";
         TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
index 8adf9ed..1bd453e 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
@@ -30,8 +30,6 @@
     //修改字典值
     public TDictionary updateDictionary(String dicttype, String dicttypename, String dictval, String dictcaption, String oriengaltype, String oriengalval);
 
-    //根据操作员id获取有权限的操作员
-    public List<String> findOperatorsByFopercode(String operid);
 
     //根据查询条件分页获取所有区域
     public Pagination getSystemRegionList(String regionname,int pageNo,int pageSize);
@@ -48,6 +46,9 @@
     //根据id获取区域
     public TRegion getRegionById(String regionid);
 
+    //根据区域id获取其权限下所有区域
+    public List<TRegion> getRegionListById(String regionid);
+
     //根据区域级别获取其上一级级别的所有区域
     public List<TRegion> getRegionListByLevel(int level);
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
index 1f48e88..f729371 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
@@ -65,10 +65,6 @@
         return dictionaryDao.updateDictionary(dicttype, dicttypename, dictval, dictcaption, oriengaltype, oriengalval);
     }
 
-    @Override
-    public List<String> findOperatorsByFopercode(String operid) {
-        return operatorDao.findOperatorsByFopercode(operid);
-    }
 
     @Override
     public Pagination getSystemRegionList(String regionname, int pageNo, int pageSize) {
@@ -96,6 +92,11 @@
     }
 
     @Override
+    public List<TRegion> getRegionListById(String regionid) {
+        return regionDao.getRegionListById(regionid);
+    }
+
+    @Override
     public List<TRegion> getRegionListByLevel(int level) {
         return regionDao.getRegionListByLevel(level);
     }
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index b3d349d..d37e1ac 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -27,4 +27,6 @@
 # user password
 auth.password.bcrypt.length=10
 
+server.servlet.context-path=/
+
 
diff --git a/src/main/resources/templates/doorlist/searchDoorlist.html b/src/main/resources/templates/doorlist/searchDoorlist.html
index b874920..0ded60e 100644
--- a/src/main/resources/templates/doorlist/searchDoorlist.html
+++ b/src/main/resources/templates/doorlist/searchDoorlist.html
@@ -76,20 +76,33 @@
                     </el-col>
 
                     <el-col :span="8">
-                        <el-form-item label="楼栋">
-                            <el-input v-model="searchDoorForm.buildingname" placeholder="楼栋名称">
-                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
-                            </el-input>
+                        <el-form-item label="区域">
+                            <el-select v-model="searchDoorForm.regionid"
+                                       @Change="regionChange"
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="regionid in regions"
+                                        :key="regionid.value"
+                                        :label="regionid.label"
+                                        :value="regionid.value">
+                                </el-option>
+                            </el-select>
                         </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 label="楼栋">
+                            <el-select v-model="searchDoorForm.buildingid" placeholder="请选择">
+                                <el-option
+                                        v-for="buildingid in buildings"
+                                        :key="buildingid.value"
+                                        :label="buildingid.label"
+                                        :value="buildingid.value">
+                                </el-option>
+                            </el-select>
                         </el-form-item>
                     </el-col>
+
                 </el-row>
                 <el-row>
                     <el-col :span="8" :offset="16">
@@ -125,11 +138,6 @@
                         width="100">
                 </el-table-column>
                 <el-table-column
-                        prop="buildingname"
-                        label="楼栋"
-                        min-width="140">
-                </el-table-column>
-                <el-table-column
                         prop="doorName"
                         label="设备名称"
                         width="180">
@@ -144,16 +152,17 @@
                         label="姓名"
                         width="150">
                 </el-table-column>
-                <el-table-column
-                        prop="buildingName"
-                        label="楼栋"
-                        width="180">
-                </el-table-column>
+
                     <el-table-column
                             prop="regionName"
                             label="区域"
                             width="130">
                     </el-table-column>
+                    <el-table-column
+                            prop="buildingName"
+                            label="楼栋"
+                            width="180">
+                    </el-table-column>
                 <el-table-column
                         prop="closedate"
                         label="有效期"
@@ -252,9 +261,11 @@
                 stuempNo: '',
                 syncStatus: '',
                 operFlag: '',
-                buildingname: '',
-                regionname:''
+                buildingid: '',
+                regionid:''
             },
+            regions:[],
+            buildings:[],
             factoryIds: [],
             syncStatus: [],
             operFlag: [],
@@ -315,7 +326,12 @@
 
             handleSelect:function(val){
                 this.selectList=val;
-            }
+            },
+            regionChange:function(value){
+                this.buildings=[];
+                this.searchDoorForm.buildingid='',
+                getRegionBuilding(this,value);
+            },
         },
         created: function () {
             var url = "/doorlistMgr/getFillFormList";
@@ -362,26 +378,31 @@
                             label: operDict[i]["dictcaption"]
                         })
                     }
-                    /*var buildings = [];
+                    var regionlist = [];
+                    var region = data.regions;
+                    for (var i = 0; i < region.length; i++) {
+                        regionlist.push({
+                            value: region[i]["regionid"],
+                            label: region[i]["regionname"]
+                        })
+                    }
+
+                    var buildinglist = [];
                     var building = data.buildings;
-                    buildings.push({
-                        value: "",
-                        label: "全部"
-                    })
                     for (var i = 0; i < building.length; i++) {
-                        buildings.push({
+                        buildinglist.push({
                             value: building[i]["buildingid"],
                             label: building[i]["buildingname"]
                         })
-                    }*/
+                    }
                     vue.factoryIds = factoryList;
                     vue.syncStatus = syncDicts;
                     vue.operFlag = operDicts;
-                    //vue.buildings = buildings;
+                    vue.regions = regionlist;
+                    vue.buildings = buildinglist;
                     vue.searchDoorForm.factoryId = 'all';
                     vue.searchDoorForm.syncStatus = 'all';
                     vue.searchDoorForm.operFlag = 'all';
-                    //vue.searchDoorForm.building = '';
                 }
             })
             this.searchDoorForm.allocatStartDate ='';
@@ -428,7 +449,7 @@
             + "&stuempNo=" + searchDoor.stuempNo + "&factoryId=" + searchDoor.factoryId
             + "&syncStatus=" + searchDoor.syncStatus +
             "&pageNo=" + pageno + "&pageSize=" + pagesize + "&operFlag=" + searchDoor.operFlag
-            + "&buildingname=" + searchDoor.buildingname+"&regionname=" +searchDoor.regionname;
+            + "&buildingid=" + searchDoor.buildingid+"&regionid=" +searchDoor.regionid;
         var token=$("meta[name='_csrf_token']").attr("value");
         $.ajax({
             type: "POST",
@@ -472,7 +493,7 @@
             "&doorName=" + searchDoor.doorName + "&custName=" + searchDoor.custName
             + "&stuempNo=" + searchDoor.stuempNo + "&factoryId=" + searchDoor.factoryId
             + "&syncStatus=" + searchDoor.syncStatus + "&operFlag=" + searchDoor.operFlag
-            + "&buildingname=" + searchDoor.buildingname+"&regionname="+searchDoor.regionname;
+            + "&buildingid=" + searchDoor.buildingid+"&regionid="+searchDoor.regionid;
 //        window.location.href
         var uri = encodeURI(url);
         window.open(uri);
@@ -506,6 +527,28 @@
         }
     }
 
+    function getRegionBuilding(_self,value){
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("/ncmgr/getRegionBuilding?regionid=" + value),
+            success: function (ret) {
+                var bList = [];
+                var rB = ret.reBuilding;
+                if (rB!=null) {
+                    for (var j = 0; j < rB.length; j++) {
+                        bList.push({
+                            value: rB[j]["buildingid"],
+                            label: rB[j]["buildingname"]
+                        });
+                    }
+                }
+
+                _self.buildings = bList;
+            }
+        })
+    }
+
     function refreshThisTable(){
         $("#qrybtn").click();
     }
diff --git a/src/main/resources/templates/query/tdoorstream.html b/src/main/resources/templates/query/tdoorstream.html
index 81d4f23..a3427e1 100644
--- a/src/main/resources/templates/query/tdoorstream.html
+++ b/src/main/resources/templates/query/tdoorstream.html
@@ -42,18 +42,29 @@
                         <el-input v-model="tdoorstream.custname" style="width:193px"></el-input>
                     </el-col>
                     <el-col :span="8">
-                        <label class="control-label "
-                               style="margin-right:10px;font-size: 14px;width:80px">楼栋:
-                        </label>
-                        <el-input v-model="tdoorstream.buildingname" style="width:193px"></el-input>
+                        <el-form-item label="区域">
+                            <el-select v-model="searchDoorForm.regionid" placeholder="请选择">
+                                <el-option
+                                        v-for="regionid in regions"
+                                        :key="regionid.value"
+                                        :label="regionid.label"
+                                        :value="regionid.value">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
                     </el-col>
 
-
                     <el-col :span="8">
-                        <label class="control-label "
-                               style="margin-right:10px;font-size: 14px;width:80px">区域:
-                        </label>
-                        <el-input v-model="tdoorstream.regionname" style="width:193px"></el-input>
+                        <el-form-item label="楼栋">
+                            <el-select v-model="searchDoorForm.buildingid" placeholder="请选择">
+                                <el-option
+                                        v-for="buildingid in buildings"
+                                        :key="buildingid.value"
+                                        :label="buildingid.label"
+                                        :value="buildingid.value">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
                     </el-col>
                 </el-row>
                 <el-row style="margin-top:10px">
@@ -160,7 +171,6 @@
                     return time.getTime() <vue.starttransdate.getTime();
                 }
             },
-
             tlist:[],
             buildings:[],
             regions:[],
@@ -171,9 +181,9 @@
                 custname:'',
                 factoryid:'',
                 doorname:'',
-                buildingname:'',
+                buildingid:'',
                 dtlStatus:'all',
-                regionname:''
+                regionid:''
             },
         },
         methods : {
@@ -267,8 +277,8 @@
         var endtransdate = Formatdate(Uendtransdate);
         var stuempno = _self.tdoorstream.stuempno;
         var custname = _self.tdoorstream.custname;
-        var buildingname = _self.tdoorstream.buildingname;
-        var regionname   = _self.tdoorstream.regionname;
+        var buildingid = _self.tdoorstream.buildingid;
+        var regionid   = _self.tdoorstream.regionid;
         var doorname = _self.tdoorstream.doorname;
         var dtlStatus = _self.tdoorstream.dtlStatus;
         if(_self.totSize>2000){
@@ -277,7 +287,7 @@
         }
         //console.log(factoryid+stuempno);
         var	url =encodeURI( "/query/exportexcel?&startTranDate="+starttransdate+"&endTranDate="
-            +endtransdate+"&stuempno="+stuempno+"&custname="+custname+"&buildingname="+buildingname+"&regionname="+regionname+"&doorName="+doorname
+            +endtransdate+"&stuempno="+stuempno+"&custname="+custname+"&buildingid="+buildingid+"&regionid="+regionid+"&doorName="+doorname
             +"&streamstatus="+dtlStatus+"&factoryId="+factoryid)
         window.open(url);
 
@@ -289,17 +299,17 @@
         var endtransdate = Formatdate(Uendtransdate);
         var stuempno = _self.tdoorstream.stuempno;
         var custname = _self.tdoorstream.custname;
-        var buildingname = _self.tdoorstream.buildingname;
+        var buildingid = _self.tdoorstream.buildingid;
         var doorname = _self.tdoorstream.doorname;
-        var regionname = _self.tdoorstream.region;
+        var regionid = _self.tdoorstream.regionid;
         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+"&buildingname="+buildingname+"&doorName="+doorname+"&streamstatus="+dtlStatus+
-                "&factoryId="+factoryid +"&pageNo="+pageno+"&pageSize="+pagesize+"&regionname="+regionname),
+                "&stuempno="+stuempno+"&custname="+custname+"&buildingid="+buildingid+"&doorName="+doorname+"&streamstatus="+dtlStatus+
+                "&factoryId="+factoryid +"&pageNo="+pageno+"&pageSize="+pagesize+"&regionid="+regionid),
             success : function(ret) {
                 //	console.log(ret);
                 _self.totSize = ret.tDoordtlInfo.totalCount;
