区域选择框添加树形结构,下发名单功能添加Excel导入人员查询功能,角色添加功能数据重复问题修改,以及各个细节优化
diff --git a/build.gradle b/build.gradle
index 2fe4ee1..5df2cf7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -73,6 +73,7 @@
     implementation 'io.github.microutils:kotlin-logging:1.6.26'
     implementation 'org.slf4j:slf4j-parent:1.7.26'
     implementation 'redis.clients:jedis:2.9.3'
+    implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
     implementation group: 'commons-lang', name:'commons-lang',version: '2.5'
     implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
     implementation group: 'com.sun.jersey', name: 'jersey-client', version: '1.19'
diff --git a/src/main/java/com/supwisdom/dlpay/doorlist/bean/TCustomerNoExistInfo.java b/src/main/java/com/supwisdom/dlpay/doorlist/bean/TCustomerNoExistInfo.java
new file mode 100644
index 0000000..4bdb061
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/doorlist/bean/TCustomerNoExistInfo.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.doorlist.bean;

+

+public class TCustomerNoExistInfo {

+    private String cardno;

+    private String bankcardno;

+    private String custname;

+

+    public String getCardno() {

+        return cardno;

+    }

+

+    public void setCardno(String cardno) {

+        this.cardno = cardno;

+    }

+

+    public String getBankcardno() {

+        return bankcardno;

+    }

+

+    public void setBankcardno(String bankcardno) {

+        this.bankcardno = bankcardno;

+    }

+

+    public String getCustname() {

+        return custname;

+    }

+

+    public void setCustname(String custname) {

+        this.custname = custname;

+    }

+}

diff --git a/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java b/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
index a0ae378..28af857 100644
--- a/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
@@ -28,6 +28,7 @@
 import com.supwisdom.dlpay.system.page.Pagination;

 import com.supwisdom.dlpay.system.service.SystemService;

 import com.supwisdom.dlpay.util.RedisUtil;

+import com.supwisdom.dlpay.util.UploadExcelCardno;

 import org.slf4j.Logger;

 import org.slf4j.LoggerFactory;

 import org.springframework.beans.factory.annotation.Autowired;

@@ -464,6 +465,165 @@
     }

 

     /**

+     * 下发名单导入查询模板下载

+     * @param request

+     * @param response

+     * @return

+     */

+    @ResponseBody

+    @RequestMapping(value = "/exportExcelTemplet")

+    public Map exportExcelTemplet(HttpServletRequest request, HttpServletResponse response) {

+      Map map = new HashMap();

+        try {

+            List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();

+            /**

+             * 1. 设置列信息:name:列标题   key:	列属性

+             */

+            entity.add(new ExcelExportEntity("卡号(必须项)", "cardno"));

+            entity.add(new ExcelExportEntity("银行卡号(可选项)","bankcardno"));

+            entity.add(new ExcelExportEntity("姓名", "custname"));

+            List<Map> personList = new ArrayList<Map>();

+

+            /**

+             * 3.设置表格属性: title:标题  sheetName:工作簿名 type:表格类型

+             */

+            ExportParams params = new ExportParams(null, "sheet1", ExcelType.HSSF);

+//		params.setFreezeCol(2);

+            map.put(MapExcelConstants.MAP_LIST, personList);

+            map.put(MapExcelConstants.ENTITY_LIST, entity);

+            map.put(MapExcelConstants.PARAMS, params);

+            map.put(MapExcelConstants.FILE_NAME, "查询模板");//文件名

+            map.put("result", "导出excel文件完成");

+            PoiBaseView.render(map, request, response, MapExcelConstants.EASYPOI_MAP_EXCEL_VIEW);

+        } catch (Exception e) {

+            e.printStackTrace();

+            map.put("result", "导出excel文件失败");

+        }

+        return map;

+    }

+

+    /**

+     * 导入查询人员名单

+     * @param file

+     * @param request

+     * @return

+     */

+    @ResponseBody

+    @RequestMapping(value = "/addexcel", method = {RequestMethod.POST})

+    public Map addExcel(@RequestParam(value = "file", required = false, defaultValue = "") MultipartFile file,

+                           HttpServletRequest request) {

+        // 保存

+        Map map = new HashMap();

+        try {

+

+            String sheetName = request.getParameter("sheetname");

+            String path = request.getSession().getServletContext()

+                    .getRealPath("upload");

+

+            String fileName = file.getOriginalFilename();

+            //impTest(path+"\\"+fileName);

+            File targetFile = new File(path, fileName);

+            if (!targetFile.exists()) {

+                targetFile.mkdirs();

+            }

+            file.transferTo(targetFile);

+            map = importExcel(map, sheetName, targetFile);

+        } catch (Exception e) {

+            e.printStackTrace();

+        }

+        return map;

+    }

+

+

+    private Map importExcel(Map map, String sheetName, File targetFile) {

+        try {

+            @SuppressWarnings("unchecked")

+            List<List<String>> excelList = UploadExcelCardno.readExcel(targetFile, sheetName);//数据列

+            boolean sheetindex = true;

+            if (excelList == null) {

+                sheetindex = false;

+                map.put("sheetindex", sheetindex);

+                return map;

+            }

+            int sumNum = excelList.size();

+            int cardno = -1;

+            int bankcardno =-1;

+            int custnameNo = -1;

+            List columlst = excelList.get(0);

+            int i = 0;

+            boolean contentidex = true;

+            while (contentidex) {

+                columlst = excelList.get(i++);

+                int len = columlst.size();

+                for (int j = 0; j < len; j++) {

+                    if (columlst.get(j).toString().equals("卡号(必须项)")) {

+                        cardno = j;

+                        contentidex = false;

+                    }

+                    if (columlst.get(j).toString().equals("银行卡号(可选项)")){

+                        bankcardno = j;

+                        contentidex = false;

+                    }

+                    if (columlst.get(j).toString().equals("姓名")) {

+                        custnameNo = j;

+                        contentidex = false;

+                    }

+                }

+

+            }

+

+            boolean cardIndex = false;

+            int queryNum = 0;

+            int queryNoNum = 0;

+            List<TCustomerInfo> tCustomerInfos = new ArrayList<TCustomerInfo>();

+            List<TCustomerNoExistInfo> tCustomerNoExistInfos = new ArrayList<TCustomerNoExistInfo>();

+

+            for (; i < sumNum; i++) {

+                columlst = excelList.get(i);

+

+                String cardStr = columlst.get(cardno).toString();

+                String bankcardStr = columlst.get(bankcardno).toString();

+                cardIndex = false;

+                if (cardStr.length() > 0) {

+                    TCustomerInfo tCustomerInfo = webInterfaceService.getTCustomerByExcel(cardStr);

+                    if (tCustomerInfo == null) {

+                        cardIndex = true;

+                    } else {

+                        tCustomerInfos.add(tCustomerInfo);

+                        queryNum++;

+                    }

+                } else {

+                    cardIndex = true;

+                }

+                if (cardIndex) {

+                    queryNoNum++;

+                    TCustomerNoExistInfo tCustomerNoExistInfo = new TCustomerNoExistInfo();

+                    tCustomerNoExistInfo.setCardno(cardStr);

+                    if (bankcardno > 0){

+                        tCustomerNoExistInfo.setBankcardno(columlst.get(bankcardno).toString());

+                    }

+                    if (custnameNo > 0) {

+                        tCustomerNoExistInfo.setCustname(columlst.get(custnameNo).toString());

+                    }

+

+                    tCustomerNoExistInfos.add(tCustomerNoExistInfo);

+                }

+            }

+

+            map.put("queryNum", String.valueOf(queryNum));

+            map.put("queryNoNum", queryNoNum);

+            map.put("tCustomerInfos", tCustomerInfos);

+            map.put("tCustomerNoExistInfos", tCustomerNoExistInfos);

+            map.put("sheetindex", sheetindex);

+        } catch (Exception e) {

+            e.printStackTrace();

+        }

+        return map;

+

+    }

+

+

+    /**

      * 获取设备查询区域和楼栋填充列表

      * @param operUser

      * @return

diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
index af782a8..e5059e9 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
@@ -3,9 +3,13 @@
 import com.supwisdom.dlpay.framework.domain.TPermission;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.List;
+
 public interface PermissionDao extends JpaRepository<TPermission, String> {
 
     TPermission findByRoleIdAndResid(String roleId, Integer resid);
 
     void deleteByRoleId(String roleId);
+
+    List<TPermission> findByRoleId(String roleId);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/CustomerDao.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/CustomerDao.java
index 45bcc9b..eab430d 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/dao/CustomerDao.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/CustomerDao.java
@@ -13,4 +13,6 @@
 

     public List<TCustomerInfo> getAllTCustomerList(String perName, String cardno, String bankcardno);

 

+    public TCustomerInfo getTCustomerByExcel(String cardno);

+

 }

diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CustomerDaoImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CustomerDaoImpl.java
index c505a89..71230c1 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CustomerDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CustomerDaoImpl.java
@@ -75,4 +75,18 @@
         List<TCustomerInfo> list = query.getResultList();

         return list;

     }

+

+    @Transactional

+    @Override

+    public TCustomerInfo getTCustomerByExcel(String cardno) {

+        String sql = "select a.custid,a.custname,b.cardno,b.bankcardno,b.cardphyid,b.expiredate from t_customer a,t_card b  " +

+                " where a.custid = b.custid and b.status = '1' and cardno=?1 ";

+        Query query = entityManager.createNativeQuery(sql, TCustomerInfo.class);

+        query.setParameter(1, cardno);

+        List<TCustomerInfo> list = query.getResultList();

+        if (list!=null && list.size()>0){

+            return list.get(0);

+        }

+        return null;

+    }

 }

diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/DoordtlDaoImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/DoordtlDaoImpl.java
index 17111ec..5978855 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/DoordtlDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/DoordtlDaoImpl.java
@@ -56,7 +56,7 @@
                         + "select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  "

                         + ") select regionid from tmp  ) ";

             }

-            queryString += " order by a.transdate DESC";

+            queryString += " order by a.transdate DESC,doorseqno";

             Query query = entityManager.createNativeQuery(queryString, TDoordtlInfo.class);

             if (!startTranDate.equals("")) {

                 query.setParameter("startTranDate", startTranDate);

diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
index 0e75b4c..003a167 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
@@ -116,4 +116,8 @@
     //保存卡信息

     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})

     public boolean saveCard(TCard bean);

+

+    //根据excel卡号信息获取客户信息

+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})

+    public TCustomerInfo getTCustomerByExcel(String cardno);

 }

diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java
index cadb1d9..349a19f 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/service/impl/WebInterfaceServiceImpl.java
@@ -123,4 +123,9 @@
     public boolean saveCard(TCard bean) {

         return cardDao.saveCard(bean);

     }

+

+    @Override

+    public TCustomerInfo getTCustomerByExcel(String cardno) {

+        return customerDao.getTCustomerByExcel(cardno);

+    }

 }

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 63f2aee..653bbd8 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
@@ -192,7 +192,7 @@
             if (operUser.getOpertype().equals("L")){

                 regionBuildings = systemService.getBuildingOperBuildingByRegionId(regionid, operUser.getOperid());

             }else if(operUser.getOpertype().equals("H") && !StringUtil.isEmpty(operUser.getRegionid())){

-                regionBuildings = systemService.getBuildingByRegionId(operUser.getRegionid());

+                regionBuildings = systemService.getOperatorBuildingByRegionId(regionid,operUser.getRegionid());

             } else {

                 regionBuildings = systemService.getBuildingByRegionId(regionid);

             }

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 b7b8a4c..69195bc 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
@@ -48,7 +48,7 @@
         if(!devtype.equals("")){

             sql+=" and  devtype = :devtype ";

         }

-        sql+=" order by devtype";

+        sql+=" order by devtype,deviceid";

         Query query = entityManager.createNativeQuery(sql,TNcDevice.class);

 

         if(!devname.equals("")){

@@ -148,7 +148,7 @@
         if(!devtype.equals("")){

             sql+=" and  devtype = :devtype ";

         }

-        sql+=" order by devtype";

+        sql+=" order by devtype,deviceid";

         Query query = entityManager.createNativeQuery(sql,TNcDevice.class);

 

         if(!devname.equals("")){

@@ -242,7 +242,7 @@
         if(!devtype.equals("")){

             sql+=" and  bean.devtype = :devtype ";

         }

-        sql+=" order by devtype";

+        sql+=" order by devtype,deviceid";

         Query query = entityManager.createNativeQuery(sql,TNcDevice.class);

         query.setParameter("operid", operid);

         if(!devname.equals("")){

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 c9391ae..b17ccc3 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
@@ -6,8 +6,7 @@
  * TBuilding entity. @author MyEclipse Persistence Tools
  */
 @Entity
-@Table(name = "T_BUILDING",
-	indexes = {@Index(name = "idx_building_id",columnList = "buildingid",unique = true)})
+@Table(name = "T_BUILDING")
 public class TBuilding implements java.io.Serializable {
 
 	// Fields
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 8ba75db..e0bd051 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java
@@ -9,8 +9,7 @@
  */
 @Entity
 @Table(name = "T_NC_DEVICE",
-		indexes = {@Index(name = "idx_nc_dev_phyid", columnList = "devphyid"),
-				@Index(name = "idx_nc_dev_devid",columnList = "deviceid",unique = true)}
+		indexes = {@Index(name = "idx_nc_dev_phyid", columnList = "devphyid")}
 					)
 public class TNcDevice implements java.io.Serializable {
 
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 605449e..8116b13 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
@@ -284,7 +284,7 @@
                                    @AuthenticationPrincipal TOperator operUser){

         Map map = new HashMap();

         try {

-            TRegion region = systemService.getRegionById(regionid);

+            TRegion region = systemService.getRegionAllFlagById(regionid);

             map.put("region",region);

             List<TDictionaryId> dicts = systemService.findTDictionaryByType(6);//区域级别

             map.put("dicts", dicts);

@@ -348,7 +348,7 @@
             region.setRegionname(postData.getRegionname());

             region.setRemarks(postData.getRemarks());

             region.setParentname(tRegion.getRegionname());

-            region.setFlag(1);

+            region.setFlag("1");

 

             systemService.saveRegion(region);

             map.put("errStr", "");

@@ -378,7 +378,7 @@
                 map.put("errStr", "区域名称已经存在,请修改!");

                 return map;

             }

-            TRegion region = systemService.getRegionById(postData.getRegionid());

+            TRegion region = systemService.getRegionAllFlagById(postData.getRegionid());

             TRegion tRegion = systemService.getRegionById(postData.getParentid());

             region.setAddress(postData.getAddress());

             region.setLevel(tRegion.getLevel()+1);

@@ -386,9 +386,13 @@
             region.setRegionname(postData.getRegionname());

             region.setRemarks(postData.getRemarks());

             region.setParentname(tRegion.getRegionname());

-            region.setFlag(1);

+            region.setFlag("1");

 

             systemService.updateRegion(region);

+

+            //需修改区域表总此区域子区域的父区域名

+            systemService.updateParentnameById(postData.getRegionid(), postData.getRegionname());

+

             map.put("errStr", "");

         }catch (Exception e){

             e.printStackTrace();

diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java
index 404b11e..7519bd6 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/BuildingDao.java
@@ -44,5 +44,7 @@
 

     public List<TBuilding> getBuildingOperBuildings(String operid);

 

+    public List<TBuilding> getOperatorBuildingByRegionId(String regionid,String operRegionid);

+

     public List<TBuilding> getBuildingOperBuildingByRegionId(String regionid,String operid);

 }

diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java
index 780d39f..27a50a4 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/RegionDao.java
@@ -35,4 +35,6 @@
 

     public boolean updateRegion(TRegion bean);

 

+    public boolean updateParentnameById(String regionid,String parentname);

+

 }

diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java
index e8ab4eb..24ac1ec 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/BuildingDaoImpl.java
@@ -41,8 +41,8 @@
     @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' ";

+        String sql = "select bean.buildingid,bean.buildingname,bean.synctime,bean.updtime,case when bean.flag='A' then '有效' else '注销' end flag,bean.buildingdesc,bean.regionid " +

+                " from T_Building bean where 1>0 ";

         if (!StringUtil.isEmpty(regionid)){

             sql += "and bean.regionid in  " +

                     "( with recursive tmp as  ( select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr " +

@@ -79,7 +79,7 @@
 

 

     private int getSystemBuildingListCount(String regionid,String buildingname){

-        String sql = "select count(*) from T_Building bean where 1>0 and bean.flag='A' ";

+        String sql = "select count(*) from T_Building bean where 1>0 ";

         if (!StringUtil.isEmpty(regionid)){

             sql += "and bean.regionid in  " +

                     "(with recursive tmp as  (select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr " +

@@ -108,8 +108,8 @@
     @Transactional

     @Override

     public Pagination getOperatorBuildingList(String operRegionid, 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' ";

+        String sql = "select bean.buildingid,bean.buildingname,bean.synctime,bean.updtime,case when bean.flag='A' then '有效' else '注销' end flag,bean.buildingdesc,bean.regionid " +

+                " from T_Building bean where 1>0 ";

 

             sql += "and bean.regionid in  " +

                     "( with recursive tmp as  ( select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr " +

@@ -146,7 +146,7 @@
     }

 

     private int getOperatorBuildingListCount(String operRegionid, String regionid, String buildingname){

-        String sql = "select count(*) from T_Building bean where 1>0 and bean.flag='A' ";

+        String sql = "select count(*) from T_Building bean where 1>0 ";

 

             sql += "and bean.regionid in  " +

                     "(with recursive tmp as  (select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr " +

@@ -177,9 +177,9 @@
     @Override

     public Pagination getBuildingOperBuildingList(String regionid, String buildingname, String operid, int pageNo, int pageSize) {

         // 楼栋管理员regionid为空

-        String sql = "select bean.buildingid,bean.buildingname,bean.synctime,bean.updtime,bean.flag,bean.buildingdesc,bean.regionid "+

+        String sql = "select bean.buildingid,bean.buildingname,bean.synctime,bean.updtime,case when bean.flag='A' then '有效' else '注销' end flag,bean.buildingdesc,bean.regionid "+

                 " from T_Building bean left join T_operbuilding a on a.buildingid=bean.buildingid " +

-                " where 1>0 and bean.flag='A' and a.operid= :operid";

+                " where 1>0 and a.operid= :operid";

         if (!StringUtil.isEmpty(buildingname)){

             sql += " and bean.buildingname like :buildingname";

         }

@@ -203,7 +203,7 @@
 

     private int getBuildingOperBuildingListCount(String operid,String buildingname){

         String sql = "select count(*) from T_BUILDING bean left join T_operbuilding a on a.buildingid=bean.buildingid "+

-                "where 1>0 and bean.flag='A' and a.operid= :operid";

+                "where 1>0 and a.operid= :operid";

         if (!StringUtil.isEmpty(buildingname)){

             sql += " and bean.buildingname like :buildingname";

         }

@@ -405,6 +405,29 @@
 

     @Transactional

     @Override

+    public List<TBuilding> getOperatorBuildingByRegionId(String regionid, String operRegionid) {

+        String sql = "select bean.buildingid,bean.buildingname,bean.synctime,bean.updtime,bean.flag,bean.buildingdesc,bean.regionid" +

+                " from T_Building bean where bean.flag='A' "+

+                "and bean.regionid in  " +

+                "( with recursive tmp as  ( select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr " +

+                " where regionid= :regionid union all  select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid ) " +

+                "  select regionid from tmp  )";

+

+        Query query = entityManager.createNativeQuery(sql, TBuilding.class);

+        if (!StringUtil.isEmpty(regionid)) {

+            query.setParameter("regionid", regionid);

+        }else {

+            query.setParameter( "regionid", operRegionid);

+        }

+        List<TBuilding> list = query.getResultList();

+        if (list!=null && list.size()>0){

+            return list;

+        }

+        return null;

+    }

+

+    @Transactional

+    @Override

     public List<TBuilding> getBuildingOperBuildingByRegionId(String regionid,String operid) {

         String sql = "select bean.buildingid,bean.buildingname,bean.synctime,bean.updtime,bean.flag,bean.buildingdesc,bean.regionid" +

                 " from T_Building bean where bean.flag='A' "+

diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/ManagerDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/ManagerDaoImpl.java
index 991111f..5b394ba 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/ManagerDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/ManagerDaoImpl.java
@@ -25,7 +25,9 @@
     @Transactional

     @Override

     public Pagination getOperatorList(String operid, String realname, int pageNo, int pageSize) {

-        String sql = "select a.operid,a.opername,a.opercode,a.opertype,a.realname,case when a.status='normal' then '有效' else '注销' end status,a.regionid,a.mobile,a.foperid,c.roleid,c.rolename,d.regionname " +

+        String sql = "select a.operid,a.opername,a.opercode,case when a.opertype='P' then '超级管理员' when a.opertype='S' then '系统管理员' " +

+                " when a.opertype='H' then '区域管理员' when a.opertype='L' then '楼栋管理员' else a.opertype end opertype," +

+                "a.realname,case when a.status='normal' then '有效' else '注销' end status,a.regionid,a.mobile,a.foperid,c.roleid,c.rolename,d.regionname " +

                 " from Tb_Operator a " +

                 " left join tb_oper_role b on a.operid = b.operid " +

                 " left join tb_role c on b.roleid = c.roleid " +

@@ -97,7 +99,8 @@
     @Transactional

     @Override

     public Pagination getOperOperatorList(String operatorOperid, String operid, String realname, int pageNo, int pageSize) {

-        String sql = "select a.operid,a.opername,a.opercode,a.opertype,a.realname,case when a.status='normal' then '有效' else '注销' end status,a.regionid,a.mobile,a.foperid,c.roleid,c.rolename,d.regionname " +

+        String sql = "select a.operid,a.opername,a.opercode,case when a.opertype='P' then '超级管理员' when a.opertype='S' then '系统管理员' " +

+                " when a.opertype='H' then '区域管理员' when a.opertype='L' then '楼栋管理员' else a.opertype end opertype,a.realname,case when a.status='normal' then '有效' else '注销' end status,a.regionid,a.mobile,a.foperid,c.roleid,c.rolename,d.regionname " +

                 " from Tb_Operator a " +

                 " left join tb_oper_role b on a.operid = b.operid " +

                 " left join tb_role c on b.roleid = c.roleid " +

diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java
index 231b934..2ce8280 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/RegionDaoImpl.java
@@ -22,14 +22,16 @@
     @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 ";

+        String sql = "select bean.regionid,bean.address,bean.level,bean.parentid,bean.regionname,bean.remarks,bean.parentname," +

+                " case when bean.flag='1' then '有效' else '注销' end flag " +

+                " from TB_Region bean where 1>0 ";

         if (!StringUtil.isEmpty(regionname)){

             sql += " and bean.regionname like :regionname ";

         }

 

-        sql += " order by bean.level";

+        sql += " order by bean.level,bean.regionid";

 

-        TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);

+        Query query = entityManager.createNativeQuery(sql, TRegion.class);

         if(!StringUtil.isEmpty(regionname)){

             query.setParameter("regionname", "%"+regionname+"%" );

         }

@@ -47,7 +49,7 @@
     }

 

     private int getSystemRegionListCount(String regionname){

-        String sql = "select count(*) from TB_Region where 1>0 and flag=1 ";

+        String sql = "select count(*) from TB_Region where 1>0 ";

         if (!StringUtil.isEmpty(regionname)){

             sql += " and regionname like :regionname ";

         }

@@ -66,8 +68,9 @@
     @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 ";

+        String sql = "select bean.regionid,bean.address,bean.level,bean.parentid,bean.regionname,bean.remarks,bean.parentname," +

+                "case when bean.flag='1' then '有效' else '注销' end flag " +

+                " from Tb_Region bean where 1>0  ";

         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  " +

@@ -76,7 +79,7 @@
         if (!StringUtil.isEmpty(regionname)){

             sql += " and tmp.regionname like :regionname ";

         }

-        sql += ") order by bean.level";

+        sql += ") order by bean.level,bean.regionid";

 

         Query query = entityManager.createNativeQuery(sql, TRegion.class);

         query.setParameter("regionid" , regionid);

@@ -99,7 +102,7 @@
 

 

     private int getOperatorRegionListCount(String regionname,String regionid){

-        String sql = "select count(*) from Tb_Region bean where 1>0 and bean.flag=1 ";

+        String sql = "select count(*) from Tb_Region bean where 1>0 ";

         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  " +

@@ -127,7 +130,7 @@
     public boolean updateRegionFlag(String regionid) {

         boolean flag = false;

         try {

-            String sql = "update tb_region set flag = 0 where regionid = ?1 ";

+            String sql = "update tb_region set flag = '0' where regionid = ?1 ";

             Query query = entityManager.createNativeQuery(sql);

             query.setParameter(1, regionid);

             query.executeUpdate();

@@ -141,7 +144,7 @@
     @Transactional

     @Override

     public TRegion getRegionById(String regionid) {

-        String sql = "select bean from TRegion bean where bean.regionid = :regionid and bean.flag=1 ";

+        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();

@@ -168,11 +171,11 @@
     @Override

     public List<TRegion> getRegionListById(String regionid) {

         String sql = "select bean.regionid,bean.address,bean.level,bean.parentid,bean.regionname,bean.remarks,bean.parentname,bean.flag " +

-                "from TB_REGION bean where flag=1 "+

+                "from TB_REGION bean where flag='1' "+

                 "and bean.regionid in  " +

                 "(with recursive tmp as  (select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr " +

                 " where regionid= :regionid union all  select tbr.regionid,tbr.parentid,tbr.regionname from tb_region tbr inner join tmp t on t.regionid=tbr.parentid  " +

-                " ) select regionid from tmp  )";

+                " ) select regionid from tmp  ) order by bean.level";

         Query query = entityManager.createNativeQuery(sql, TRegion.class);

         query.setParameter("regionid", regionid);

         List list = query.getResultList();

@@ -184,7 +187,7 @@
     @Override

     public List<TRegion> getLowRegionListById(String regionid) {

         String sql = "select bean.regionid,bean.address,bean.level,bean.parentid,bean.regionname,bean.remarks,bean.parentname,bean.flag " +

-                "from TB_REGION bean where flag=1 "+

+                "from TB_REGION bean where flag='1' "+

                 "and bean.regionid <>:regionid 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  " +

@@ -199,7 +202,7 @@
     @Transactional

     @Override

     public List<TRegion> getRegionListByLevel(int level) {

-        String sql = "select bean from TRegion bean where bean.flag=1 and bean.level=: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();

@@ -213,7 +216,7 @@
     @Override

     public List<TRegion> getOperRegionListByLevel(int level, String regionid) {

         String sql = "select bean.regionid,bean.address,bean.level,bean.parentid,bean.regionname,bean.remarks,bean.parentname,bean.flag " +

-                "from TB_REGION bean where flag=1 and bean.level = :level "+

+                "from TB_REGION bean where flag='1' and bean.level = :level "+

                 " 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  " +

@@ -231,7 +234,7 @@
     @Transactional

     @Override

     public List<TRegion> getAllRegions() {

-        String sql = "select bean from TRegion bean where bean.flag = 1";

+        String sql = "select bean from TRegion bean where bean.flag = '1' order by bean.level";

         TypedQuery<TRegion> query = entityManager.createQuery(sql, TRegion.class);

         List<TRegion> list = query.getResultList();

         if (list!=null && list.size()>0){

@@ -293,6 +296,22 @@
         return flag;

     }

 

+    @Transactional

+    @Override

+    public boolean updateParentnameById(String regionid, String parentname) {

+        boolean flag = false;

+        try{

+            String sql = "update tb_region a set parentname=:parentname where parentid=:regionid ";

+            Query query = entityManager.createNativeQuery(sql);

+            query.setParameter("regionid", regionid);

+            query.setParameter("parentname", parentname);

+            query.executeUpdate();

+            flag = true;

+        }catch (Exception e){

+            e.printStackTrace();

+        }

+        return flag;

+    }

 

 

 }

diff --git a/src/main/java/com/supwisdom/dlpay/system/domain/TRegion.java b/src/main/java/com/supwisdom/dlpay/system/domain/TRegion.java
index 449e79e..449fce3 100644
--- a/src/main/java/com/supwisdom/dlpay/system/domain/TRegion.java
+++ b/src/main/java/com/supwisdom/dlpay/system/domain/TRegion.java
@@ -3,8 +3,7 @@
 import javax.persistence.*;

 

 @Entity

-@Table(name = "TB_REGION",

-    indexes = {@Index(name = "idx_region_id",columnList = "regionid",unique = true)})

+@Table(name = "TB_REGION")

 public class TRegion {

     private String regionid;

     private String address;

@@ -13,7 +12,7 @@
     private String regionname;

     private String remarks;

     private String parentname;

-    private Integer flag;

+    private String flag;

 

     @Id

     @Column(name = "REGIONID", unique = true, nullable = false, scale = 0)

@@ -79,16 +78,16 @@
         this.parentname = parentname;

     }

 

-    @Column(name = "FLAG")

-    public Integer getFlag() {

+    @Column(name = "FLAG",length = 1)

+    public String getFlag() {

         return flag;

     }

 

-    public void setFlag(Integer flag) {

+    public void setFlag(String flag) {

         this.flag = flag;

     }

 

-    public TRegion(String regionid, String address, Integer level, String parentid, String regionname, String remarks, String parentname, Integer flag) {

+    public TRegion(String regionid, String address, Integer level, String parentid, String regionname, String remarks, String parentname, String flag) {

         this.regionid = regionid;

         this.address = address;

         this.level = level;

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 d486fbd..84949a5 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/SystemService.java
@@ -54,6 +54,10 @@
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})

     public List<TBuilding> getBuildingByRegionId(String regionid);

 

+    //根据区域id查询区域管理员权限下楼栋

+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})

+    public List<TBuilding> getOperatorBuildingByRegionId(String regionid,String operRegionid);

+

     //根据区域id查询楼栋管理员权限下楼栋

     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})

     public List<TBuilding> getBuildingOperBuildingByRegionId(String regionid,String operid);

@@ -106,6 +110,10 @@
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})

     public boolean updateRegion(TRegion bean);

 

+    //根据区域id修改其子区域的父区域名

+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})

+    public boolean updateParentnameById(String regionid,String parentname);

+

     //获取区域树形数据

     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})

     public List<RegionZTreeNodes> getAllRegionTreeList();

diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
index a02ee7c..ace0e19 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
@@ -133,30 +133,62 @@
         return permissionDao.findByRoleIdAndResid(roleFuncId, resid);
     }
 
+
+    private TPermission findOrNewPermission(List<TPermission> exists, String roleId, Integer resId) {
+        for (TPermission item : exists) {
+            if (resId.equals(item.getResid())) {
+                return item;
+            }
+        }
+
+        TPermission perm = new TPermission();
+        perm.setRoleId(roleId);
+        perm.setResid(resId);
+        return perm;
+    }
+
+    private TRoleFunction findOrNewRoleFunction(List<TRoleFunction> exists, String roleId, Integer funcId) {
+        for (TRoleFunction item : exists) {
+            if (funcId.equals(item.getFunctionId())) {
+                return item;
+            }
+        }
+        TRoleFunction func = new TRoleFunction();
+        func.setFunctionId(funcId);
+        func.setRoleId(roleId);
+        return func;
+    }
+
     @Override
     public JsonResult saveRoleFuncId(String roleId, String funcs) {
         Optional<TRole> ret = roleDao.findById(roleId);
-        if (ret == null || !ret.isPresent()) {
+        if (!ret.isPresent()) {
             return JsonResult.error("角色不存在");
         }
-        roleFunctionDao.deleteByRoleId(roleId);
-        permissionDao.deleteByRoleId(roleId);
+        List<TRoleFunction> functions = roleFunctionDao.findByRoleId(roleId);
+        List<TPermission> permissions = permissionDao.findByRoleId(roleId);
+        ArrayList<TRoleFunction> retainFuncs = new ArrayList<>();
+        ArrayList<TPermission> retainPerms = new ArrayList<>();
         String[] datas = funcs.split(",");
         for (String func : datas) {
             if (func.contains("_res")) {
                 String id = func.replace("_res", "");
-                TPermission permission = new TPermission();
-                permission.setResid(Integer.valueOf(id));
-                permission.setRoleId(roleId);
-                permissionDao.save(permission);
+                retainPerms.add(findOrNewPermission(permissions, roleId, Integer.parseInt(id)));
             } else {
                 if ("-1".equals(func)) continue; //全选排除
-                TRoleFunction roleFunction = new TRoleFunction();
-                roleFunction.setFunctionId(Integer.valueOf(func));
-                roleFunction.setRoleId(roleId);
-                roleFunctionDao.save(roleFunction);
+                retainFuncs.add(findOrNewRoleFunction(functions, roleId, Integer.parseInt(func)));
             }
         }
+        // functions
+        functions.removeAll(retainFuncs);
+        if (functions.size() > 0)
+            roleFunctionDao.deleteAll(functions);
+        roleFunctionDao.saveAll(retainFuncs);
+        // permissions
+        permissions.removeAll(retainPerms);
+        if (permissions.size() > 0)
+            permissionDao.deleteAll(permissions);
+        permissionDao.saveAll(retainPerms);
         return JsonResult.ok("成功");
     }
 
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 e6f818e..f0a8aa1 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
@@ -93,6 +93,11 @@
     }

 

     @Override

+    public List<TBuilding> getOperatorBuildingByRegionId(String regionid, String operRegionid) {

+        return buildingDao.getOperatorBuildingByRegionId(regionid,operRegionid);

+    }

+

+    @Override

     public List<TBuilding> getBuildingOperBuildingByRegionId(String regionid,String operid) {

         return buildingDao.getBuildingOperBuildingByRegionId(regionid, operid);

     }

@@ -158,6 +163,11 @@
     }

 

     @Override

+    public boolean updateParentnameById(String regionid, String parentname) {

+        return regionDao.updateParentnameById(regionid, parentname);

+    }

+

+    @Override

     public List<RegionZTreeNodes> getAllRegionTreeList() {

         List<RegionZTreeNodes> regionZTreeNodesList = new ArrayList<>();

         List<TRegion> regions = regionDao.getAllRegions();

diff --git a/src/main/java/com/supwisdom/dlpay/util/UploadExcelCardno.java b/src/main/java/com/supwisdom/dlpay/util/UploadExcelCardno.java
new file mode 100644
index 0000000..f59ce0e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/UploadExcelCardno.java
@@ -0,0 +1,88 @@
+package com.supwisdom.dlpay.util;
+
+import jxl.Cell;
+import jxl.Sheet;
+import jxl.Workbook;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class UploadExcelCardno {
+
+	public static List readExcel(File file,String sheetName) throws Exception{
+		Workbook rwb = null;
+		InputStream  is = null;
+		List<List<String>> biglist = new ArrayList<List<String>>();
+//		String cardno = "";
+		List<String> cardno = new ArrayList<String>();
+		List<String> deviceid = new ArrayList<>();
+		try {
+			// 构建Workbook对象, 只读Workbook对象
+			// 直接从本地文件创建Workbook
+			// 从输入流创建
+			is = new FileInputStream(file);
+			rwb = Workbook.getWorkbook(is);
+			// Sheet(术语:工作表)就是Excel表格左下角的Sheet1,Sheet2,Sheet3但在程序中Sheet的下标是从0开始
+			// 获取第一张Sheet表
+//			Sheet rs = rwb.getSheet(0);
+			Sheet rs = rwb.getSheet(sheetName);
+			System.out.println(rs);
+			if(rs==null){
+				return null;
+			}
+			// 获取Sheet表中所包含的总列数
+			int rsColumns = rs.getColumns();
+			// 获取Sheet表中所包含的总行数
+			int rsRows = rs.getRows();
+			// 获取指定单元格的对象引用
+			List<String> colnames = new ArrayList<String>();
+			int cardIndex = 0;
+			for (int j = 0; j < rsColumns; j++) {
+				Cell cell = rs.getCell(j, 0);
+				String colname = cell.getContents();
+				if(("卡号").equals(colname)){
+					cardIndex = j;
+				}
+				colnames.add(cell.getContents());
+			}
+			
+			biglist.add(colnames);
+			// **从第二行开始读取数据 这里默认从第2行开始读取
+			for (int i = 1; i < rsRows; i++) {
+				List<String> smalllist = new ArrayList<String>();
+				boolean flag = false;
+				for (int j = 0; j < rsColumns; j++) {
+					Cell cell = rs.getCell(j, i);
+					smalllist.add(cell.getContents());
+					if (cell.getContents() != null
+							&& !"".equals(cell.getContents())) {
+						flag = true;
+					}
+					if(j == cardIndex){
+						cardno.add(cell.getContents());
+					}
+				}
+				if (flag) {
+					biglist.add(smalllist);
+				}
+			}
+			return biglist;
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (rwb != null) {
+				rwb.close();
+			}
+			try {
+				is.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return biglist;
+	}	
+}
diff --git a/src/main/resources/templates/doorlist/addDoorlist.html b/src/main/resources/templates/doorlist/addDoorlist.html
index fec24fd..053d412 100644
--- a/src/main/resources/templates/doorlist/addDoorlist.html
+++ b/src/main/resources/templates/doorlist/addDoorlist.html
@@ -41,10 +41,17 @@
                                     <el-col :span="3"  :offset="3">
                                         <el-button size="small" style="height:24px; line-height:9px;overflow:hidden;width:100%;" type="primary" @click="person_searchPerson">&nbsp;搜索&nbsp;</el-button>
                                     </el-col>
+                                    <el-col :span="3"  :offset="2">
+                                        <el-button type="warning" size="small" style="height:24px; line-height:9px;overflow:hidden; " onclick="javascript:document.getElementById('addDoorlist_importquery').scrollIntoView()" @click="open3">导入选择人员</el-button>
+                                    </el-col>
                                 </el-col>
                             </el-row>
                         </el-col>
+
+
                     </div>
+
+
                 <!--</div>-->
 
                 <div id="addDoorlist_personSel">
@@ -170,10 +177,15 @@
                                 stripe
                                 border>
                             <el-table-column
+                                    sortable
                                     prop="cardno"
                                     label="卡号">
                             </el-table-column>
                             <el-table-column
+                                    prop="bankcardno"
+                                    label="银行卡号">
+                            </el-table-column>
+                            <el-table-column
                                     sortable
                                     prop="custname"
                                     label="姓名">
@@ -187,17 +199,18 @@
                         备注&nbsp;:<el-input size="small" v-model="person_reason" style="width: 40%" placeholder="输入下发设备名单的原因等备注信息"></el-input>
                     </div>
                 </div>
-                <!--<div style="float:left;border-top:solid 1px #e0e0e0; width:100%; height:30px; margin-top:10px;padding-top:10px;  font-size: 14px!important;">
-                    <form action="${pageContext.request.contextPath}/doorlistMgr/addexcel" method="post" style="width: 60%;float:left;" id="addDoorlist_uploadExcelId" name="formUpload" enctype="multipart/form-data" target="_top">
-                        表单:<el-input size="small" v-model="per_sheetname" name="sheetname" style="width: 30%;"></el-input>
+
+                <div id="addDoorlist_importquery" style="float:left;border-top:solid 1px #e0e0e0; width:100%; height:30px; margin-top:10px;padding-top:10px;  font-size: 14px!important;">
+                    <form action="/door/doorlistMgr/addexcel" method="post" style="width: 60%;float:left;" id="addDoorlist_uploadExcelId" name="formUpload" enctype="multipart/form-data" target="_top">
+                        导入查询并选择人员:<el-input size="small" v-model="per_sheetname" name="sheetname" style="width: 20%;"></el-input>
                         <el-button size="small" type="primary" @click="person_openExcel">打开Excel<i class="el-icon-upload el-icon&#45;&#45;right"></i></el-button>
                         文件路径:<el-input size="small" v-model="textfield" name="textfield" style="width: 30%;"></el-input>
-                        <input type="file" name="file" style="display: none" id="filePath" onchange="addDoorlist_vue.textfield=this.value" />
+                        <input type="file" name="file" style="display: none" id="addDoorlist_filePath" onchange="addDoorlist_vue.textfield=this.value" />
                     </form>
-                    <el-button size="small"  type="primary" @click="person_inExcel">导入查询</el-button>
-                    <el-button size="small" type="primary" id="addDoorlist_perImportBack" style="display: none" @click="perImporReturn">返回</el-button>
-                    <el-button size="small" type="primary" @click="downloadExcel">导入模板下载</el-button>
-                </div>-->
+                    <el-button style="margin-top: 3px;" size="small"  type="el-button el-button--success" @click="person_inExcel">导入查询</el-button>
+                    <el-button size="small" type="danger" id="addDoorlist_perImportBack" style="display: none" @click="perImporReturn">返回</el-button>
+                    <el-button size="small" type="success" plain @click="downloadExcel">导入模板下载</el-button>
+                </div>
 
                 <div class="layui-row layui-col-space15">
                 <div style="float:left;margin:0px 0 0 47%;"><el-button style="margin-top: 12px;" @click="per_nextStep">下一步</el-button></div>
@@ -278,18 +291,26 @@
                                 </el-col>
                                 <el-col :span="6" >
                                     区域:
-                                    <el-select v-model="device.regionid" size="mini" @Change="regionChange" clearable placeholder="请选择">
+                                   <!-- <el-select v-model="device.regionid" size="mini" @Change="regionChange" clearable placeholder="请选择">
                                         <el-option
                                                 v-for="regionid in regions"
                                                 :key="regionid.value"
                                                 :label="regionid.label"
                                                 :value="regionid.value">
                                         </el-option>
-                                    </el-select>
+                                    </el-select>-->
+                                    <el-cascader
+                                                 v-model="device.regionvalue"
+                                                 :options="regionoptions"
+                                                 :show-all-levels="false"
+                                                 clearable
+                                                 filterable change-on-select
+                                                 @change="handleChange">
+                                    </el-cascader>
                                 </el-col>
                                 <el-col :span="6" >
                                     楼栋:
-                                    <el-select v-model="device.buildingid" size="mini" clearable placeholder="请选择">
+                                    <el-select v-model="device.buildingid"  clearable placeholder="请选择">
                                         <el-option
                                                 v-for="buildingid in buildings"
                                                 :key="buildingid.value"
@@ -299,11 +320,11 @@
                                     </el-select>
                                 </el-col>
                                 <el-col :span="6">
-                                    <el-col :span="7"><lable>设备名称:</lable></el-col>
-                                    <el-col :span="14"><el-input placeholder="请输入内容" size="mini" v-model="device.deviceName" ></el-input></el-col>
+                                    <el-col :span="6" style="margin-top: 6px">设备名称:</el-col>
+                                    <el-col :span="17"><el-input placeholder="请输入设备名称"  v-model="device.deviceName" ></el-input></el-col>
                                 </el-col>
                                 <el-col :span="2">
-                                    <el-button size="mini" type="primary" @click="seachDevice">&nbsp;&nbsp;搜索&nbsp;&nbsp;</el-button>
+                                    <el-button  type="primary" @click="seachDevice">&nbsp;搜索&nbsp;</el-button>
                                 </el-col>
                             </el-row>
                         </el-col>
@@ -574,7 +595,7 @@
                         <el-button size="small" style="line-height:10px;overflow:hidden;height: 23px;margin-top: 3px;" type="primary" @click="rePush">继续下发设备名单</el-button>
                     </div>
                     <div style="margin:10px 0 0 200px; ">
-                        该设备名单的部分明细内容:人员 <span style="color:#f60" id="postSuc_perNum" v-if="addDoorlist_vue">{{addDoorlist_vue.person_righttable.length}}</span>个, <!--+ parseInt(addDoorlist_vue.personSel_excelNum)}}</span>个,-->
+                        该设备名单的部分明细内容:人员 <span style="color:#f60" id="postSuc_perNum" v-if="addDoorlist_vue">{{addDoorlist_vue.person_righttable.length+ parseInt(addDoorlist_vue.personSel_excelNum)}}</span>个,
                         设备<span style="color:#f60" id="postSuc_devNum" v-if="addDoorlist_vue">{{addDoorlist_vue.devSel_allocated.length}}</span>个,
                         时间周<span style="color:#f60" id="postSuc_timeNum" v-if="addDoorlist_vue">{{addDoorlist_vue.timeTags.length}}</span>个。
                     </div>
@@ -652,11 +673,14 @@
             device:{
                 deviceName:'',
                 regionid:'',
+                regionvalue:[],
+                Rregionid:'',
                 buildingid:'',
             },
             dev_addBtn_dis:true,
             dev_delBtn_dis:true,
             regions:[],
+            regionoptions:[],
             buildings:[],
             devSel_allocated:[],
             //时间周选择部分
@@ -817,7 +841,7 @@
             },
             seachDevice:function(){
                 var url = "[[@{/doorlistMgr/getAllTDevgroupdtlList?}]]"+
-                    "deviceName="+addDoorlist_vue.device.deviceName+"&regionid="+addDoorlist_vue.device.regionid
+                    "deviceName="+addDoorlist_vue.device.deviceName+"&regionid="+addDoorlist_vue.device.Rregionid
                         +"&buildingid="+addDoorlist_vue.device.buildingid +"&usetype=MJ";
                 addDoorlist_fillDevice_lefttable(url);
                 addDoorlist_vue.usetype='MJ';
@@ -961,6 +985,29 @@
                 this.device.buildingid='';
                 addDoorlist_getRegionBuilding(this,value);
             },
+            handleChange(value) {
+                if (value.length > 0) {
+                    this.device.Rregionid = value[value.length - 1]
+                } else {
+                    this.device.Rregionid = ''
+                }
+                console.log(this.device.Rregionid);
+
+                this.buildings = [];
+                this.device.buildingid = '';
+                if (this.device.Rregionid == '') {
+                    addDoorlist_getRegionBuilding(this, '0');
+                } else {
+                    addDoorlist_getRegionBuilding(this, this.device.Rregionid);
+                }
+            },
+            open3:function() {
+                this.$notify.info({
+                    title: '导入说明',
+                    message: '1.请先下载模板,根据要求填写信息。2.主要根据填写卡号进行名单查询,不存在的名单将会进行显示,查询到的名单则直接被选择,可进行下一步操作。3.一次导入名单推荐在1000条以内。',
+                    duration: 20000
+                });
+            },
 
         },
         created:function(){
@@ -1088,10 +1135,11 @@
                         type:      'post',
                         headers: {
                             'Accept': 'application/json',
-                            'Content-Type': 'application/json',
-                            'X-CSRF-TOKEN':token,
+                            'X-CSRF-TOKEN': token,
                         },
                         dataType:  'json',
+                        processData:false,
+                        contentType: false,
                         success:function(data){
 
                             if(data.sheetindex == false){
@@ -1156,6 +1204,8 @@
                         value: regiondata[i].regionid
                     });
                 }
+                //级联选择器区域数据填充
+                addDoorlist_vue.regionoptions = addDoorlist_getTreeData(ret.regions) ;
             }
 
             var buildinglist=[];
@@ -1257,6 +1307,64 @@
             }
         })
     }
+
+    function addDoorlist_getTreeData(regionlst){
+        var f = [];
+
+        //获取第一级
+        for(var i=0;i<regionlst.length;i++){
+            if(regionlst[i].parentid == '0'){
+                f.push({
+                    value:regionlst[i].regionid,
+                    label:regionlst[i].regionname,
+                })
+            }
+        }
+        if(f.length>0){
+            //获取第二级
+            addDoorlist_pushRegion(regionlst,f);
+        }else {
+            f.push({
+                value:regionlst[0].regionid,
+                label:regionlst[0].regionname,
+            })
+            //获取第二级
+            addDoorlist_pushRegion(regionlst,f);
+        }
+        addDoorlist_cyclePushRegion(f,regionlst)
+        return f;
+    }
+
+    function addDoorlist_pushRegion(regionlst,pRe){
+        for(var i in regionlst){
+            for(var j in pRe){
+                if(regionlst[i].parentid == pRe[j].value){
+                    if (pRe[j].children==undefined){
+                        pRe[j].children=[]
+                    }
+                    pRe[j].children.push({
+                        value:regionlst[i].regionid,
+                        label:regionlst[i].regionname,
+                    })
+                }
+            }
+        }
+    }
+
+    function addDoorlist_cyclePushRegion(fList,regionlst){
+        for (var i in fList){
+            var s = fList[i].children;
+            if (s!=undefined && s.length>0){
+                addDoorlist_pushRegion(regionlst,s);
+            }
+            for (j in s) {
+                var l = s[j].children;
+                if (l!=undefined && l.length>0){
+                    addDoorlist_cyclePushRegion(s,regionlst)
+                }
+            }
+        }
+    }
 </script>
 
 <style>
diff --git a/src/main/resources/templates/doorlist/deleteDoorlist.html b/src/main/resources/templates/doorlist/deleteDoorlist.html
index eb3aa73..742b47a 100644
--- a/src/main/resources/templates/doorlist/deleteDoorlist.html
+++ b/src/main/resources/templates/doorlist/deleteDoorlist.html
@@ -28,14 +28,22 @@
 
                     <el-col :span="8">
                         <el-form-item label="区域">
-                            <el-select v-model="deleteDoorForm.regionid" placeholder="请选择">
+                            <!--<el-select v-model="deleteDoorForm.regionid" placeholder="请选择">
                                 <el-option
                                         v-for="regionid in regions"
                                         :key="regionid.value"
                                         :label="regionid.label"
                                         :value="regionid.value">
                                 </el-option>
-                            </el-select>
+                            </el-select>-->
+                            <el-cascader
+                                         v-model="deleteDoorForm.regionvalue"
+                                         :options="regionoptions"
+                                         :show-all-levels="false"
+                                         clearable
+                                         filterable change-on-select
+                                         @change="handleChange">
+                            </el-cascader>
                         </el-form-item>
                     </el-col>
 
@@ -189,6 +197,8 @@
                 allocatStartDate: '',
                 custname: '',
                 regionid: '',
+                regionvalue:[],
+                Rregionid:'',
                 devname: '',
                 allocatEndDate: '',
                 cardno: '',
@@ -196,6 +206,7 @@
                 operflag: '',
             },
             regions: [],
+            regionoptions:[],
             syncflags: [],
             operFlags: [],
             dialogFormVisible: false,
@@ -259,6 +270,22 @@
             },
             handleSelect: function (val) {
                 this.selectList = val;
+            },
+            handleChange(value) {
+                if (value.length > 0) {
+                    this.deleteDoorForm.Rregionid = value[value.length - 1]
+                } else {
+                    this.deleteDoorForm.Rregionid = ''
+                }
+                console.log(this.deleteDoorForm.Rregionid);
+
+                /*this.buildings = [];
+                this.deleteDoorForm.buildingid = '';
+                if (this.deleteDoorForm.Rregionid == '') {
+                    deleteDoorlist_getRegionBuilding(this, '0');
+                } else {
+                    deleteDoorlist_getRegionBuilding(this, this.deleteDoorForm.Rregionid);
+                }*/
             }
         },
         created: function () {
@@ -327,7 +354,7 @@
         }
         var url = "[[@{/doorlistMgr/getAllCardListFrDelete?}]]" + "allocatStartDate=" + startStr + "&allocatEndDate=" + endStr +
             "&devname=" + deleteDoor.devname + "&custname=" + deleteDoor.custname
-            + "&cardno=" + deleteDoor.cardno + "&regionid=" + deleteDoor.regionid
+            + "&cardno=" + deleteDoor.cardno + "&regionid=" + deleteDoor.Rregionid
             + "&syncflag=" + deleteDoor.syncflag + "&usetype=MJ" +
             "&pageNo=" + pageno + "&pageSize=" + pagesize + "&operflag=" + deleteDoor.operflag;
         var token=$("meta[name='_csrf_token']").attr("value");
@@ -417,6 +444,8 @@
                             label: regions[i].regionname
                         })
                     }
+                    //级联选择器区域数据填充
+                    deleteDoorlist_vue.regionoptions = deleteDoorlist_getTreeData(data.regions) ;
                 }
 
                 var operDicts = [];
@@ -441,4 +470,64 @@
             }
         })
     }
+
+
+    function deleteDoorlist_getTreeData(regionlst){
+        var f = [];
+
+        //获取第一级
+        for(var i=0;i<regionlst.length;i++){
+            if(regionlst[i].parentid == '0'){
+                f.push({
+                    value:regionlst[i].regionid,
+                    label:regionlst[i].regionname,
+                })
+            }
+        }
+        if(f.length>0){
+            //获取第二级
+            deleteDoorlist_pushRegion(regionlst,f);
+        }else {
+            f.push({
+                value:regionlst[0].regionid,
+                label:regionlst[0].regionname,
+            })
+            //获取第二级
+            deleteDoorlist_pushRegion(regionlst,f);
+        }
+        deleteDoorlist_cyclePushRegion(f,regionlst)
+        return f;
+    }
+
+    function deleteDoorlist_pushRegion(regionlst,pRe){
+        for(var i in regionlst){
+            for(var j in pRe){
+                if(regionlst[i].parentid == pRe[j].value){
+                    if (pRe[j].children==undefined){
+                        pRe[j].children=[]
+                    }
+                    pRe[j].children.push({
+                        value:regionlst[i].regionid,
+                        label:regionlst[i].regionname,
+                    })
+                }
+            }
+        }
+    }
+
+    function deleteDoorlist_cyclePushRegion(fList,regionlst){
+        for (var i in fList){
+            var s = fList[i].children;
+            if (s!=undefined && s.length>0){
+                deleteDoorlist_pushRegion(regionlst,s);
+            }
+            for (j in s) {
+                var l = s[j].children;
+                if (l!=undefined && l.length>0){
+                    deleteDoorlist_cyclePushRegion(s,regionlst)
+                }
+            }
+        }
+    }
+
 </script>
\ No newline at end of file
diff --git a/src/main/resources/templates/doorlist/searchDoorlist.html b/src/main/resources/templates/doorlist/searchDoorlist.html
index c1a0db4..0ac6719 100644
--- a/src/main/resources/templates/doorlist/searchDoorlist.html
+++ b/src/main/resources/templates/doorlist/searchDoorlist.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>
@@ -77,7 +77,7 @@
 
                     <el-col :span="8">
                         <el-form-item label="区域">
-                            <el-select v-model="searchDoorForm.regionid"
+                            <!--<el-select v-model="searchDoorForm.regionid"
                                        @Change="regionChange"
                                        placeholder="请选择">
                                 <el-option
@@ -86,7 +86,15 @@
                                         :label="regionid.label"
                                         :value="regionid.value">
                                 </el-option>
-                            </el-select>
+                            </el-select>-->
+                            <el-cascader
+                                         v-model="searchDoorForm.regionvalue"
+                                         :options="regionoptions"
+                                         :show-all-levels="false"
+                                         clearable
+                                         filterable change-on-select
+                                         @change="handleChange">
+                            </el-cascader>
                         </el-form-item>
                     </el-col>
 
@@ -252,9 +260,12 @@
                 syncflag: '',
                 operflag: '',
                 buildingid: '',
-                regionid:''
+                regionid:'',
+                regionvalue:[],
+                Rregionid:'',
             },
             regions:[],
+            regionoptions:[],
             buildings:[],
             syncFlag: [],
             operFlag: [],
@@ -351,6 +362,22 @@
                 } else {
                     return row.operflag;
                 }
+            },
+            handleChange(value) {
+                if (value.length > 0) {
+                    this.searchDoorForm.Rregionid = value[value.length - 1]
+                } else {
+                    this.searchDoorForm.Rregionid = ''
+                }
+                console.log(this.searchDoorForm.Rregionid);
+
+                this.buildings = [];
+                this.searchDoorForm.buildingid = '';
+                if (this.searchDoorForm.Rregionid == '') {
+                    searchDoorlist_getRegionBuilding(this, '0');
+                } else {
+                    searchDoorlist_getRegionBuilding(this, this.searchDoorForm.Rregionid);
+                }
             }
         },
         created: function () {
@@ -401,6 +428,8 @@
                                 label: region[i]["regionname"]
                             })
                         }
+                        //级联选择器区域数据填充
+                        searchDoorlist_vue.regionoptions = searchDoorlist_getTreeData(data.regions) ;
                     }
 
                     var buildinglist = [];
@@ -449,6 +478,64 @@
         return fmt;
     }
 
+    function searchDoorlist_getTreeData(regionlst){
+        var f = [];
+
+        //获取第一级
+        for(var i=0;i<regionlst.length;i++){
+            if(regionlst[i].parentid == '0'){
+                f.push({
+                    value:regionlst[i].regionid,
+                    label:regionlst[i].regionname,
+                })
+            }
+        }
+        if(f.length>0){
+            //获取第二级
+            searchDoorlist_pushRegion(regionlst,f);
+        }else {
+            f.push({
+                value:regionlst[0].regionid,
+                label:regionlst[0].regionname,
+            })
+            //获取第二级
+            searchDoorlist_pushRegion(regionlst,f);
+        }
+        searchDoorlist_cyclePushRegion(f,regionlst)
+        return f;
+    }
+
+    function searchDoorlist_pushRegion(regionlst,pRe){
+        for(var i in regionlst){
+            for(var j in pRe){
+                if(regionlst[i].parentid == pRe[j].value){
+                    if (pRe[j].children==undefined){
+                        pRe[j].children=[]
+                    }
+                    pRe[j].children.push({
+                        value:regionlst[i].regionid,
+                        label:regionlst[i].regionname,
+                    })
+                }
+            }
+        }
+    }
+
+    function searchDoorlist_cyclePushRegion(fList,regionlst){
+        for (var i in fList){
+            var s = fList[i].children;
+            if (s!=undefined && s.length>0){
+                searchDoorlist_pushRegion(regionlst,s);
+            }
+            for (j in s) {
+                var l = s[j].children;
+                if (l!=undefined && l.length>0){
+                    searchDoorlist_cyclePushRegion(s,regionlst)
+                }
+            }
+        }
+    }
+
 
     function searchDoorlist_commonQuery(_self, searchDoor, pageno, pagesize) {
         var startStr = '';
@@ -467,7 +554,7 @@
             + "&cardno=" + searchDoor.cardno
             + "&syncflag=" + searchDoor.syncflag +
             "&pageNo=" + pageno + "&pageSize=" + pagesize + "&operflag=" + searchDoor.operflag
-            + "&buildingid=" + searchDoor.buildingid+"&regionid=" +searchDoor.regionid;
+            + "&buildingid=" + searchDoor.buildingid+"&regionid=" +searchDoor.Rregionid;
         var token=$("meta[name='_csrf_token']").attr("value");
         $.ajax({
             type: "POST",
diff --git a/src/main/resources/templates/ncmgr/nc_dev.html b/src/main/resources/templates/ncmgr/nc_dev.html
index c1a1308..947dc98 100644
--- a/src/main/resources/templates/ncmgr/nc_dev.html
+++ b/src/main/resources/templates/ncmgr/nc_dev.html
@@ -45,7 +45,7 @@
                         <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-select v-model="devform.regionid"
+                            <!--<el-select v-model="devform.regionid"
                                        filterable
                                        clearable
                                        @Change="regionChange"
@@ -56,7 +56,15 @@
                                         :label="regionid.label"
                                         :value="regionid.value">
                                 </el-option>
-                            </el-select>
+                            </el-select>-->
+                            <el-cascader style="width:163px"
+                                         v-model="devform.regionvalue"
+                                         :options="regionoptions"
+                                         :show-all-levels="false"
+                                         clearable
+                                         filterable change-on-select
+                                         @change="handleChange">
+                            </el-cascader>
                         </div>
                     </div>
                 </div>
@@ -129,6 +137,17 @@
                             :formatter="typeform">
                     </el-table-column>
                     <el-table-column
+                            prop="operflag"
+                            label="状态"
+                            width="90"
+                            :formatter="operform">
+                        <!--<template scope="scope">
+                            <el-tag :type="scope.row.operflag === '有效' ? 'success' : 'danger'" close-transition>
+                                {{scope.row.operflag}}
+                            </el-tag>
+                        </template>-->
+                    </el-table-column>
+                    <el-table-column
                             prop="buildingname"
                             label="设备所在楼栋"
                             width="140">
@@ -149,17 +168,7 @@
                             width="120"
                             :formatter="flagform">
                     </el-table-column>
-                    <el-table-column
-                            prop="operflag"
-                            label="状态"
-                            width="90"
-                            :formatter="operform">
-                        <!--<template scope="scope">
-                            <el-tag :type="scope.row.operflag === '有效' ? 'success' : 'danger'" close-transition>
-                                {{scope.row.operflag}}
-                            </el-tag>
-                        </template>-->
-                    </el-table-column>
+
                     <el-table-column
                             prop="synctime"
                             label="同步时间"
@@ -181,13 +190,13 @@
                                     @click="editDev(scope.row.deviceid)">编辑
                             </button>
                             <button type="button" class="btn btn-danger btn-xs" title="删除设备"
-                                    @click="delDev(scope.row.deviceid)">删除
+                                    @click="delDev(scope.row.deviceid)" v-if="scope.row.operflag=='A'">删除
                             </button>
                             <button type="button" class="btn btn-warning btn-xs" title="名单清空"
-                                    @click="listClean(scope.row.deviceid)" v-if="scope.row.devtype=='R'">清空
+                                    @click="listClean(scope.row.deviceid)" v-if="scope.row.devtype=='R' && scope.row.operflag=='A'">清空
                             </button>
                             <button type="button" class="btn btn-success btn-xs" title="名单重下"
-                                    @click="listReload(scope.row.deviceid)" v-if="scope.row.devtype=='R'">重下
+                                    @click="listReload(scope.row.deviceid)" v-if="scope.row.devtype=='R' && scope.row.operflag=='A'">重下
                             </button>
                         </template>
                     </el-table-column>
@@ -368,9 +377,12 @@
                 devname: '',
                 buildingid: '',
                 devtype: '',
-                regionid:''
+                regionid:'',
+                regionvalue:[],
+                Rregionid:'',
             },
             regions:[],
+            regionoptions:[],
             regionsfill:[],
             buildings:[],
             buildingsfill:[],
@@ -509,7 +521,7 @@
                 this.buildings=[];
                 this.devform.buildingid='';
                 dev_getRegionBuilding(this,value);
-                if (this.devform.regionid==''){
+                if (this.devform.Rregionid==''){
                     dev_getRegionBuilding(this,'0');
                 }
             },
@@ -581,6 +593,22 @@
                 if (row.updtime != null) {
                     return dev_timeformatter(row.updtime);
                 }
+            },
+            handleChange(value) {
+                if (value.length > 0) {
+                    this.devform.Rregionid = value[value.length - 1]
+                } else {
+                    this.devform.Rregionid = ''
+                }
+                console.log(this.devform.Rregionid);
+
+                this.buildings = [];
+                this.devform.buildingid = '';
+                if (this.devform.Rregionid == '') {
+                    dev_getRegionBuilding(this, '0');
+                } else {
+                    dev_getRegionBuilding(this, this.devform.Rregionid);
+                }
             }
 
         },
@@ -611,6 +639,9 @@
                                 label: rt[j].regionname
                             });
                         }
+
+                        //级联选择器区域数据填充
+                        dev_vue.regionoptions = dev_getTreeData(ret.regions) ;
                     }
 
 
@@ -646,12 +677,72 @@
                     dev_vue.regions = uows;
                     dev_vue.buildings = rows;
 
+
+
                 }
             })
         }
 
     })
 
+    function dev_getTreeData(regionlst){
+        var f = [];
+
+        //获取第一级
+        for(var i=0;i<regionlst.length;i++){
+            if(regionlst[i].parentid == '0'){
+                f.push({
+                    value:regionlst[i].regionid,
+                    label:regionlst[i].regionname,
+                })
+            }
+        }
+        if(f.length>0){
+            //获取第二级
+            dev_pushRegion(regionlst,f);
+        }else {
+            f.push({
+                value:regionlst[0].regionid,
+                label:regionlst[0].regionname,
+            })
+            //获取第二级
+            dev_pushRegion(regionlst,f);
+        }
+        dev_cyclePushRegion(f,regionlst)
+        return f;
+    }
+
+    function dev_pushRegion(regionlst,pRe){
+        for(var i in regionlst){
+            for(var j in pRe){
+                if(regionlst[i].parentid == pRe[j].value){
+                    if (pRe[j].children==undefined){
+                        pRe[j].children=[]
+                    }
+                    pRe[j].children.push({
+                        value:regionlst[i].regionid,
+                        label:regionlst[i].regionname,
+                    })
+                }
+            }
+        }
+    }
+
+    function dev_cyclePushRegion(fList,regionlst){
+        for (var i in fList){
+            var s = fList[i].children;
+            if (s!=undefined && s.length>0){
+                dev_pushRegion(regionlst,s);
+            }
+            for (j in s) {
+                var l = s[j].children;
+                if (l!=undefined && l.length>0){
+                    dev_cyclePushRegion(s,regionlst)
+                }
+            }
+        }
+    }
+
     function dev_timeformatter(time) {
 
         return time.substr(0, 4) + '-' + time.substr(4, 2) + '-' + time.substr(6, 2) + ' '
@@ -663,7 +754,7 @@
         $.ajax({
             type: "get",
             dataType: "json",
-            url: encodeURI("[[@{/ncmgr/loadDevList?devname=}]]" + rolename.devname + "&pageNo=" + pageno + "&pageSize=" + pagesize + "&buildingid=" + rolename.buildingid + "&devtype=" + rolename.devtype+"&regionid="+rolename.regionid),
+            url: encodeURI("[[@{/ncmgr/loadDevList?devname=}]]" + rolename.devname + "&pageNo=" + pageno + "&pageSize=" + pagesize + "&buildingid=" + rolename.buildingid + "&devtype=" + rolename.devtype+"&regionid="+rolename.Rregionid),
             success: function (ret) {
                 _self.totSize = ret.PageResult.totalCount;
                 _self.tableData = ret.PageResult.list;
@@ -883,6 +974,7 @@
     }
 
     function dev_getRegionBuilding(_self,value){
+        console.log(value)
         $.ajax({
             type: "get",
             dataType: "json",
diff --git a/src/main/resources/templates/query/tdoorstream.html b/src/main/resources/templates/query/tdoorstream.html
index 4929723..0878a51 100644
--- a/src/main/resources/templates/query/tdoorstream.html
+++ b/src/main/resources/templates/query/tdoorstream.html
@@ -45,7 +45,7 @@
                         <label class="control-label" style="margin-right:10px;font-size: 14px;width:80px">区域:
                         </label>
                         <el-form-item >
-                            <el-select style="width:193px" v-model="tdoorstream.regionid"
+                            <!--<el-select style="width:193px" v-model="tdoorstream.regionid"
                                        @Change="regionChange"
                                        placeholder="请选择">
                                 <el-option
@@ -54,7 +54,16 @@
                                         :label="regionid.label"
                                         :value="regionid.value">
                                 </el-option>
-                            </el-select>
+                            </el-select>-->
+
+                            <el-cascader style="width:193px"
+                                         v-model="tdoorstream.regionvalue"
+                                         :options="regionoptions"
+                                         :show-all-levels="false"
+                                         clearable
+                                         filterable change-on-select
+                                         @change="handleChange">
+                            </el-cascader>
                         </el-form-item>
                     </el-col>
 
@@ -182,6 +191,7 @@
             tlist:[],
             buildings:[],
             regions:[],
+            regionoptions:[],
             dtlstatus:[],
             currentRow : null,
             tdoorstream : {
@@ -191,7 +201,9 @@
                 devname:'',
                 buildingid:'',
                 dtlStatus:'all',
-                regionid:''
+                regionid:'',
+                regionvalue:[],
+                Rregionid:'',
             },
         },
         methods : {
@@ -247,6 +259,22 @@
                 this.tdoorstream.buildingid='';
                 tdoorstream_getRegionBuilding(this,value);
             },
+            handleChange(value) {
+                if (value.length > 0) {
+                    this.tdoorstream.Rregionid = value[value.length - 1]
+                } else {
+                    this.tdoorstream.Rregionid = ''
+                }
+                console.log(this.tdoorstream.Rregionid);
+
+                this.buildings = [];
+                this.tdoorstream.buildingid = '';
+                if (this.tdoorstream.Rregionid == '') {
+                    tdoorstream_getRegionBuilding(this, '0');
+                } else {
+                    tdoorstream_getRegionBuilding(this, this.tdoorstream.Rregionid);
+                }
+            }
         },
         created : function() {
             this.loading=true;
@@ -285,6 +313,8 @@
                                 label: region[i]["regionname"]
                             })
                         }
+                        //级联选择器区域数据填充
+                        _self.regionoptions = tdoorstream_getTreeData(ret.regions) ;
                     }
 
                     var buildinglist = [];
@@ -309,6 +339,64 @@
 
     })
 
+    function tdoorstream_getTreeData(regionlst){
+        var f = [];
+
+        //获取第一级
+        for(var i=0;i<regionlst.length;i++){
+            if(regionlst[i].parentid == '0'){
+                f.push({
+                    value:regionlst[i].regionid,
+                    label:regionlst[i].regionname,
+                })
+            }
+        }
+        if(f.length>0){
+            //获取第二级
+            tdoorstream_pushRegion(regionlst,f);
+        }else {
+            f.push({
+                value:regionlst[0].regionid,
+                label:regionlst[0].regionname,
+            })
+            //获取第二级
+            tdoorstream_pushRegion(regionlst,f);
+        }
+        tdoorstream_cyclePushRegion(f,regionlst)
+        return f;
+    }
+
+    function tdoorstream_pushRegion(regionlst,pRe){
+        for(var i in regionlst){
+            for(var j in pRe){
+                if(regionlst[i].parentid == pRe[j].value){
+                    if (pRe[j].children==undefined){
+                        pRe[j].children=[]
+                    }
+                    pRe[j].children.push({
+                        value:regionlst[i].regionid,
+                        label:regionlst[i].regionname,
+                    })
+                }
+            }
+        }
+    }
+
+    function tdoorstream_cyclePushRegion(fList,regionlst){
+        for (var i in fList){
+            var s = fList[i].children;
+            if (s!=undefined && s.length>0){
+                tdoorstream_pushRegion(regionlst,s);
+            }
+            for (j in s) {
+                var l = s[j].children;
+                if (l!=undefined && l.length>0){
+                    tdoorstream_cyclePushRegion(s,regionlst)
+                }
+            }
+        }
+    }
+
 
     function tdoorstream_downloadExcel(_self, Ustarttransdate,Uendtransdate) {
         var factoryid = _self.tdoorstream.factoryid;
@@ -344,7 +432,7 @@
         var custname = _self.tdoorstream.custname;
         var buildingid = _self.tdoorstream.buildingid;
         var devname = _self.tdoorstream.devname;
-        var regionid = _self.tdoorstream.regionid;
+        var regionid = _self.tdoorstream.Rregionid;
         var dtlStatus = _self.tdoorstream.dtlStatus;
         //console.log(factoryid);
         $.ajax({
diff --git a/src/main/resources/templates/system/building.html b/src/main/resources/templates/system/building.html
index 792ac49..369b890 100644
--- a/src/main/resources/templates/system/building.html
+++ b/src/main/resources/templates/system/building.html
@@ -9,15 +9,25 @@
     <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="col-md-4" >
                     <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" clearable placeholder="请选择"
-                            > <el-option v-for="item in regionlist"
+                            <!--<el-select style="width:193px"
+                                       v-model="buildingform.regionid" clearable placeholder="请选择">
+                                <el-option v-for="item in regionlist"
                                          :key="item.value" :label="item.label" :value="item.value">
-                            </el-option> </el-select>
+                                </el-option>
+                            </el-select>-->
+
+                            <el-cascader style="width:163px"
+                                    v-model="buildingform.regionvalue"
+                                    :options="regionoptions"
+                                    :show-all-levels="false"
+                                    clearable
+                                    filterable change-on-select
+                                    @change="handleChange">
+                            </el-cascader>
                         </div>
                     </div>
                 </div>
@@ -68,6 +78,17 @@
                             width="150">
                     </el-table-column>
                     <el-table-column
+                            prop="flag"
+                            sortable
+                            label="状态"
+                            width="90">
+                        <template scope="scope">
+                            <el-tag :type="scope.row.flag === '有效' ? 'success' : 'danger'" close-transition>
+                                {{scope.row.flag}}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
                             prop="updtime"
                             label="更新时间"
                             min-width="180"
@@ -87,7 +108,7 @@
                                     @click="editBuilding(scope.row.buildingid)">编辑
                             </button>
                             <button type="button" class="btn btn-danger btn-xs" title="删除"
-                                    @click="delBuilding(scope.row.buildingid)">删除
+                                    @click="delBuilding(scope.row.buildingid)" v-if="scope.row.flag == '有效'">删除
                             </button>
                         </template>
                     </el-table-column>
@@ -160,6 +181,7 @@
             currentRow: null,
             buildingidDis:false,
             regionlist:[],
+            regionoptions:[],
             regions:[],
             dialogFormVisible: false,
             buildingtitle:'',
@@ -172,6 +194,8 @@
             buildingform:{
                 regionid:'',
                 buildingname:'',
+                regionvalue:[],
+                Rregionid:'',
             },
 
             rules: {
@@ -192,11 +216,11 @@
         methods: {
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                building_commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,val);
+                building_commonQuery(this,this.buildingform.Rregionid,this.buildingform.buildingname,this.currPage,val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                building_commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,this.pageSize);
+                building_commonQuery(this,this.buildingform.Rregionid,this.buildingform.buildingname,this.currPage,this.pageSize);
             },
             currRowChange:function(val) {
                 this.currentRow = val;
@@ -204,7 +228,7 @@
             query:function () {
                 this.pagesize=10;
                 this.currPage=1;
-                building_commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,this.pageSize);
+                building_commonQuery(this,this.buildingform.Rregionid,this.buildingform.buildingname,this.currPage,this.pageSize);
             },
             addBuilding:function () {
                 building_getFillData(this,"-1");
@@ -250,6 +274,14 @@
                 if (row.updtime != null) {
                     return building_timeformatter(row.updtime);
                 }
+            },
+            handleChange(value) {
+                if (value.length>0){
+                    this.buildingform.Rregionid = value[value.length-1]
+                }else {
+                    this.buildingform.Rregionid=''
+                }
+                console.log(this.buildingform.Rregionid);
             }
         },
         created:function(){
@@ -276,18 +308,80 @@
                             });
                         }
                         building_vue.regionlist = rows;
+
+                        //级联选择器区域数据填充
+                        building_vue.regionoptions =building_getTreeData(ret.regionList) ;
                     }
                 }
             })
         }
     })
 
-    function building_commonQuery(_self,regionid,buildingname,pageno,pagesize) {
+
+    function building_getTreeData(regionlst){
+        var f = [];
+
+        //获取第一级
+        for(var i=0;i<regionlst.length;i++){
+            if(regionlst[i].parentid == '0'){
+                f.push({
+                    value:regionlst[i].regionid,
+                    label:regionlst[i].regionname,
+                })
+            }
+        }
+        if(f.length>0){
+            //获取第二级
+            building_pushRegion(regionlst,f);
+        }else {
+            f.push({
+                value:regionlst[0].regionid,
+                label:regionlst[0].regionname,
+            })
+            //获取第二级
+            building_pushRegion(regionlst,f);
+        }
+        building_cyclePushRegion(f,regionlst)
+        return f;
+    }
+
+    function building_pushRegion(regionlst,pRe){
+        for(var i in regionlst){
+            for(var j in pRe){
+                if(regionlst[i].parentid == pRe[j].value){
+                    if (pRe[j].children==undefined){
+                        pRe[j].children=[]
+                    }
+                    pRe[j].children.push({
+                        value:regionlst[i].regionid,
+                        label:regionlst[i].regionname,
+                    })
+                }
+            }
+        }
+    }
+
+    function building_cyclePushRegion(fList,regionlst){
+        for (var i in fList){
+            var s = fList[i].children;
+            if (s!=undefined && s.length>0){
+                building_pushRegion(regionlst,s);
+            }
+            for (j in s) {
+                var l = s[j].children;
+                if (l!=undefined && l.length>0){
+                    building_cyclePushRegion(s,regionlst)
+                }
+            }
+        }
+    }
+
+    function building_commonQuery(_self,Rregionid,buildingname,pageno,pagesize) {
         $.ajax({
             type:"get",
             dataType:"json",
             url:encodeURI("[[@{/system/loadBuildingList?regionid=}]]"
-                +regionid+"&buildingname="+buildingname
+                +Rregionid+"&buildingname="+buildingname
                 +"&pageNo="+pageno+"&pageSize="+pagesize),
             success:function(ret){
                 _self.totSize=ret.pageResult.totalCount;
@@ -382,7 +476,7 @@
 
 
     function building_refreshThisTable(){
-        building_commonQuery(building_vue,building_vue.buildingform.regionid,building_vue.buildingform.buildingname,building_vue.currPage,building_vue.pageSize);
+        building_commonQuery(building_vue,building_vue.buildingform.Rregionid,building_vue.buildingform.buildingname,building_vue.currPage,building_vue.pageSize);
     };
 
     function building_timeformatter(time) {
diff --git a/src/main/resources/templates/system/operator.html b/src/main/resources/templates/system/operator.html
index 96bac81..bec77f8 100644
--- a/src/main/resources/templates/system/operator.html
+++ b/src/main/resources/templates/system/operator.html
@@ -70,8 +70,14 @@
                     <el-table-column
                             prop="opertype"
                             label="操作员类别"
-                            width="140"
-                            :formatter="typeform">
+                            sortable
+                            width="130">
+                        <template scope="scope">
+                            <el-tag type="success" v-if="scope.row.opertype=='楼栋管理员'">{{scope.row.opertype}}</el-tag>
+                            <el-tag type="info" v-if="scope.row.opertype=='区域管理员'">{{scope.row.opertype}}</el-tag>
+                            <el-tag type="warning" v-if="scope.row.opertype=='系统管理员'">{{scope.row.opertype}}</el-tag>
+                            <el-tag type="danger" v-if="scope.row.opertype=='超级管理员'">{{scope.row.opertype}}</el-tag>
+                        </template>
                     </el-table-column>
                     <el-table-column
                             prop="rolename"
@@ -106,9 +112,9 @@
                         <template scope="scope">
                             <button type="button" class="btn btn-info btn-xs" title="编辑操作员" @click="editOperator(scope.row.operid)">编辑</button>
                             <button type="button" class="btn btn-success btn-xs" title="重置密码" @click="resetPwd(scope.row.operid)">重置</button>
-                            <button type="button" class="btn btn-danger btn-xs" title="删除操作员" @click="delOperator(scope.row.operid)" v-if="scope.row.opertype!='S' ">删除</button>
+                            <button type="button" class="btn btn-danger btn-xs" title="删除操作员" @click="delOperator(scope.row.operid)" v-if="scope.row.opertype!='系统管理员' && scope.row.opertype!='超级管理员' && scope.row.status=='有效'">删除</button>
                             <button type="button" class="btn btn-info btn-xs" title="分配楼栋"
-                                    @click="allotBuilding(scope.row.operid,scope.row.opername)" v-if="scope.row.opertype=='L'">分配楼栋
+                                    @click="allotBuilding(scope.row.operid,scope.row.opername)" v-if="scope.row.opertype=='楼栋管理员'">分配楼栋
                             </button>
                         </template>
                     </el-table-column>
@@ -408,23 +414,6 @@
                     this.regionDis = true;
                 }
             },
-            typeform: function (row) {
-                if (row.opertype == 'P') {
-                    return '超级管理员';
-                }
-                else if (row.opertype == 'S') {
-                    return '系统管理员';
-                }
-                else if (row.opertype == 'H') {
-                    return '区域管理员';
-                }
-                else if (row.opertype == 'L') {
-                    return '物业管理员';
-                }
-                else {
-                    return row.opertype;
-                }
-            },
             resetPwd:function (operid) {
                 oper_resetpwd(operid);
             },
diff --git a/src/main/resources/templates/system/region.html b/src/main/resources/templates/system/region.html
index 2e60a61..4e7fc7e 100644
--- a/src/main/resources/templates/system/region.html
+++ b/src/main/resources/templates/system/region.html
@@ -39,9 +39,10 @@
                         border
                         style="width: 100%">
                     <el-table-column
+                            sortable
                             prop="regionid"
                             label="区域编号"
-                            width="140">
+                            width="120">
                     </el-table-column>
                     <el-table-column
                             prop="regionname"
@@ -66,6 +67,17 @@
                             width="200">
                     </el-table-column>
                     <el-table-column
+                            prop="flag"
+                            sortable
+                            label="状态"
+                            width="90">
+                        <template scope="scope">
+                            <el-tag :type="scope.row.flag === '有效' ? 'success' : 'danger'" close-transition>
+                                {{scope.row.flag}}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
                             prop="remarks"
                             label="备注"
                             width="180">
@@ -75,7 +87,7 @@
                             width="130">
                         <template scope="scope">
                             <button type="button" class="btn btn-info btn-xs" title="编辑" @click="editRegion(scope.row.regionid)" v-if="scope.row.regionid!='0'">编辑</button>
-                            <button type="button" class="btn btn-danger btn-xs" title="删除" @click="delRegion(scope.row.regionid)" v-if="scope.row.regionid!='0'">删除</button>
+                            <button type="button" class="btn btn-danger btn-xs" title="删除" @click="delRegion(scope.row.regionid)" v-if="scope.row.regionid!='0' && scope.row.flag=='有效'">删除</button>
                         </template>
                     </el-table-column>
                 </el-table>
diff --git a/src/main/resources/templates/system/role/func.html b/src/main/resources/templates/system/role/func.html
index 48d6dff..8599d55 100755
--- a/src/main/resources/templates/system/role/func.html
+++ b/src/main/resources/templates/system/role/func.html
@@ -39,7 +39,7 @@
                 initTree(data.node);

             } else if (data.code == 401) {

                 layer.msg(data.msg, {icon: 2, time: 1500}, function () {

-                    location.replace('/login');

+                    location.replace('/door/login');

                 }, 1000);

                 return;

             } else {