diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
index c5c4872..76433cf 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -48,6 +48,9 @@
 
   @Column(name = "CLOSEDATE", length = 8)
   private String closedate;
+
+  @Column(name = "REGIONID",length = 32)
+  private String regionid;
   @Transient
   private String roleids;
 
@@ -222,4 +225,12 @@
   public void setFather(TOperator father) {
     this.father = father;
   }
+
+  public String getRegionid() {
+    return regionid;
+  }
+
+  public void setRegionid(String regionid) {
+    this.regionid = regionid;
+  }
 }
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 f52684a..df099ce 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
@@ -30,7 +30,7 @@
     private NcService ncService;
     @Autowired
     private SystemService systemService;
-    
+
     @RequestMapping("/devindex")
     public String devindex(ModelMap model) {
         return "ncmgr/nc_dev";
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 ba92967..91196b9 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
@@ -2,11 +2,10 @@
 
 import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
-import com.supwisdom.dlpay.ncmgr.domain.TRegion;
+import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 
 import java.util.List;
-import java.util.Map;
 
 public interface NcDeviceDao {
     public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingname,String regionname, String devtype);
@@ -38,4 +37,6 @@
     public boolean delDevById(int devid);
 
     public List<TNcDevice> findAllNcDevices();
+
+    public TNcDevice getDevByBuildingid(String buildingid);
 }
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 becafab..5a2f752 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
@@ -3,7 +3,7 @@
 import com.supwisdom.dlpay.ncmgr.dao.NcDeviceDao;
 import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
-import com.supwisdom.dlpay.ncmgr.domain.TRegion;
+import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
@@ -13,7 +13,6 @@
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 import java.util.List;
-import java.util.Map;
 
 @Repository
 public class NcDeviceDaoImpl implements NcDeviceDao {
@@ -227,7 +226,7 @@
         if (devid==0){
             sql="select d from TNcDevice d where d.fdevid=:fdevid and d.devno=:devno ";
         }else {
-            sql="select d from TNcDevice d where d.fdevid=:fdevid and d.devno=:devno and d.deviceid!=:devid ";
+            sql="select d from TNcDevice d where d.fdevid=:fdevid and d.devno=:devno and d.deviceid<>:devid ";
         }
         TypedQuery<TNcDevice> query = entityManager.createQuery(sql, TNcDevice.class);
         if (devid>0){
@@ -319,4 +318,17 @@
         List<TNcDevice> list = query.getResultList();
         return list;
     }
+
+    @Transactional
+    @Override
+    public TNcDevice getDevByBuildingid(String buildingid) {
+        String sql = "select bean from TNcDevice bean where bean.operflag='A' and bean.buildingid=:buildingid";
+        TypedQuery<TNcDevice> query = entityManager.createQuery(sql, TNcDevice.class);
+        query.setParameter("buildingid" , buildingid);
+        List<TNcDevice> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
index 26c89bc..2552c41 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
@@ -13,7 +13,6 @@
 public class TBuilding implements java.io.Serializable {
 
 	// Fields
-
 	private String buildingid;
 	private String buildingname;
 	private String synctime;
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java
index e2ceb63..2df3d9d 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java
@@ -23,7 +23,7 @@
 	@Excel(name = "IP地址")
 	private String ip;
 	private String operflag;
-	private String syncfalg;
+	private String syncflag;
 	private String synctime;
 	private String updtime;
 	@Excel(name = "上级设备编号")
@@ -59,7 +59,7 @@
 		this.devname = devname;
 		this.ip = ip;
 		this.operflag = operflag;
-		this.syncfalg = syncfalg;
+		this.syncflag = syncfalg;
 		this.synctime = synctime;
 		this.updtime = updtime;
 		this.fdevid = fdevid;
@@ -117,11 +117,11 @@
 
 	@Column(name = "SYNCFALG", length = 3)
 	public String getSyncfalg() {
-		return this.syncfalg;
+		return this.syncflag;
 	}
 
 	public void setSyncfalg(String syncfalg) {
-		this.syncfalg = syncfalg;
+		this.syncflag = syncfalg;
 	}
 
 	@Column(name = "SYNCTIME", length = 20)
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 378138d..6c09ff9 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.ncmgr.service;
 
 import com.supwisdom.dlpay.ncmgr.domain.*;
+import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 
 import java.util.List;
@@ -58,6 +59,9 @@
     //设备名单重下(修改该设备已同步名单为未同步)
     public void updateForListReload(String devid);
 
+    //根据楼栋id获取设备
+    public TNcDevice getDevByBuildingid(String buildingid);
+
     //根据查询条件分页获取所有时间段信息
     public Pagination getNcTimeWithPage(String time,int pageNo, int pageSize,Map map);
 
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 9aea87b..551fdfb 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
@@ -3,6 +3,7 @@
 import com.supwisdom.dlpay.ncmgr.dao.*;
 import com.supwisdom.dlpay.ncmgr.domain.*;
 import com.supwisdom.dlpay.ncmgr.service.NcService;
+import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -110,7 +111,12 @@
 
     @Override
     public void updateForListReload(String devid) {
+        ncCardListDao.updateForListReload(devid);
+    }
 
+    @Override
+    public TNcDevice getDevByBuildingid(String buildingid) {
+        return ncDeviceDao.getDevByBuildingid(buildingid);
     }
 
     @Override
diff --git a/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java b/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java
index f152630..1895d87 100644
--- a/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java
+++ b/src/main/java/com/supwisdom/dlpay/query/controller/QueryController.java
@@ -8,8 +8,6 @@
 import com.supwisdom.dlpay.mainservice.bean.TDoordtlInfo;
 import com.supwisdom.dlpay.mainservice.domain.TKey;
 import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
-import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
-import com.supwisdom.dlpay.ncmgr.domain.TRegion;
 import com.supwisdom.dlpay.ncmgr.service.NcService;
 import com.supwisdom.dlpay.system.domain.TDictionaryId;
 import com.supwisdom.dlpay.system.page.Pagination;
@@ -131,7 +129,6 @@
 
     /**
      * 获取流水信息
-     * @param map
      * @param request
      * @param startTranDate
      * @param endTranDate
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/BuildingBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/BuildingBean.java
new file mode 100644
index 0000000..a5bd29d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/BuildingBean.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class BuildingBean {
+    private String buildingid;
+    private String buildingname;
+    private String buildingdesc;
+    private String regionid;
+
+    public String getBuildingid() {
+        return buildingid;
+    }
+
+    public void setBuildingid(String buildingid) {
+        this.buildingid = buildingid;
+    }
+
+    public String getBuildingname() {
+        return buildingname;
+    }
+
+    public void setBuildingname(String buildingname) {
+        this.buildingname = buildingname;
+    }
+
+    public String getBuildingdesc() {
+        return buildingdesc;
+    }
+
+    public void setBuildingdesc(String buildingdesc) {
+        this.buildingdesc = buildingdesc;
+    }
+
+    public String getRegionid() {
+        return regionid;
+    }
+
+    public void setRegionid(String regionid) {
+        this.regionid = regionid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/RegionBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/RegionBean.java
new file mode 100644
index 0000000..7b0eabf
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/RegionBean.java
@@ -0,0 +1,58 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class RegionBean {
+    private String regionid;
+    private String regionname;
+    private Integer level;
+    private String parentid;
+    private String address;
+    private String remarks;
+
+    public String getRegionid() {
+        return regionid;
+    }
+
+    public void setRegionid(String regionid) {
+        this.regionid = regionid;
+    }
+
+    public String getRegionname() {
+        return regionname;
+    }
+
+    public void setRegionname(String regionname) {
+        this.regionname = regionname;
+    }
+
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public String getParentid() {
+        return parentid;
+    }
+
+    public void setParentid(String parentid) {
+        this.parentid = parentid;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+}
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 a12b97d..3fa49bf 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
@@ -1,19 +1,28 @@
 package com.supwisdom.dlpay.system.controller;
 
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.ncmgr.service.NcService;
+import com.supwisdom.dlpay.system.bean.BuildingBean;
+import com.supwisdom.dlpay.system.bean.RegionBean;
 import com.supwisdom.dlpay.system.domain.DictionaryType;
 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;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -25,6 +34,8 @@
 
     @Autowired
     private SystemService systemService;
+    @Autowired
+    private NcService ncService;
 
     @RequestMapping("/dictionary")
     public String dictionary(ModelMap model){
@@ -186,4 +197,376 @@
         }
         return map;
     }
+
+    /**
+     * 分页获取区域类别
+     * @param request
+     * @param response
+     * @param pageNo
+     * @param pageSize
+     * @param regionname
+     * @param operUser
+     * @return
+     */
+    @RequestMapping("/loadRegionList")
+    @ResponseBody
+    public Map loadRegionList(HttpServletRequest request,
+                               HttpServletResponse response,
+                               @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                               @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                               @RequestParam(value = "regionname", required = false, defaultValue = "") String regionname,
+                               @AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try{
+            String opertype = operUser.getOpertype();
+            Pagination page = null;
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                page = systemService.getSystemRegionList(regionname, pageNo, pageSize);
+            }else {
+                page = systemService.getOperatorRegionList(regionname, operUser.getRegionid(), pageNo, pageSize);
+            }
+            map.put("PageResult", page);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+
+    /**
+     * 删除区域
+     * @param regionid
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping("/deleteRegion")
+    @ResponseBody
+    public Map deleteRegion(@RequestParam(value = "regionid") String regionid,
+                            HttpServletRequest request, HttpServletResponse response){
+        //TODO 返回无权限删除此区域
+        Map map = new HashMap();
+        String message="";
+        try{
+            List<TBuilding> building = systemService.getBuildingByRegionId(regionid);
+            List<TRegion> regionByParentId = systemService.getRegionByParentId(regionid);
+            if (building!=null && regionByParentId!=null){
+                message="此区域已被绑定!";
+                map.put("message", message);
+                return map;
+            }
+            boolean flag = systemService.deleteRegionById(regionid);
+            if (flag==false){
+                message="删除区域失败!";
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            message="删除区域出错!";
+        }
+        map.put("message", message);
+        return map;
+    }
+
+    /**
+     * 获取指定区域信息
+     * @param regionid
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/loadRegionForUpdate")
+    public Map loadRegionForUpdate(@RequestParam(value = "regionid") String regionid,
+                                   @AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try {
+            TRegion region = systemService.getRegionById(regionid);
+            map.put("region",region);
+            List<TDictionaryId> dicts = systemService.findTDictionaryByType(6);//区域级别
+            map.put("dicts", dicts);
+            if (region!=null) {
+                List<TRegion> fRegion = systemService.getRegionListByLevel(region.getLevel());
+                map.put("fRegion", fRegion);
+            }else {
+                List<TRegion> fRegion = systemService.getAllRegions();
+                map.put("fRegion", fRegion);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 保存区域
+     * @param postData
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addRegion", method = {RequestMethod.POST})
+    public Map addRegion (@RequestBody RegionBean postData){
+        Map map = new HashMap();
+        try{
+            TRegion regionById = systemService.getRegionById(postData.getRegionid());
+            if (regionById!=null){
+                map.put("errStr", "区域编号已经存在，请修改！");
+                return map;
+            }
+            TRegion regionByName = systemService.getRegionByName(postData.getRegionname());
+            if (regionByName!=null){
+                map.put("errStr", "区域名称已经存在，请修改！");
+                return map;
+            }
+            TRegion region= new TRegion();
+            region.setRegionid(postData.getRegionid());
+            region.setAddress(postData.getAddress());
+            region.setLevel(postData.getLevel());
+            region.setParentid(postData.getParentid());
+            region.setRegionname(postData.getRegionname());
+            region.setRemarks(postData.getRemarks());
+            TRegion tRegion = systemService.getRegionById(postData.getParentid());
+            region.setParentname(tRegion.getRegionname());
+            region.setFlag(1);
+
+            systemService.saveRegion(region);
+            map.put("errStr", "");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("errStr", "保存区域失败!"+e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 修改区域
+     * @param postData
+     * @return
+     */
+    @RequestMapping(value = "/updateRegion", method = {RequestMethod.POST})
+    @ResponseBody
+    public Map updateRegion(@RequestBody RegionBean postData){
+        Map map = new HashMap();
+        try {
+            if (postData == null) {
+                map.put("errStr", "请先选择区域，然后再修改！");
+                return map;
+            }
+            TRegion regionByName = systemService.getRegionByNameAndId(postData.getRegionname(), postData.getRegionid());
+            if (regionByName!=null){
+                map.put("errStr", "区域名称已经存在，请修改！");
+                return map;
+            }
+            TRegion region = systemService.getRegionById(postData.getRegionid());
+            region.setAddress(postData.getAddress());
+            region.setLevel(postData.getLevel());
+            region.setParentid(postData.getParentid());
+            region.setRegionname(postData.getRegionname());
+            region.setRemarks(postData.getRemarks());
+            TRegion tRegion = systemService.getRegionById(postData.getParentid());
+            region.setParentname(tRegion.getParentname());
+            region.setFlag(1);
+
+            systemService.updateRegion(region);
+            map.put("errStr", "");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("errStr", "区域修改失败!"+e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 获取选取区域等级的所有可选父区域
+     * @param level
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/getFregion")
+    public Map getFregion(@RequestParam(value = "level")int level){
+        Map map = new HashMap();
+        try{
+            List<TRegion> parentRegion = systemService.getRegionListByLevel(level);
+            map.put("parentRegion", parentRegion);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 根据查询条件分页获取楼栋
+     * @param request
+     * @param response
+     * @param pageNo
+     * @param pageSize
+     * @param regionid
+     * @param buildingname
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/loadBuildingList")
+    public Map loadBuildingList(HttpServletRequest request,
+                                HttpServletResponse response,
+                                @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                                @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                                @RequestParam(value = "regionid", required = false, defaultValue = "") String regionid,
+                                @RequestParam(value = "buildingname",required = false,defaultValue = "")String buildingname,
+                                @AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try {
+            String opertype = operUser.getOpertype();
+            Pagination page = null;
+            page = systemService.getSystemBuildingList(regionid, buildingname, pageNo, pageSize);
+            map.put("pageResult", page);
+
+            List<TRegion> regionList = null;
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                regionList = systemService.getAllRegions();
+            }else if (!StringUtil.isEmpty(operUser.getRegionid())){
+                TRegion region = systemService.getRegionById(operUser.getRegionid());
+                regionList.add(region);
+            }
+            map.put("regionList", regionList);
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 根据楼栋id获取楼栋信息填充
+     * @param buildingid
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/loadBuildingForUpdate" )
+    public Map loadBuildingForUpdate(@RequestParam(value = "buildingid") String buildingid,
+                                     @AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try{
+            String opertype = operUser.getOpertype();
+            TBuilding building = systemService.getBuildingById(buildingid);
+            map.put("building", building);
+            List<TRegion> regionList = null;
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                regionList = systemService.getAllRegions();
+            }else if (!StringUtil.isEmpty(operUser.getRegionid())){
+                TRegion region = systemService.getRegionById(operUser.getRegionid());
+                regionList.add(region);
+            }
+            map.put("regionslist", regionList);
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 保存楼栋
+     * @param postData
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addBuilding",method = RequestMethod.POST)
+    public Map addBuilding(@RequestBody BuildingBean postData){
+        Map map = new HashMap();
+        try {
+            TBuilding buildingById = systemService.getBuildingById(postData.getBuildingid());
+            if (buildingById!=null){
+                map.put("errStr", "楼栋编号已经存在，请修改！");
+                return map;
+            }
+            TBuilding buildingByName = systemService.getBuildingByName(postData.getBuildingname());
+            if (buildingByName!=null){
+                map.put("errStr", "楼栋名称已经存在，请修改！");
+                return map;
+            }
+            String now = DateUtil.getNow();
+            TBuilding tBuilding = new TBuilding();
+            tBuilding.setBuildingid(postData.getBuildingid());
+            tBuilding.setBuildingname(postData.getBuildingname());
+            tBuilding.setBuildingdesc(postData.getBuildingdesc());
+            tBuilding.setRegionid(postData.getRegionid());
+            tBuilding.setSynctime(now);
+            tBuilding.setUpdtime(now);
+            tBuilding.setFlag("A");
+
+            systemService.saveBuilding(tBuilding);
+            map.put("errStr", "");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("errStr", "保存楼栋失败");
+        }
+        return map;
+    }
+
+    /**
+     * 修改楼栋
+     * @param postData
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/updateBuilding",method = RequestMethod.POST)
+    public Map updateBuilding(@RequestBody BuildingBean postData){
+        Map map = new HashMap();
+        try{
+            if (postData==null){
+                map.put("errStr", "请先选择楼栋再修改!");
+            }
+            TBuilding buildingByNameAndId = systemService.getBuildingByNameAndId(postData.getBuildingname(), postData.getBuildingid());
+            if (buildingByNameAndId!=null){
+                map.put("errStr", "楼栋名称已经存在，请修改！");
+                return map;
+            }
+            String now = DateUtil.getNow();
+            TBuilding building = systemService.getBuildingById(postData.getBuildingid());
+            building.setBuildingname(postData.getBuildingname());
+            building.setBuildingdesc(postData.getBuildingdesc());
+            building.setRegionid(postData.getRegionid());
+            building.setSynctime(now);
+            building.setUpdtime(now);
+            building.setFlag("A");
+
+            systemService.updateBuilding(building);
+            map.put("errStr", "");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("errStr", "楼栋修改失败"+e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 删除楼栋
+     * @param buildingid
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/deleteBuilding")
+    public Map deleteBuilding(@RequestParam(value = "buildingid") String buildingid){
+        Map map = new HashMap();
+        String message="";
+        try{
+            TNcDevice devByBuildingid = ncService.getDevByBuildingid(buildingid);
+            if (devByBuildingid!=null){
+                message="该楼栋已被绑定!";
+                map.put("message", message);
+                return map;
+            }
+            boolean b = systemService.delBuilding(buildingid);
+            if (b==false){
+                message="删除楼栋失败!";
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            message="删除楼栋错误"+e.getMessage();
+        }
+        map.put("message", message);
+        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
new file mode 100644
index 0000000..ab897e2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.system.dao;
+
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface BuildingDao {
+    public List<TBuilding> getBuildingByRegionId(String regionid);
+
+    public Pagination getSystemBuildingList(String regionid, String buildingname, int pageNo, int pageSize);
+
+    public TBuilding getBuildingById(String buildingid);
+
+    public TBuilding getBuildingByName(String buildingname);
+
+    public boolean saveBuilding(TBuilding bean);
+
+    public TBuilding getBuildingByNameAndId(String buildingname,String buildingid);
+
+    public boolean updateBuilding(TBuilding bean);
+
+    public boolean updateBuildingFlag(String buildingid);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java
new file mode 100644
index 0000000..5c39b62
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.system.dao;
+
+import com.supwisdom.dlpay.system.domain.TRegion;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface RegionDao {
+    public Pagination getSystemRegionList(String regionname, int pageNo, int pageSize);
+
+    public Pagination getOperatorRegionList(String regionname,String regionid,int pageNo,int pageSize);
+
+    //根据id修改指定区域状态flag为0
+    public boolean updateRegionFlag(String regionid);
+
+    public TRegion getRegionById(String regionid);
+
+    public List<TRegion> getRegionListByLevel(int level);
+
+    public List<TRegion> getAllRegions();
+
+    public TRegion getRegionByName(String regionname);
+
+    public boolean saveRegion(TRegion bean);
+
+    public TRegion getRegionByNameAndId(String regionname,String regionid);
+
+    public boolean updateRegion(TRegion bean);
+
+    public List<TRegion> getRegionByParentId(String parentid);
+}
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
new file mode 100644
index 0000000..90c93f2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java
@@ -0,0 +1,179 @@
+package com.supwisdom.dlpay.system.dao.impl;
+
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
+import com.supwisdom.dlpay.system.dao.BuildingDao;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.List;
+@Repository
+public class BuildingDaoImpl implements BuildingDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public List<TBuilding> getBuildingByRegionId(String regionid) {
+        String sql = "select bean from TBuilding bean where bean.flag='A' and bean.regionid=:regionid ";
+        TypedQuery<TBuilding> query = entityManager.createQuery(sql, TBuilding.class);
+        query.setParameter("regionid", regionid);
+        List<TBuilding> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list;
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public Pagination getSystemBuildingList(String regionid, String buildingname, int pageNo, int pageSize) {
+        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' ";
+        if (!StringUtil.isEmpty(regionid)){
+            sql += "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  )";
+        }
+
+        if (!StringUtil.isEmpty(buildingname)){
+           sql += " and bean.buildingname like :buildingname";
+        }
+        sql += " order by bean.buildingid";
+
+        Query query = entityManager.createNativeQuery(sql, TBuilding.class);
+        if (!StringUtil.isEmpty(regionid)){
+            query.setParameter("regionid", regionid );
+        }
+        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 = getSystemBuildingListCount(regionid,buildingname);
+        page.setTotalCount(totalCount);
+        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)){
+            sql += "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  )";
+        }
+
+        if (!StringUtil.isEmpty(buildingname)){
+            sql += " and bean.buildingname like :buildingname";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        if (!StringUtil.isEmpty(regionid)){
+            query.setParameter("regionid", regionid );
+        }
+        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);
+        query.setParameter("buildingid" , buildingid);
+        List<TBuilding> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TBuilding getBuildingByName(String buildingname) {
+        String sql = "select bean from TBuilding bean where bean.flag='A' and bean.buildingname=:buildingname";
+        TypedQuery<TBuilding> query = entityManager.createQuery(sql, TBuilding.class);
+        query.setParameter("buildingname", buildingname);
+        List<TBuilding> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveBuilding(TBuilding bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TBuilding getBuildingByNameAndId(String buildingname, String buildingid) {
+        String sql = "select bean from TBuilding bean where bean.flag='A' and bean.buildingname=:buildingname and bean.buildingid <> :buildingid ";
+        TypedQuery<TBuilding> query = entityManager.createQuery(sql, TBuilding.class);
+        query.setParameter("buildingname" ,buildingname );
+        query.setParameter("buildingid" ,buildingid );
+        List<TBuilding> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateBuilding(TBuilding bean) {
+        boolean flag = false;
+        try {
+            entityManager.merge(bean);
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateBuildingFlag(String buildingid) {
+        boolean flag = false;
+        try {
+            String sql = "update t_building set flag = 'D' where buildingid = ?1 ";
+            Query query = entityManager.createNativeQuery(sql);
+            query.setParameter(1, buildingid);
+            query.executeUpdate();
+            flag = true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}
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
new file mode 100644
index 0000000..fe077a8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java
@@ -0,0 +1,242 @@
+package com.supwisdom.dlpay.system.dao.impl;
+
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.dao.RegionDao;
+import com.supwisdom.dlpay.system.domain.TRegion;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.List;
+
+@Repository
+public class RegionDaoImpl implements RegionDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getSystemRegionList(String regionname, int pageNo, int pageSize) {
+        String sql = "select bean from TRegion bean where 1>0 and bean.flag=1 ";
+        if (!StringUtil.isEmpty(regionname)){
+            sql += " and bean.regionname like :regionname ";
+        }
+
+        sql += " order by bean.level";
+
+        TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);
+        if(!StringUtil.isEmpty(regionname)){
+            query.setParameter("regionname", "%"+regionname+"%" );
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TRegion> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getSystemRegionListCount(regionname);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getSystemRegionListCount(String regionname){
+        String sql = "select count(*) from TB_Region where 1>0 and flag=1 ";
+        if (!StringUtil.isEmpty(regionname)){
+            sql += " and regionname like :regionname ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        if(!StringUtil.isEmpty(regionname)){
+            query.setParameter("regionname", "%"+regionname+"%" );
+        }
+        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 Pagination getOperatorRegionList(String regionname, String regionid, int pageNo, int pageSize) {
+        String sql = "select bean.regionid,bean.address,bean.level,bean.parentid,bean.regionname,bean.remarks,bean.parentname,bean.flag" +
+                " from Tb_Region bean where 1>0 and bean.flag=1 ";
+        sql += "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  ";
+
+        if (!StringUtil.isEmpty(regionname)){
+            sql += " and tmp.regionname like :regionname ";
+        }
+        sql += ") order by bean.level";
+
+        Query query = entityManager.createNativeQuery(sql, TRegion.class);
+        query.setParameter("regionid" , regionid);
+        if(!StringUtil.isEmpty(regionname)){
+            query.setParameter("regionname", "%"+regionname+"%" );
+        }
+
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TRegion> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getOperatorRegionListCount(regionname,regionid);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+
+    private int getOperatorRegionListCount(String regionname,String regionid){
+        String sql = "select count(*) from Tb_Region bean where 1>0 and bean.flag=1 ";
+        sql += "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  ";
+
+        if (!StringUtil.isEmpty(regionname)){
+            sql += " and tmp.regionname like :regionname";
+        }
+        sql += ") order by level";
+        Query query = entityManager.createNativeQuery(sql);
+        query.setParameter("regionid" , regionid);
+        if(!StringUtil.isEmpty(regionname)){
+            query.setParameter("regionname", "%"+regionname+"%" );
+        }
+        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 boolean updateRegionFlag(String regionid) {
+        boolean flag = false;
+        try {
+            String sql = "update tb_region set flag = 0 where regionid = ?1 ";
+            Query query = entityManager.createNativeQuery(sql);
+            query.setParameter(1, regionid);
+            query.executeUpdate();
+            flag = true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TRegion getRegionById(String regionid) {
+        String sql = "select bean from TRegion bean where bean.regionid = :regionid and bean.flag=1 ";
+        TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);
+        query.setParameter("regionid", regionid );
+        List<TRegion> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @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);
+        query.setParameter("level" , level-1);
+        List<TRegion> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list;
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public List<TRegion> getAllRegions() {
+        String sql = "select bean from TRegion bean where bean.flag = 1";
+        TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);
+        List<TRegion> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list;
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TRegion getRegionByName(String regionname) {
+        String sql = "select bean from TRegion bean where bean.regionname = :regionname and bean.flag=1 ";
+        TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);
+        query.setParameter("regionname", regionname );
+        List<TRegion> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveRegion(TRegion bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TRegion getRegionByNameAndId(String regionname, String regionid) {
+        String sql = "select bean from TRegion bean where bean.regionname = :regionname and bean.flag=1 and bean.regionid <>:regionid";
+        TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);
+        query.setParameter("regionname", regionname );
+        query.setParameter("regionid",  regionid);
+        List<TRegion> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateRegion(TRegion bean) {
+        boolean flag = false;
+        try {
+            entityManager.merge(bean);
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public List<TRegion> getRegionByParentId(String parentid) {
+        String sql = "select bean from TRegion bean where bean.flag=1 and bean.parentid=:parentid";
+        TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);
+        query.setParameter("parentid", parentid);
+        List<TRegion> list = query.getResultList();
+        return list;
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TRegion.java b/src/main/java/com/supwisdom/dlpay/system/domain/TRegion.java
similarity index 67%
rename from src/main/java/com/supwisdom/dlpay/ncmgr/domain/TRegion.java
rename to src/main/java/com/supwisdom/dlpay/system/domain/TRegion.java
index 66edb0f..7513f94 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TRegion.java
+++ b/src/main/java/com/supwisdom/dlpay/system/domain/TRegion.java
@@ -1,15 +1,13 @@
-package com.supwisdom.dlpay.ncmgr.domain;
+package com.supwisdom.dlpay.system.domain;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
-import java.io.Serializable;
 
 @Entity
 @Table(name = "TB_REGION")
-public class TRegion implements Serializable {
-
+public class TRegion {
     private String regionid;
     private String address;
     private Integer level;
@@ -20,7 +18,7 @@
     private Integer flag;
 
     @Id
-    @Column(name = "REGIONID", unique = true, nullable = false, length = 32)
+    @Column(name = "REGIONID", unique = true, nullable = false, scale = 0)
     public String getRegionid() {
         return regionid;
     }
@@ -29,7 +27,7 @@
         this.regionid = regionid;
     }
 
-    @Column(name = "ADDRESS", length = 255)
+    @Column(name = "ADDRESS",length = 255)
     public String getAddress() {
         return address;
     }
@@ -38,7 +36,7 @@
         this.address = address;
     }
 
-    @Column(name = "LEVEL", length = 32)
+    @Column(name = "LEVEL")
     public Integer getLevel() {
         return level;
     }
@@ -47,7 +45,7 @@
         this.level = level;
     }
 
-    @Column(name = "PARENTID", length = 32)
+    @Column(name = "PARENTID",length = 32)
     public String getParentid() {
         return parentid;
     }
@@ -56,7 +54,7 @@
         this.parentid = parentid;
     }
 
-    @Column(name = "REGIONNAME", length = 200)
+    @Column(name = "REGIONNAME",length = 200)
     public String getRegionname() {
         return regionname;
     }
@@ -65,7 +63,7 @@
         this.regionname = regionname;
     }
 
-    @Column(name = "REMARKS", length = 255)
+    @Column(name = "REMARKS",length = 255)
     public String getRemarks() {
         return remarks;
     }
@@ -74,7 +72,7 @@
         this.remarks = remarks;
     }
 
-    @Column(name = "PARENTNAME", length = 200)
+    @Column(name = "PARENTNAME",length = 200)
     public String getParentname() {
         return parentname;
     }
@@ -83,7 +81,7 @@
         this.parentname = parentname;
     }
 
-    @Column(name = "FLAG", length = 32)
+    @Column(name = "FLAG")
     public Integer getFlag() {
         return flag;
     }
@@ -91,4 +89,18 @@
     public void setFlag(Integer flag) {
         this.flag = flag;
     }
+
+    public TRegion(String regionid, String address, Integer level, String parentid, String regionname, String remarks, String parentname, Integer flag) {
+        this.regionid = regionid;
+        this.address = address;
+        this.level = level;
+        this.parentid = parentid;
+        this.regionname = regionname;
+        this.remarks = remarks;
+        this.parentname = parentname;
+        this.flag = flag;
+    }
+
+    public TRegion() {
+    }
 }
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 24ec522..8adf9ed 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
@@ -1,9 +1,11 @@
 package com.supwisdom.dlpay.system.service;
 
 
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.system.domain.DictionaryType;
 import com.supwisdom.dlpay.system.domain.TDictionary;
 import com.supwisdom.dlpay.system.domain.TDictionaryId;
+import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 
 import java.util.List;
@@ -31,5 +33,61 @@
     //根据操作员id获取有权限的操作员
     public List<String> findOperatorsByFopercode(String operid);
 
+    //根据查询条件分页获取所有区域
+    public Pagination getSystemRegionList(String regionname,int pageNo,int pageSize);
+
+    //根据查询条件以及管理员区域分页获取区域
+    public Pagination getOperatorRegionList(String regionname,String regionid,int pageNo,int pageSize);
+
+    //根据区域id查询楼栋
+    public List<TBuilding> getBuildingByRegionId(String regionid);
+
+    //根据id删除区域--修改状态flag为0
+    public boolean deleteRegionById(String regionid);
+
+    //根据id获取区域
+    public TRegion getRegionById(String regionid);
+
+    //根据区域级别获取其上一级级别的所有区域
+    public List<TRegion> getRegionListByLevel(int level);
+
+    //获取所有区域
+    public List<TRegion> getAllRegions();
+
+    //根据名称获取区域
+    public TRegion getRegionByName(String regionname);
+
+    //保存区域
+    public boolean saveRegion(TRegion bean);
+
+    //根据id和名称获取非本id的相同名称区域
+    public TRegion getRegionByNameAndId(String regionname,String regionid);
+
+    //修改区域
+    public boolean updateRegion(TRegion bean);
+
+    //根据parentid获取区域
+    public List<TRegion> getRegionByParentId(String parentid);
+
+    //根据查询条件分页获取所有楼栋
+    public Pagination getSystemBuildingList(String regionid,String buildingname,int pageNo,int pageSize);
+
+    //根据id获取楼栋信息
+    public TBuilding getBuildingById(String buildingid);
+
+    //根据名称获取楼栋信息
+    public TBuilding getBuildingByName(String buildingname);
+
+    //保存楼栋
+    public boolean saveBuilding(TBuilding bean);
+
+    //根据id和名称获取非本id的相同名称楼栋
+    public TBuilding getBuildingByNameAndId(String buildingname,String buildingid);
+
+    //修改楼栋
+    public boolean updateBuilding(TBuilding bean);
+
+    //根据id删除楼栋---修改flag为D
+    public boolean delBuilding(String buildingid);
 
 }
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 6b47410..1f48e88 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/SystemServiceImpl.java
@@ -1,10 +1,14 @@
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
+import com.supwisdom.dlpay.system.dao.BuildingDao;
 import com.supwisdom.dlpay.system.dao.DictionaryDao;
 import com.supwisdom.dlpay.system.dao.OperatorDao;
+import com.supwisdom.dlpay.system.dao.RegionDao;
 import com.supwisdom.dlpay.system.domain.DictionaryType;
 import com.supwisdom.dlpay.system.domain.TDictionary;
 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 org.springframework.beans.factory.annotation.Autowired;
@@ -18,6 +22,10 @@
     private DictionaryDao dictionaryDao;
     @Autowired
     private OperatorDao operatorDao;
+    @Autowired
+    private RegionDao regionDao;
+    @Autowired
+    private BuildingDao buildingDao;
 
     @Override
     public Pagination findDictionary(String dicttype, String dictcaption, Integer pageNo, Integer pageSize) {
@@ -62,4 +70,99 @@
         return operatorDao.findOperatorsByFopercode(operid);
     }
 
+    @Override
+    public Pagination getSystemRegionList(String regionname, int pageNo, int pageSize) {
+        return regionDao.getSystemRegionList(regionname, pageNo, pageSize);
+    }
+
+    @Override
+    public Pagination getOperatorRegionList(String regionname, String regionid, int pageNo, int pageSize) {
+        return regionDao.getOperatorRegionList(regionname, regionid, pageNo, pageSize);
+    }
+
+    @Override
+    public List<TBuilding> getBuildingByRegionId(String regionid) {
+        return buildingDao.getBuildingByRegionId(regionid);
+    }
+
+    @Override
+    public boolean deleteRegionById(String regionid) {
+        return regionDao.updateRegionFlag(regionid);
+    }
+
+    @Override
+    public TRegion getRegionById(String regionid) {
+        return regionDao.getRegionById(regionid);
+    }
+
+    @Override
+    public List<TRegion> getRegionListByLevel(int level) {
+        return regionDao.getRegionListByLevel(level);
+    }
+
+    @Override
+    public List<TRegion> getAllRegions() {
+        return regionDao.getAllRegions();
+    }
+
+    @Override
+    public TRegion getRegionByName(String regionname) {
+        return regionDao.getRegionByName(regionname);
+    }
+
+    @Override
+    public boolean saveRegion(TRegion bean) {
+        return regionDao.saveRegion(bean);
+    }
+
+    @Override
+    public TRegion getRegionByNameAndId(String regionname, String regionid) {
+        return regionDao.getRegionByNameAndId(regionname, regionid);
+    }
+
+    @Override
+    public boolean updateRegion(TRegion bean) {
+        return regionDao.updateRegion(bean);
+    }
+
+    @Override
+    public List<TRegion> getRegionByParentId(String parentid) {
+        return regionDao.getRegionByParentId(parentid);
+    }
+
+    @Override
+    public Pagination getSystemBuildingList(String regionid, String buildingname, int pageNo, int pageSize) {
+        return buildingDao.getSystemBuildingList(regionid, buildingname, pageNo, pageSize);
+    }
+
+    @Override
+    public TBuilding getBuildingById(String buildingid) {
+        return buildingDao.getBuildingById(buildingid);
+    }
+
+    @Override
+    public TBuilding getBuildingByName(String buildingname) {
+        return buildingDao.getBuildingByName(buildingname);
+    }
+
+    @Override
+    public boolean saveBuilding(TBuilding bean) {
+        return buildingDao.saveBuilding(bean);
+    }
+
+    @Override
+    public TBuilding getBuildingByNameAndId(String buildingname, String buildingid) {
+        return buildingDao.getBuildingByNameAndId(buildingname, buildingid);
+    }
+
+    @Override
+    public boolean updateBuilding(TBuilding bean) {
+        return buildingDao.updateBuilding(bean);
+    }
+
+    @Override
+    public boolean delBuilding(String buildingid) {
+        return buildingDao.updateBuildingFlag(buildingid);
+    }
+
 }
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index 637e8f2..848e8a7 100755
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -22,11 +22,12 @@
 
 
     <!--<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.min.js}"></script>
     <script type="text/javascript" th:src="@{/static/libs/q.js}"></script>
     <script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>
-    <!--<script type="text/javascript" th:src="@{/static/libs/zTree/js/jquery.ztree.all-3.5.min.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/libs/zTree/js/jquery.ztree.all-3.5.min.js}"></script>
     <script type="text/javascript" th:src="@{/static/libs/custom.js}"></script>
-    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.min.js}"></script>
+
     <script type="text/javascript" th:src="@{/static/res/assets/plugins/bootstrap/js/bootstrap.min.js}"></script>
     <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.form.js}"></script>
     <script type="text/javascript" th:src="@{/static/res/assets/plugins/validator/validator.js}"></script>
diff --git a/src/main/resources/templates/system/building.html b/src/main/resources/templates/system/building.html
new file mode 100644
index 0000000..01bdd0f
--- /dev/null
+++ b/src/main/resources/templates/system/building.html
@@ -0,0 +1,380 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">楼栋管理</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">集控中心</a>
+          <a><cite>楼栋管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div id="buildingApp">
+            <el-form :inline="true" ref="buildingform" :model="buildingform" data-parsley-validate class="form-horizontal form-label-left">
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-5 col-sm-12 col-xs-12" style="font-size: 14px;">区域:</label>
+                        <div class="col-md-7 col-sm-12 col-xs-12">
+                            <el-select style="width:193px"
+                                       v-model="buildingform.regionid" placeholder="请选择"
+                            > <el-option v-for="item in regionlist"
+                                         :key="item.value" :label="item.label" :value="item.value">
+                            </el-option> </el-select>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-5 col-sm-12 col-xs-12"
+                               style="font-size: 14px;">楼栋名称:</span>
+                        </label>
+                        <div class="col-md-7 col-sm-12 col-xs-12">
+                            <el-input v-model="buildingform.buildingname" id="buildingname"></el-input>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-3">
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button class="btn btn-primary" type="button" @click="addBuilding">添加楼栋</button>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singleTable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        max-height="2000"
+                        border
+                        style="width: 100%;">
+                    <el-table-column
+                            prop="buildingid"
+                            label="楼栋编号"
+                            sortable
+                            width="120">
+                    </el-table-column>
+                    <el-table-column
+                            prop="buildingname"
+                            label="楼栋名称"
+                            width="180">
+                    </el-table-column>
+                    <el-table-column
+                            prop="buildingdesc"
+                            label="楼栋描述"
+                            width="150">
+                    </el-table-column>
+                    <el-table-column
+                            prop="updtime"
+                            label="更新时间"
+                            min-width="180"
+                            :formatter="updform">
+                    </el-table-column>
+                    <el-table-column
+                            prop="regionid"
+                            label="区域编号"
+                            width="100">
+                    </el-table-column>
+                    <el-table-column
+                            fixed="right"
+                            label="操作"
+                            width="213">
+                        <template scope="scope">
+                            <button type="button" class="btn btn-info btn-xs" title="编辑"
+                                    @click="editBuilding(scope.row.buildingid)">编辑
+                            </button>
+                            <button type="button" class="btn btn-danger btn-xs" title="删除"
+                                    @click="delBuilding(scope.row.buildingid)">删除
+                            </button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <div class="clearfix"></div>
+                <el-pagination
+                        @size-change="handleSizeChange"
+                        @current-change="currPageChange"
+                        :current-page="currPage"
+                        :page-sizes="[10, 20, 50, 100]"
+                        :page-size="pageSize"
+                        layout="prev, pager, next,sizes, jumper,total"
+                        :total="totSize">
+                </el-pagination>
+            </template>
+
+            <el-dialog :title="buildingtitle" :visible.sync="dialogFormVisible" size="tiny">
+                <el-form ref="buildingDiaForm" :model="buildingDiaForm" :rules="rules" label-width="120px">
+                    <el-form-item label="楼栋编号:" prop="buildingid">
+                        <el-col :span="22">
+                            <el-input v-model="buildingDiaForm.buildingid" ></el-input>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="楼栋名称:" prop="buildingname">
+                        <el-col :span="22">
+                            <el-input v-model="buildingDiaForm.buildingname" ></el-input>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="信息描述:" prop="buildingdesc">
+                        <el-col :span="22">
+                            <el-input v-model="buildingDiaForm.buildingdesc"></el-input>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="所在区域:" prop="regionid">
+                        <el-col :span="22">
+                            <el-col :span="18">
+                                <el-select v-model="buildingDiaForm.regionid" style="width: 187px;"
+                                           filterable
+                                           placeholder="请选择">
+                                    <el-option
+                                            v-for="regionid in regions"
+                                            :key="regionid.value"
+                                            :label="regionid.label"
+                                            :value="regionid.value">
+                                    </el-option>
+                                </el-select>
+                            </el-col>
+                        </el-col>
+                    </el-form-item>
+
+
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="resetForm('buildingDiaForm') ">取 消</el-button>
+                    <el-button type="primary" @click="saveBuilding('buildingDiaForm')">确 定</el-button>
+                </div>
+            </el-dialog>
+        </div>
+    </div>
+</div>
+
+<script>
+    var vue = new Vue({
+        el: '#buildingApp',
+        data:{
+            tableData: [],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            regionlist:[],
+            regions:[],
+            dialogFormVisible: false,
+            buildingtitle:'',
+            buildingDiaForm:{
+                buildingid:'',
+                buildingname:'',
+                buildingdesc:'',
+                regionid:'',
+            },
+            buildingform:{
+                regionid:'',
+                buildingname:'',
+            },
+
+            rules: {
+                buildingid: [
+                    { required: true, message: '楼栋编号不能为空', trigger: 'blur' },
+                ],
+                buildingname:[
+                    { required: true, message: '楼栋名称不能为空', trigger: 'blur' },
+                ],
+                regionid:[
+                    { required: true, message: '所在区域不能为空', trigger: 'blur' },
+                ]
+            },
+
+        },
+        methods: {
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,this.pageSize);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            query:function () {
+                this.pagesize=10;
+                this.currPage=1;
+                commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,this.pageSize);
+            },
+            addBuilding:function () {
+                getFillData(this,"-1");
+                this.dialogFormVisible = true;
+                this.buildingtitile="添加楼栋";
+            },
+            resetForm:function() {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false;
+            },
+            saveBuilding:function (formName) {
+                var _that=this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function(valid){
+                        if (valid){
+                            vali = true;
+                        }else{
+                            vali=false;
+                        }
+                    });
+                if (vali==true){
+                    saveData(_that,_that.buildingDiaForm,formName);
+                }
+            },
+            delBuilding:function(buildingid){
+                deletedata(buildingid);
+            },
+
+            editBuilding:function (buildingid) {
+                getFillData(this,buildingid);
+                this.dialogFormVisible = true;
+                this.buildingtitile="修改楼栋"
+            },
+            updform: function (row, column, cellValue) {
+                if (row.updtime != null) {
+                    return timeformatter(row.updtime);
+                }
+            }
+        },
+        created:function(){
+            var _self=this;
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"/system/loadBuildingList",
+                success:function(ret){
+                    _self.totSize=ret.pageResult.totalCount;
+                    _self.tableData=ret.pageResult.list;
+                    
+                    if (ret.regionList!=null) {
+                        var rlist = ret.regionList;
+                        var rows = [];
+                        for (var i=0;i<rlist.length;i++){
+                            rows.push({
+                                value: rlist[i].regionid,
+                                label: rlist[i].regionname
+                            });
+                        }
+                        vue.regionlist = rows;
+                    }
+                }
+            })
+        }
+    })
+
+    function commonQuery(_self,regionid,buildingname,pageno,pagesize) {
+        $.ajax({
+            type:"get",
+            dataType:"json",
+            url:encodeURI("/system/loadBuildingList?regionid="
+                +regionid+"&buildingname="+buildingname
+                +"&pageNo="+pageno+"&pageSize="+pagesize),
+            success:function(ret){
+                _self.totSize=ret.pageResult.totalCount;
+                _self.tableData=ret.pageResult.list;
+            }
+        })
+    }
+
+    function getFillData(_self, id) {
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("/system/loadBuildingForUpdate?buildingid=" + id),
+            success: function (ret) {
+                var regionslist = [];
+                var rl = ret.regionslist;
+                for (var j = 0; j < rl.length; j++) {
+                    regionslist.push({
+                        value: rl[j]["regionid"],
+                        label: rl[j]["regionname"]
+                    });
+                }
+
+                if (ret.building != null) {
+                    _self.buildingDiaForm.buildingid = ret.building.buildingid;
+                    _self.buildingDiaForm.buildingname = ret.building.buildingname;
+                    _self.buildingDiaForm.buildingdesc = ret.building.buildingdesc;
+                    _self.buildingDiaForm.regionid = ret.region.regionid;
+                }
+
+                _self.regions = regionslist;
+            }
+        })
+    }
+
+    function saveData(_that,formdata,formName) {
+        var url = null;
+        if(vue.buildingtitile == "添加楼栋"){
+            url = encodeURI("/system/addBuilding");
+        }
+        if(vue.buildingtitile == "修改楼栋"){
+            url = encodeURI("/system/updateBuilding")
+        }
+        var token=$("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data: JSON.stringify(formdata),
+            success: function (data) {
+                if (data.errStr != "") {
+                    layer.msg(data.errStr, {icon: 2,time:1000});
+                } else {
+                    layer.msg('保存信息成功!', {icon: 1,time:1000});
+                    refreshThisTable();
+                    _that.$refs[formName].resetFields();
+                    _that.dialogFormVisible = false;
+                }
+            }
+        });
+    }
+
+    function deletedata(buildingid){
+        layer.confirm('是否删除该楼栋', {icon: 3, title:'请确认',offset:'30%'},function(index){
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"/system/deleteBuilding?buildingid="+buildingid,
+                success:function(ret){
+                    if(ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location="login";
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg('删除成功', {icon: 1, time: 1000});
+                        refreshThisTable();
+                    }
+                }
+            })
+        })
+    }
+
+
+    function refreshThisTable(){
+        $("#qrybtn").click();
+    };
+
+    function timeformatter(time) {
+
+        return time.substr(0, 4) + '-' + time.substr(4, 2) + '-' + time.substr(6, 2) + ' '
+            + time.substr(8, 2) + ':' + time.substr(10, 2) + ':' + time.substr(12, 2);
+
+    }
+
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/dictionary.html b/src/main/resources/templates/system/dictionary.html
index 62fd7ed..9c77518 100644
--- a/src/main/resources/templates/system/dictionary.html
+++ b/src/main/resources/templates/system/dictionary.html
@@ -1,6 +1,6 @@
 <div class="layui-card">
     <div class="layui-card-header">
-        <h2 class="header-title">设备管理</h2>
+        <h2 class="header-title">数据字典管理</h2>
         <span class="layui-breadcrumb pull-right">
           <a href="#">集控中心</a>
           <a><cite>数据字典管理</cite></a>
diff --git a/src/main/resources/templates/system/queue.html b/src/main/resources/templates/system/queue.html
index e07ac0f..59ef6d8 100644
--- a/src/main/resources/templates/system/queue.html
+++ b/src/main/resources/templates/system/queue.html
@@ -1,6 +1,6 @@
 <div class="layui-card">
     <div class="layui-card-header">
-        <h2 class="header-title">设备管理</h2>
+        <h2 class="header-title">任务调度管理</h2>
         <span class="layui-breadcrumb pull-right">
           <a href="#">集控中心</a>
           <a><cite>任务调度管理</cite></a>
diff --git a/src/main/resources/templates/system/region.html b/src/main/resources/templates/system/region.html
new file mode 100644
index 0000000..1588b6f
--- /dev/null
+++ b/src/main/resources/templates/system/region.html
@@ -0,0 +1,445 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">区域管理</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">集控中心</a>
+          <a><cite>区域管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div id="regionapp">
+            <el-form :inline="true" ref="regionform" :model="regionform" data-parsley-validate class="form-horizontal form-label-left">
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">区域名称:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="regionform.regionname" id="regionname"></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-3">
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button class="btn btn-primary" type="button" @click="addRegion">添加区域</button>
+                        <!--<button class="btn btn-info" type="button" @click="lookTree">查看区域树形图</button>-->
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singletable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        max-height="2000"
+                        border
+                        style="width: 100%">
+                    <el-table-column
+                            prop="regionid"
+                            label="区域编号"
+                            width="140">
+                    </el-table-column>
+                    <el-table-column
+                            prop="regionname"
+                            label="区域名称"
+                            width="180">
+                    </el-table-column>
+                    <el-table-column
+                            prop="level"
+                            label="区域级别"
+                            sortable
+                            :formatter="levelform"
+                            width="120">
+                    </el-table-column>
+                    <el-table-column
+                            prop="parentname"
+                            label="父区域"
+                            width="180">
+                    </el-table-column>
+                    <el-table-column
+                            prop="address"
+                            label="详细地址"
+                            width="200">
+                    </el-table-column>
+                    <el-table-column
+                            prop="remarks"
+                            label="备注"
+                            width="180">
+                    </el-table-column>
+                    <el-table-column
+                            label="操作"
+                            width="130">
+                        <template scope="scope">
+                            <button type="button" class="btn btn-info btn-xs" title="编辑" @click="editRegion(scope.row.regionid)">编辑</button>
+                            <button type="button" class="btn btn-danger btn-xs" title="删除" @click="delRegion(scope.row.regionid)">删除</button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <div class="clearfix"></div>
+                <el-pagination
+                        @size-change="handleSizeChange"
+                        @current-change="currPageChange"
+                        :current-page="currPage"
+                        :page-sizes="[10, 20, 50, 100]"
+                        :page-size="pageSize"
+                        layout="prev, pager, next,sizes, jumper,total"
+                        :total="totSize">
+                </el-pagination>
+            </template>
+
+            <el-dialog :title="regiontitile" :visible.sync="dialogFormVisible"  >
+                <el-form ref="regionDiaForm" :model="regionDiaForm" :rules="rules" label-width="36%" >
+                    <el-form-item label="区域编号:" prop="regionid">
+                        <div class="el-col el-col-15">
+                            <div class="el-input" style="width: 187px;">
+                                <el-input v-model="regionDiaForm.regionid">
+                                    <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                                </el-input>
+                            </div>
+                        </div>
+                    </el-form-item>
+
+                    <el-form-item label="区域名称:" prop="regionname">
+                        <div class="el-col el-col-18">
+                            <div class="el-input" style="width: 187px;">
+                                <el-input v-model="regionDiaForm.regionname">
+                                    <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                                </el-input>
+                            </div>
+                        </div>
+                    </el-form-item>
+
+                    <el-form-item label="区域级别:" prop="level">
+                        <el-col :span="18">
+                            <el-select v-model="regionDiaForm.level" style="width: 187px;"
+                                       filterable
+                                       @Change="levelChange"
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="level in levels"
+                                        :key="level.value"
+                                        :label="level.label"
+                                        :value="level.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="父区域:" prop="parentid">
+                        <el-col :span="18">
+                            <el-select v-model="regionDiaForm.parentid"
+                                       style="width: 187px;" clearable
+                                       filterable
+                                       :disabled="parentRegionDis"
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="parentid in parentRegions"
+                                        :key="parentid.value"
+                                        :label="parentid.label"
+                                        :value="parentid.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="详细地址:" prop="address">
+                        <el-col :span="18">
+                            <el-input v-model.number="regionDiaForm.address"  style="width: 187px;">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="备注:" prop="remarks">
+                        <el-col :span="18">
+                            <el-input v-model.number="regionDiaForm.remarks"  style="width: 187px;">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="resetForm('regionDiaForm') ">取 消</el-button>
+                    <el-button type="primary" @click="saveRegion('regionDiaForm')">确 定</el-button>
+                </div>
+            </el-dialog>
+        </div>
+    </div>
+</div>
+
+<script>
+    var vue = new Vue({
+        el:'#regionapp',
+        data:{
+            tableData:[],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            parentRegionDis:false,
+            regionform:{
+                regionname:''
+            },
+            dialogFormVisible: false,
+            dlgAllotDevVisible:false,
+            parentRegions:[],
+            levels:[],
+            regionDiaForm:{
+                regionid:'',
+                regionname:'',
+                level:'',
+                parentid:'',
+                address:'',
+                remarks:''
+            },
+            rules:{
+                regionid:[
+                    {required:true,message:'请输入区域编号',trigger:'blur'},
+                ],
+                regionname:[
+                    {required:true,message:'请输入区域名称',trigger:'blur'},
+                ],
+                level: [
+                    {required: true, message: '请选择区域级别', trigger: 'blur'}
+                ],
+                parentid: [
+                    {required: true, message: '请选择父区域', trigger: 'blur'}
+                ],
+                address: [
+                    {required: true, message: '请输入详细地址', trigger: 'blur'}
+                ]
+            },
+            regiontitile:'添加区域',
+        },
+        methods:{
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                commonQuery(this,this.regionform.regionname,this.currPage,val);
+                //console.log('每页条'+val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                commonQuery(this,this.regionform.regionname,this.currPage,this.pageSize);
+                //console.log('当前页:'+val);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            query:function(){
+                this.pagesize=10;
+                this.currPage=1;
+                commonQuery(this,this.regionform.regionname,this.currPage,this.pageSize);
+            },
+            addRegion:function () {
+                getFillData(this,"-1");
+                this.dialogFormVisible = true;
+                this.regiontitle="添加区域"
+            },
+            delRegion:function(regionid){
+                deletedata(regionid);
+            },
+            editRegion:function(regionid){
+                this.parentRegionDis=false;
+                getFillData(this,regionid);
+                this.dialogFormVisible = true;
+                this.regiontitile="修改区域"
+            },
+            resetForm: function (formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false;
+            },
+            saveRegion:function (formName) {
+                var _that=this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function(valid){
+                        if (valid){
+                            vali = true;
+                        }else{
+                            vali=false;
+                        }
+                    });
+                if (vali==true){
+                    saveData(_that,_that.regionDiaForm,formName);
+                }
+            },
+            levelChange: function (value) {
+                if (value == 0) {
+                    this.parentRegionDis = true;
+                } else  {
+                    this.parentRegionDis = false;
+                    getFregion(this,value);
+                }
+            },
+            levelform: function (row, column, cellValue) {
+                return row.level+"级";
+            }
+        },
+        created:function(){
+            var _self=this;
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:encodeURI("/system/loadRegionList?regionname="),
+                success:function(ret){
+                    //console.log(ret);
+                    _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                }
+            })
+        }
+    })
+
+    function refreshThisTable(){
+        $("#qrybtn").click();
+    };
+
+    function commonQuery(_self,regionname,pageno,pagesize){
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("/system/loadRegionList?regionname=" + regionname + "&pageNo=" + pageno + "&pageSize=" + pagesize),
+            success: function (ret) {
+                _self.totSize = ret.PageResult.totalCount;
+                _self.tableData = ret.PageResult.list;
+                if (_self.totSize == 0) {
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+            }
+        })
+    }
+
+    function deletedata(regionid){
+        layer.confirm('是否删除该区域', {icon: 3, title:'请确认',offset:'30%'},function(index){
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"/system/deleteRegion?regionid="+regionid,
+                success:function(ret){
+                    if(ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location="login";
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg('删除成功', {icon: 1, time: 1000});
+                        refreshThisTable();
+                    }
+                }
+            })
+        })
+    }
+
+
+    function getFillData(_self, id) {
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("/system/loadRegionForUpdate?regionid=" + id),
+            success: function (ret) {
+                var dictlist = [];
+                var parentlist = [];
+                var dict = ret.dicts;
+                for (var i = 0; i < dict.length; i++) {
+                    dictlist.push({
+                        value: dict[i]["dictval"],
+                        label: dict[i]["dictcaption"]
+
+                    });
+                }
+                _self.levels = dictlist;
+
+                if (ret.region != null) {
+                    _self.regionDiaForm.regionid = ret.region.regionid;
+                    _self.regionDiaForm.regionname = ret.region.regionname;
+                    _self.regionDiaForm.level = ret.region.level;
+                    _self.regionDiaForm.parentid = ret.region.parentid;
+                    _self.regionDiaForm.address = ret.region.address;
+                    if (ret.region.level == 0) {
+                        _self.parentRegionDis = true;
+                    }
+                    _self.regionDiaForm.remarks = ret.region.remarks;
+
+                }
+
+
+                var fRegion = ret.fRegion;
+                for (var j=0;j<fRegion.length;j++){
+                    parentlist.push({
+                        value:fRegion[j]["regionid"],
+                        label:fRegion[j]["regionname"]
+                    });
+                }
+
+                _self.parentRegions = parentlist;
+            }
+        })
+    }
+
+   /* function lookTree(){
+        alert(tree);
+    }*/
+
+
+    function saveData(_that,formdata,formName){
+        var url = null;
+        if(vue.regiontitile == "添加区域"){
+            url = encodeURI("/system/addRegion");
+        }
+        if(vue.regiontitile == "修改区域"){
+            url = encodeURI("/system/updateRegion")
+        }
+        var token=$("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data: JSON.stringify(formdata),
+            success: function (data) {
+                if (data.errStr != "") {
+                    layer.msg(data.errStr, {icon: 2,time:1000});
+                } else {
+                    layer.msg('保存信息成功!', {icon: 1,time:1000});
+                    refreshThisTable();
+                    _that.$refs[formName].resetFields();
+                    _that.dialogFormVisible = false;
+                }
+            }
+        });
+    }
+
+
+    function getFregion(_self,value){
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("/system/getFregion?level=" + value),
+            success: function (ret) {
+                var fList = [];
+                var parentRegion = ret.parentRegion;
+                for (var j=0;j<parentRegion.length;j++){
+                    fList.push({
+                        value:parentRegion[j]["regionid"],
+                        label:parentRegion[j]["regionname"]
+                    });
+                }
+
+                _self.parentRegions = fList;
+            }
+        })
+    }
+
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/role/func.html b/src/main/resources/templates/system/role/func.html
index 61cc1b1..48d1ecc 100755
--- a/src/main/resources/templates/system/role/func.html
+++ b/src/main/resources/templates/system/role/func.html
@@ -34,6 +34,7 @@
         admin.dgo('/role/func', {
             roleId: func,
         }, function (data) {
+            debugger
             layer.closeAll('loading');
             if (data.code == 200) {
                 initTree(data.node);
