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 030ea46..a2efe03 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
@@ -10,6 +10,7 @@
 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.ManagerService;
 import com.supwisdom.dlpay.system.service.SystemService;
 import com.supwisdom.dlpay.util.RedisUtil;
 import org.slf4j.Logger;
@@ -35,6 +36,8 @@
     private NcService ncService;
     @Autowired
     private SystemService systemService;
+    @Autowired
+    private ManagerService managerService;
 
     @RequestMapping("/devindex")
     public String devindex(ModelMap model) {
@@ -62,7 +65,7 @@
     }
 
     /**
-     * 查询设备信息
+     * 分页查询设备信息
      * @param request
      * @param response
      * @param pageNo
@@ -98,13 +101,18 @@
                 buildings = ncService.getAllBuilding();
                 map.put("buildings", buildings);
 
-            }else if (!StringUtil.isEmpty(operUser.getRegionid())){
+            }else if (opertype.equals("H") && !StringUtil.isEmpty(operUser.getRegionid())){
                 page = ncService.getOperatorNcDeviceWithPage(devname, pageNo, pageSize, buildingid, operUser.getRegionid(), devtype);
                 map.put("PageResult", page);
                 regions = systemService.getRegionListById(operUser.getRegionid());
                 map.put("regions", regions);
                 buildings = systemService.getBuildingByRegionId(operUser.getRegionid());
                 map.put("buildings", buildings);
+            }else if (opertype.equals("L")){
+                page = ncService.getBuildingOperNcDeviceWithPage(devname, pageNo, pageSize, buildingid, devtype, operUser.getOperid());
+                map.put("PageResult", page);
+                buildings = systemService.getBuildingOperBuildings(operUser.getOperid());
+                map.put("buildings", buildings);
             }
             List<TDictionaryId> dicts = systemService.findTDictionaryByType(8);
             map.put("dicts", dicts);
@@ -146,16 +154,26 @@
                 map.put("buildingsfill", buildingsfill);
                 devices = ncService.getSystemDevByType("C");//根据设备类型获取设备
                 map.put("devices", devices);
-            }else if (!StringUtil.isEmpty(operUser.getRegionid())){
+            }else if (opertype.equals("H") && !StringUtil.isEmpty(operUser.getRegionid())){
                 regionsfill = systemService.getRegionListById(operUser.getRegionid());
                 map.put("regionsfill", regionsfill);
                 buildingsfill = systemService.getBuildingByRegionId(operUser.getRegionid());
                 map.put("buildingsfill", buildingsfill);
                 devices = ncService.getOperatorDevByType("C", operUser.getRegionid());
                 map.put("devices", devices);
+            }else if (opertype.equals("L") && !StringUtil.isEmpty(operUser.getFoperid())){
+                //楼栋管理员填充区域为其上级管理员区域
+                TOperator fOperUser = managerService.getOperatorById(operUser.getFoperid());
+                if (fOperUser.getOpertype().equals("H") && !StringUtil.isEmpty(fOperUser.getRegionid())){
+                    regionsfill = systemService.getRegionListById(fOperUser.getRegionid());
+                }
+                map.put("regionsfill", regionsfill);
+                buildingsfill = systemService.getBuildingOperBuildings(operUser.getOperid());
+                map.put("buildingsfill", buildingsfill);
+                devices = ncService.getBuildingOperDevByType("C", operUser.getOperid());
+                map.put("devices", devices);
             }
 
-
         } catch (Exception e) {
             e.printStackTrace();
         }
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 7828c2c..9284dfe 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
@@ -10,6 +10,8 @@
 public interface NcDeviceDao {
     public Pagination getSystemNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingid,String regionid, String devtype);
 
+    public Pagination getBuildingOperNcDeviceWithPage(String devname,int pageNo,int pageSize,String buildingid,String devtype,String operid);
+
     public List<TBuilding> getAllBuilding();
 
     public List<TRegion> getAllRegion();
@@ -20,6 +22,8 @@
 
     public List<TNcDevice> getOperatorDevByType(String type,String regionid);
 
+    public List<TNcDevice> getBuildingOperDevByType(String type,String operid);
+
     public TNcDevice findDevById(int id);
 
     public TNcDevice validDevName(int devid,String devname);
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 19eff12..46a9e9b 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
@@ -81,7 +81,7 @@
                 +" left join tb_region tr on tr.regionid=tb.regionid"
                 +" where 1>0 and operflag='A'";
         if(!devname.equals("")){
-            sql+="and devname like :devname ";
+            sql+="and bean.devname like :devname ";
         }
         if(!buildingid.equals("")){
             sql+="and  bean.buildingid = :buildingid ";
@@ -97,7 +97,7 @@
                     + ") select regionid from tmp  )";
         }
         if(!devtype.equals("")){
-            sql+="and  devtype = :devtype ";
+            sql+="and  bean.devtype = :devtype ";
         }
         Query query = entityManager.createNativeQuery(sql);
         if(!devname.equals("")){
@@ -120,6 +120,83 @@
         return cnt;
     }
 
+    @Transactional
+    @Override
+    public Pagination getBuildingOperNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingid, String devtype,String operid) {
+        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"
+                +" left join t_operbuilding tob on tob.buildingid=bean.buildingid "
+                +" where 1>0 and bean.operflag='A' and tob.operid = :operid ";
+        if(!devname.equals("")){
+            sql+="and bean.devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+="and  bean.buildingid = :buildingid ";
+        }
+        if(!devtype.equals("")){
+            sql+="and  bean.devtype = :devtype ";
+        }
+        sql+="order by devtype";
+        Query query = entityManager.createNativeQuery(sql,TNcDevice.class);
+        query.setParameter("operid", operid);
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+        if(!devtype.equals("")){
+            query.setParameter("devtype", devtype);
+        }
+
+        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 = getBuildingOperNcDeviceCount(devname, buildingid, devtype,operid);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getBuildingOperNcDeviceCount(String devname,String buildingid,String devtype,String operid){
+        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"
+                +" left join t_operbuilding tob on tob.buildingid=bean.buildingid "
+                +" where 1>0 and operflag='A' and tob.operid = :operid ";
+        if(!devname.equals("")){
+            sql+="and bean.devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+="and  bean.buildingid = :buildingid ";
+        }
+        if(!devtype.equals("")){
+            sql+="and  bean.devtype = :devtype ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        query.setParameter("operid", operid);
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+        if(!devtype.equals("")){
+            query.setParameter("devtype", devtype);
+        }
+        List list = query.getResultList();
+        int cnt = 0;
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
 
     @Transactional
     @Override
@@ -182,6 +259,20 @@
 
     @Transactional
     @Override
+    public List<TNcDevice> getBuildingOperDevByType(String type, String operid) {
+        String sql = "select bean.deviceid,bean.devphyid,bean.devname,bean.ip,bean.operflag,bean.syncflag,bean.synctime," +
+                "bean.updtime,bean.fdevid,bean.devtype,bean.devno,bean.usetype,bean.buildingid,bean.buildingname,bean.regionid " +
+                " from T_NC_DEVICE bean where bean.devtype=?1 and bean.operflag='A' "+
+                " and bean.buildingid in (select a.buildingid from t_operbuilding a where a.operid = ?2)";
+        Query query = entityManager.createNativeQuery(sql, TNcDevice.class);
+        query.setParameter(1, type);
+        query.setParameter(2, operid);
+        List<TNcDevice> list = query.getResultList();
+        return list;
+    }
+
+    @Transactional
+    @Override
     public TNcDevice findDevById(int id) {
         String sql = " select r from TNcDevice r where  r.deviceid=:deviceid";
         Query query = entityManager.createQuery(sql,TNcDevice.class);
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 3ff8f95..923d2ad 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
@@ -14,6 +14,9 @@
     //根据查询条件分页获取管理员设备--- 实际与管理员dao层方法一致，只是regionid传入管理员权限区域id
     public Pagination getOperatorNcDeviceWithPage(String devname,int pageNo,int pageSize, String buildingid,String regionid,String devtype);
 
+    //根据查询条件分页获取楼栋管理员设备 ---regionid为空
+    public Pagination getBuildingOperNcDeviceWithPage(String devname,int pageNo,int pageSize,String buildingid,String devtype,String operid);
+
     //获取所有楼栋信息
     public List<TBuilding> getAllBuilding();
 
@@ -29,6 +32,9 @@
     //根据设备类型获取操作员权限设备
     public List<TNcDevice> getOperatorDevByType(String type,String regionid);
 
+    //根据设备类型获取楼栋管理员权限设备
+    public List<TNcDevice> getBuildingOperDevByType(String type,String operid);
+
     //根据设备id获取设备
     public TNcDevice findDevById(int 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 29aa751..495474c 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
@@ -40,6 +40,11 @@
     }
 
     @Override
+    public Pagination getBuildingOperNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingid, String devtype,String operid) {
+        return ncDeviceDao.getBuildingOperNcDeviceWithPage(devname, pageNo, pageSize, buildingid, devtype, operid);
+    }
+
+    @Override
     public List<TBuilding> getAllBuilding() {
         return ncDeviceDao.getAllBuilding();
     }
@@ -65,6 +70,11 @@
     }
 
     @Override
+    public List<TNcDevice> getBuildingOperDevByType(String type, String operid) {
+        return ncDeviceDao.getBuildingOperDevByType(type, operid);
+    }
+
+    @Override
     public TNcDevice findDevById(int id) {
         return ncDeviceDao.findDevById(id);
     }
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 5066fd6..44981c8 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
@@ -424,11 +424,13 @@
                 regionList = systemService.getAllRegions();
                 page = systemService.getSystemBuildingList(regionid, buildingname, pageNo, pageSize);
                 map.put("pageResult", page);
-            }else if (!StringUtil.isEmpty(operUser.getRegionid())){
+            }else if (opertype.equals("H") && !StringUtil.isEmpty(operUser.getRegionid())){
                 regionList = systemService.getRegionListById(operUser.getRegionid());
                 page = systemService.getSystemBuildingList(operUser.getRegionid(), buildingname, pageNo, pageSize);//regionid固定为管理员的权限区域id
                 map.put("pageResult", page);
-
+            }else if (opertype.equals("L")){
+                page = systemService.getBuildingOperBuildingList(regionid, buildingname, operUser.getOperid(), pageNo, pageSize);
+                map.put("pageResult", page);
             }
             map.put("regionList", regionList);
 
@@ -648,7 +650,7 @@
         } catch (Exception e) {
             e.printStackTrace();
             map.put("result", "管理员：" + operid + "，分配楼栋失败");
-            logger.error("分配设备失败：" + e.getMessage());
+            logger.error("分配楼栋失败：" + e.getMessage());
         }
         map.put("okFlag", okFlag);
         return map;
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java
index 19c40e0..e351e45 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java
@@ -12,6 +12,8 @@
 
     public Pagination getSystemBuildingList(String regionid, String buildingname, int pageNo, int pageSize);
 
+    public Pagination getBuildingOperBuildingList(String regionid,String buildingname,String operid,int pageNo,int pageSize);
+
     public TBuilding getBuildingById(String buildingid);
 
     public TBuilding getBuildingByName(String buildingname);
@@ -33,4 +35,6 @@
     public boolean deleteOperBuildingByOperid(String operid);
 
     public boolean saveOperBuilding(TOperbuilding bean);
+
+    public List<TBuilding> getBuildingOperBuildings(String operid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java
index 9a75308..307f3c4 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java
@@ -76,6 +76,7 @@
         return page;
     }
 
+
     private int getSystemBuildingListCount(String regionid,String buildingname){
         String sql = "select count(*) from T_Building bean where 1>0 and bean.flag='A' ";
         if (!StringUtil.isEmpty(regionid)){
@@ -105,6 +106,52 @@
 
     @Transactional
     @Override
+    public Pagination getBuildingOperBuildingList(String regionid, String buildingname, String operid, int pageNo, int pageSize) {
+        // 楼栋管理员regionid为空
+        String sql = "select bean.buildingid,bean.buildingname,bean.synctime,bean.updtime,bean.flag,bean.buildingdesc,bean.regionid "+
+                " from T_Building bean left join T_operbuilding a on a.buildingid=bean.buildingid " +
+                " where 1>0 and bean.flag='A' and a.operid= :operid";
+        if (!StringUtil.isEmpty(buildingname)){
+            sql += " and bean.buildingname like :buildingname";
+        }
+        Query query = entityManager.createNativeQuery(sql, TBuilding.class);
+        query.setParameter("operid", operid);
+        if (!StringUtil.isEmpty(buildingname)){
+            query.setParameter("buildingname", "%"+buildingname+"%");
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TBuilding> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getBuildingOperBuildingListCount(operid,buildingname);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getBuildingOperBuildingListCount(String operid,String buildingname){
+        String sql = "select count(*) from T_BUILDING bean left join T_operbuilding a on a.buildingid=bean.buildingid "+
+                "where 1>0 and bean.flag='A' and a.operid= :operid";
+        if (!StringUtil.isEmpty(buildingname)){
+            sql += " and bean.buildingname like :buildingname";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        if (!StringUtil.isEmpty(buildingname)){
+            query.setParameter("buildingname", "%"+buildingname+"%");
+        }
+        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 TBuilding getBuildingById(String buildingid) {
         String sql = "select bean from TBuilding bean where bean.flag='A' and bean.buildingid=:buildingid";
         TypedQuery<TBuilding> query = entityManager.createQuery(sql, TBuilding.class);
@@ -250,4 +297,16 @@
         }
         return flag;
     }
+
+    @Transactional
+    @Override
+    public List<TBuilding> getBuildingOperBuildings(String operid) {
+        String sql = "select bean.buildingid,bean.buildingname,bean.synctime,bean.updtime,bean.flag,bean.buildingdesc,bean.regionid " +
+                " from T_Building bean " +
+                " where 1>0 and bean.flag='A' and bean.buildingid in (select a.buildingid from t_operbuilding a where a.operid =?1)";
+        Query query = entityManager.createNativeQuery(sql, TBuilding.class);
+        query.setParameter(1, operid);
+        List<TBuilding> list = query.getResultList();
+        return list;
+    }
 }
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 0f1f65f..1cf4ced 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
@@ -74,6 +74,9 @@
     //根据查询条件分页获取所有楼栋
     public Pagination getSystemBuildingList(String regionid,String buildingname,int pageNo,int pageSize);
 
+    //分页获取楼栋管理员权限内楼栋
+    public Pagination getBuildingOperBuildingList(String regionid,String buildingname,String operid,int pageNo,int pageSize);
+
     //根据id获取楼栋信息
     public TBuilding getBuildingById(String buildingid);
 
@@ -106,4 +109,7 @@
 
     //保存操作员分配的楼栋
     public boolean saveOperBuilding(TOperbuilding bean);
+
+    //获取楼栋管理员权限下的楼栋
+    public List<TBuilding> getBuildingOperBuildings(String operid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
index 359c8e1..44c31e5 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
@@ -140,6 +140,11 @@
     }
 
     @Override
+    public Pagination getBuildingOperBuildingList(String regionid, String buildingname, String operid, int pageNo, int pageSize) {
+        return buildingDao.getBuildingOperBuildingList(regionid, buildingname, operid, pageNo, pageSize);
+    }
+
+    @Override
     public TBuilding getBuildingById(String buildingid) {
         return buildingDao.getBuildingById(buildingid);
     }
@@ -194,4 +199,9 @@
         return buildingDao.saveOperBuilding(bean);
     }
 
+    @Override
+    public List<TBuilding> getBuildingOperBuildings(String operid) {
+        return buildingDao.getBuildingOperBuildings(operid);
+    }
+
 }
diff --git a/src/main/resources/templates/ncmgr/nc_dev.html b/src/main/resources/templates/ncmgr/nc_dev.html
index bc9d804..52157b7 100644
--- a/src/main/resources/templates/ncmgr/nc_dev.html
+++ b/src/main/resources/templates/ncmgr/nc_dev.html
@@ -570,14 +570,16 @@
                         value:'',
                         label:''
                     });
-                    if (rt.length==1){
-                        vue.devform.regionid = rt[0].regionid;
-                    }
-                    for (var j=0;j<rt.length;j++){
-                        uows.push({
-                            value: rt[j].regionid,
-                            label: rt[j].regionname
-                        });
+                    if (rt!=null) {
+                        if (rt.length == 1) {
+                            vue.devform.regionid = rt[0].regionid;
+                        }
+                        for (var j = 0; j < rt.length; j++) {
+                            uows.push({
+                                value: rt[j].regionid,
+                                label: rt[j].regionname
+                            });
+                        }
                     }
 
 
@@ -675,11 +677,13 @@
                 }
                 var regionlist=[];
                 var regiondata = ret.regionsfill;
-                for (var i = 0; i < regiondata.length; i++) {
-                    regionlist.push({
-                        label: regiondata[i].regionname,
-                        value: regiondata[i].regionid
-                    });
+                if (regiondata!=null) {
+                    for (var i = 0; i < regiondata.length; i++) {
+                        regionlist.push({
+                            label: regiondata[i].regionname,
+                            value: regiondata[i].regionid
+                        });
+                    }
                 }
 
                 var buildinglist=[];
diff --git a/src/main/resources/templates/system/operator.html b/src/main/resources/templates/system/operator.html
index c4a30ca..2a05b42 100644
--- a/src/main/resources/templates/system/operator.html
+++ b/src/main/resources/templates/system/operator.html
@@ -450,7 +450,7 @@
                     success: function (data) {
                         if (data.okFlag==1){
                             _that.dlgAllotBuildingVisible=false;
-                            layer.msg('分配设备成功', {icon: 1,time:2000});
+                            layer.msg(data.result, {icon: 1,time:2000});
                             _that.selectBuildingList=[];
                         }else{
                             layer.msg(data.result, {icon: 2,time:2000});
