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 99c59f9..7c17c48 100644
--- a/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/doorlist/controller/DoorlistMgrController.java
@@ -18,7 +18,6 @@
 import com.supwisdom.dlpay.mainservice.bean.TDoorcardlstInfo;
 import com.supwisdom.dlpay.mainservice.domain.TCard;
 import com.supwisdom.dlpay.mainservice.domain.TCustomer;
-import com.supwisdom.dlpay.mainservice.domain.TKey;
 import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
 import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.ncmgr.domain.TNcAllottime;
@@ -28,7 +27,6 @@
 import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
 import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
 import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
-import com.supwisdom.dlpay.system.bean.PayApiConfig;
 import com.supwisdom.dlpay.system.domain.TDictionaryId;
 import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.domain.TSystemParam;
@@ -49,7 +47,6 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
 import java.io.File;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -64,6 +61,10 @@
 
     private static final String impcustomeFirstTime = "IMPCUSTOME_FIRST_TIME";
 
+    private static final String payapiAppid = "PAYAPI_APPID";
+
+    private static final String payapiSecret = "PAYAPI_SECRET";
+
     protected static Logger logger = LoggerFactory.getLogger(DoorlistMgrController.class);
 
     @Autowired
@@ -349,8 +350,6 @@
       return map;
     }
 
-    @Autowired
-    private PayApiConfig payApiConfig;
 
     @Autowired
     private ApiLoginProxy apiLoginProxy;
@@ -373,8 +372,10 @@
       return map;
     }
     try {
-      String appid = payApiConfig.getAppid();
-      String secret = payApiConfig.getSecret();
+        TSystemParam appidSystemParam = systemService.getSystemParamByKey(payapiAppid);
+        String appid = appidSystemParam.getParamValue();
+        TSystemParam secretSystemParam = systemService.getSystemParamByKey(payapiSecret);
+        String secret = secretSystemParam.getParamValue();
       ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
       helper.login(appid, secret);
 
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
index c280e6e..3bb36f2 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
@@ -61,4 +61,11 @@
     public List<TDoordevInfo> getBuildingOperDevList(String devname,String regionid,String buildingid,String operid);
 
     public void updateBuildingnameByBuildingid(String buildingid,String buildingname);
+
+    public Pagination getAllRemoteDev(String devname, int pageNo, int pageSize, String buildingid,String regionid);
+
+    public Pagination getOperateRemoteDev(String devname, int pageNo, int pageSize, String buildingid,String regionid,String operRegionid);
+
+    public Pagination getBuildingOperRemoteDev(String devname, int pageNo, int pageSize, String buildingid,String regionid,String operid);
+
 }
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 bdbc13c..1a16206 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
@@ -5,6 +5,7 @@
 import com.supwisdom.dlpay.ncmgr.dao.NcDeviceDao;
 import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.system.bean.DevRemoteBean;
 import com.supwisdom.dlpay.system.domain.TRegion;
 import com.supwisdom.dlpay.system.page.Pagination;
 import org.springframework.stereotype.Repository;
@@ -694,4 +695,231 @@
         query.setParameter("buildingname" ,buildingname );
         query.executeUpdate();
     }
+
+    @Transactional
+    @Override
+    public Pagination getAllRemoteDev(String devname, int pageNo, int pageSize, String buildingid, String regionid) {
+        String sql = "select a.deviceid,a.devname,b.regionname,a.buildingname from t_nc_device a, tb_region b " +
+                "  where a.regionid = b.regionid and a.devtype='R' ";
+        if(!devname.equals("")){
+            sql+=" and a.devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+=" and  a.buildingid = :buildingid ";
+        }
+        if (!regionid.equals("")){
+            sql += " and b.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  )";
+        }
+        sql +=" order by deviceid";
+        Query query = entityManager.createNativeQuery(sql, DevRemoteBean.class);
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+        if (!("").equals(regionid)){
+            query.setParameter("regionid", regionid);
+        }
+
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TNcDevice> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getAllRemoteDevCount(devname, buildingid, regionid);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getAllRemoteDevCount(String devname,String buildingid,String regionid){
+        String sql = "select count(*) from t_nc_device a, tb_region b " +
+                " where a.regionid = b.regionid and a.devtype='R' ";
+        if(!devname.equals("")){
+            sql+=" and a.devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+=" and  a.buildingid = :buildingid ";
+        }
+        if (!regionid.equals("")){
+            sql += " and b.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);
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+        if (!("").equals(regionid)){
+            query.setParameter("regionid", regionid);
+        }
+        List list = query.getResultList();
+        int cnt = 0;
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public Pagination getOperateRemoteDev(String devname, int pageNo, int pageSize, String buildingid, String regionid, String operRegionid) {
+        String sql = "select a.deviceid,a.devname,b.regionname,a.buildingname from t_nc_device a, tb_region b " +
+                "  where a.regionid = b.regionid and a.devtype='R' ";
+        if(!devname.equals("")){
+            sql+=" and a.devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+=" and  a.buildingid = :buildingid ";
+        }
+            sql += " and b.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  )";
+
+        sql+=" order by deviceid";
+        Query query = entityManager.createNativeQuery(sql,DevRemoteBean.class);
+
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+        if (!("").equals(regionid)){
+            query.setParameter("regionid", regionid);
+        }else {
+            query.setParameter("regionid", operRegionid);
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TNcDevice> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getOperateRemoteDevCount(devname, buildingid, regionid, operRegionid);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getOperateRemoteDevCount(String devname,String buildingid,String regionid,String operRegionid){
+        String sql = "select count(*) from t_nc_device a, tb_region b " +
+                " where a.regionid = b.regionid and a.devtype='R' ";
+        if(!devname.equals("")){
+            sql+=" and a.devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+=" and  a.buildingid = :buildingid ";
+        }
+            sql += " and b.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);
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+        if (!("").equals(regionid)){
+            query.setParameter("regionid", regionid);
+        }else {
+            query.setParameter("regionid", operRegionid);
+        }
+        List list = query.getResultList();
+        int cnt = 0;
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public Pagination getBuildingOperRemoteDev(String devname, int pageNo, int pageSize, String buildingid, String regionid, String operid) {
+        String sql = "select a.deviceid,a.devname,b.regionname,a.buildingname from t_nc_device a, tb_region b, t_operbuilding c " +
+                " where a.regionid = b.regionid and a.devtype='R' and a.buildingid=c.buildingid and c.operid=:operid ";
+        if(!devname.equals("")){
+            sql+=" and bean.devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+=" and  bean.buildingid = :buildingid ";
+        }
+        sql+=" order by deviceid";
+        Query query = entityManager.createNativeQuery(sql,DevRemoteBean.class);
+        query.setParameter("operid", operid);
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TNcDevice> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getBuildingOperRemoteDevCount(devname, buildingid,operid);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getBuildingOperRemoteDevCount(String devname,String buildingid,String operid){
+        String sql = "select count(*) from t_nc_device a, tb_region b, t_operbuilding c " +
+                " where a.regionid = b.regionid and a.devtype='R' and a.buildingid=c.buildingid and c.operid=:operid ";
+        if(!devname.equals("")){
+            sql+=" and bean.devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+=" and  bean.buildingid = :buildingid ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        query.setParameter("operid", operid);
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+        List list = query.getResultList();
+        int cnt = 0;
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
index ecfce32..d4b8de8 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
@@ -282,4 +282,13 @@
     //获取管理员权限下的设备
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
     public List<TNcDevice> findOperatorDevices(String operRegionid);
+
+    //根据查询条件分页获取所有可以远程的设备
+    public Pagination getAllRemoteDev(String devname, int pageNo, int pageSize, String buildingid,String regionid);
+
+    //根据查询条件分页获取所有管理员权限下可以远程的设备
+    public Pagination getOperateRemoteDev(String devname, int pageNo, int pageSize, String buildingid,String regionid,String operRegionid);
+
+    //根据查询条件分页获取所有楼栋管理员权限下可以远程的设备
+    public Pagination getBuildingOperRemoteDev(String devname, int pageNo, int pageSize, String buildingid,String regionid,String operid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
index b038b9b..73592e9 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
@@ -377,4 +377,19 @@
     public List<TNcDevice> findOperatorDevices(String operRegionid) {
         return ncDeviceDao.findOperatorDevices(operRegionid);
     }
+
+    @Override
+    public Pagination getAllRemoteDev(String devname, int pageNo, int pageSize, String buildingid, String regionid) {
+        return ncDeviceDao.getAllRemoteDev(devname, pageNo, pageSize, buildingid, regionid);
+    }
+
+    @Override
+    public Pagination getOperateRemoteDev(String devname, int pageNo, int pageSize, String buildingid, String regionid, String operRegionid) {
+        return ncDeviceDao.getOperateRemoteDev(devname, pageNo, pageSize, buildingid, regionid, operRegionid);
+    }
+
+    @Override
+    public Pagination getBuildingOperRemoteDev(String devname, int pageNo, int pageSize, String buildingid, String regionid, String operid) {
+        return ncDeviceDao.getBuildingOperRemoteDev(devname, pageNo, pageSize, buildingid, regionid, operid);
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/DevRemoteBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/DevRemoteBean.java
new file mode 100644
index 0000000..a81a6c5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/DevRemoteBean.java
@@ -0,0 +1,45 @@
+package com.supwisdom.dlpay.system.bean;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class DevRemoteBean {
+    private String deviceid;
+    private String devname;
+    private String regionname;
+    private String buildingname;
+
+    @Id
+    public String getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(String deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    public String getDevname() {
+        return devname;
+    }
+
+    public void setDevname(String devname) {
+        this.devname = devname;
+    }
+
+    public String getRegionname() {
+        return regionname;
+    }
+
+    public void setRegionname(String regionname) {
+        this.regionname = regionname;
+    }
+
+    public String getBuildingname() {
+        return buildingname;
+    }
+
+    public void setBuildingname(String buildingname) {
+        this.buildingname = buildingname;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/PayApiConfig.java b/src/main/java/com/supwisdom/dlpay/system/bean/PayApiConfig.java
deleted file mode 100644
index 1820435..0000000
--- a/src/main/java/com/supwisdom/dlpay/system/bean/PayApiConfig.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.supwisdom.dlpay.system.bean;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-@Component
-public class PayApiConfig {
-    @Value("${payapi.appid}")
-    private String appid;
-    @Value("${payapi.secret}")
-    private String secret;
-
-    public String getAppid() {
-        return appid;
-    }
-
-    public String getSecret() {
-        return secret;
-    }
-}
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 375ec39..b3aef5a 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
@@ -59,6 +59,11 @@
         return "system/building";
     }
 
+    @RequestMapping("/remoteCtrlindex")
+    public String remoteCtrlindex(){
+        return "/system/remote/remoteCtrl";
+    }
+
     /**
      * 获取字典列表
      * @param dicttype
@@ -709,4 +714,87 @@
         map.put("okFlag", okFlag);
         return map;
     }
+
+    /**
+     * 分页获取所有可以远程控制的设备(读头)
+     * @param devname
+     * @param regionid
+     * @param buildingid
+     * @param pageNo
+     * @param pageSize
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getAllNcDevForRemote",method = RequestMethod.POST)
+    public Map getAllNcDevForRemote(
+            @RequestParam(value = "devname", required = false,defaultValue = "") String devname,
+            @RequestParam(value = "regionid", required = false,defaultValue = "") String regionid,
+            @RequestParam(value = "buildingid", required = false,defaultValue = "") String buildingid,
+            @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+            @AuthenticationPrincipal TOperator operUser){
+        Map map = new HashMap();
+        try {
+            String opertype = operUser.getOpertype();
+            Pagination page = null;
+            List<TRegion> regions = null;
+            List<TBuilding> buildings = null;
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))) {
+                page = ncService.getAllRemoteDev(devname, pageNo, pageSize, buildingid, regionid);
+                map.put("PageResult", page);
+                regions = systemService.getAllRegions();
+                map.put("regions", regions);
+                buildings = ncService.getAllBuilding();
+                map.put("buildings", buildings);
+            }else if (opertype.equals("H") && !StringUtil.isEmpty(operUser.getRegionid())){
+                page = ncService.getOperateRemoteDev(devname, pageNo, pageSize, buildingid, regionid, operUser.getRegionid());
+                map.put("PageResult", page);
+                regions = systemService.getRegionListById(operUser.getRegionid());
+                map.put("regions", regions);
+                buildings = systemService.getBuildingByRegionId(operUser.getRegionid());
+                map.put("buildings", buildings);
+            }else if (opertype.equals("L")){
+                page = ncService.getBuildingOperRemoteDev(devname, pageNo, pageSize, buildingid, regionid, operUser.getOperid());
+                map.put("PageResult", page);
+                map.put("regions", regions);
+                buildings = systemService.getBuildingOperBuildings(operUser.getOperid());
+                map.put("buildings", buildings);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+
+    @ResponseBody
+    @RequestMapping(value = "/remoteCtrlDoorOnlyOne",method = RequestMethod.POST)
+    public Map remoteCtrlDoorOnlyOne(
+            @RequestParam(value = "deviceid", required = false) String deviceid,
+            @RequestParam(value = "crtlcode", required = false) String crtlcode){
+        Map map = new HashMap();
+        try {
+            int okFlag = 0;
+            TNcDevice ncDevice = ncService.getDevInfoByDevid(Integer.parseInt(deviceid));
+            if (ncDevice!=null && "C".equals(ncDevice.getDevtype())){
+                map.put("msg", "请选择要控制的门锁!");
+                map.put("okFlag", okFlag);
+                return map;
+            }
+            int devNo = ncDevice.getDevno();
+            String rmtDev = RedisUtil.get("remote_"+ncDevice.getDevphyid());
+
+            if (StringUtil.isEmpty(rmtDev)){
+                rmtDev = "----------------";
+            }
+            String tmpVal = rmtDev.substring(0,devNo-1)+crtlcode+rmtDev.substring(devNo);
+            RedisUtil.set("remote_"+ncDevice.getDevphyid(),tmpVal);
+            map.put("msg", "远程操作成功!");
+            map.put("okFlag", 1);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return map;
+    }
 }
diff --git a/src/main/resources/templates/system/remote/remoteCtrl.html b/src/main/resources/templates/system/remote/remoteCtrl.html
new file mode 100644
index 0000000..e85fc5e
--- /dev/null
+++ b/src/main/resources/templates/system/remote/remoteCtrl.html
@@ -0,0 +1,406 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">远程控制</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">集控中心</a>
+          <a><cite>远程控制</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div id="remoteCtrl">
+            <el-form :inline="true" ref="remoteform" :model="remoteform" data-parsley-validate
+                     class="form-horizontal form-label-left">
+
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">设备名称:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="remoteform.devname" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">所在区域:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <!--<el-select v-model="devform.regionid"
+                                       filterable
+                                       clearable
+                                       @Change="regionChange"
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="regionid in regions"
+                                        :key="regionid.value"
+                                        :label="regionid.label"
+                                        :value="regionid.value">
+                                </el-option>
+                            </el-select>-->
+                            <el-cascader style="width:163px"
+                                         v-model="remoteform.regionvalue"
+                                         :options="regionoptions"
+                                         :show-all-levels="false"
+                                         clearable
+                                         filterable change-on-select
+                                         @change="handleChange">
+                            </el-cascader>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">所在楼栋:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-select v-model="remoteform.buildingid"
+                                       filterable
+                                       clearable
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="buildingid in buildings"
+                                        :key="buildingid.value"
+                                        :label="buildingid.label"
+                                        :value="buildingid.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                    </div>
+                </div>
+
+
+                <div class="col-md-3">
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="query" id="remoteCtrl_qrybtn">查 询</button>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singleTable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        border
+                @selection-change="handleSelect"
+                style="width: 100%;">
+
+                <el-table-column
+                        type="selection"
+                        width="55">
+                </el-table-column>
+                <el-table-column
+                            prop="deviceid"
+                            label="设备编号"
+                            width="140">
+                </el-table-column>
+                <el-table-column
+                            prop="devname"
+                            label="设备名称"
+                            width="220">
+                </el-table-column>
+                <el-table-column
+                            prop="regionname"
+                            label="区域"
+                            width="200">
+                </el-table-column>
+                <el-table-column
+                            prop="buildingname"
+                            label="楼栋"
+                            width="200">
+                </el-table-column>
+                <el-table-column
+                            fixed="right"
+                            label="操作"
+                            width="240">
+                        <template scope="scope">
+                            <button type="button" class="btn btn-info btn-xs" title="开一次" @click="remoteCtrl_remoteCtrlSelect(scope.row.deviceid,1)">开一次</button>
+                            <button type="button" class="btn btn-info btn-xs" title="常开" @click="remoteCtrl_remoteCtrlSelect(scope.row.deviceid,9)">常开</button>
+                            <button type="button" class="btn btn-info btn-xs" title="关闭" @click="remoteCtrl_remoteCtrlSelect(scope.row.deviceid,0)">关闭</button>
+                        </template>
+                </el-table-column>
+
+                </el-table>
+                <div class="clearfix"></div>
+                <el-pagination
+                        @size-change="handleSizeChange"
+                        @current-change="currPageChange"
+                        :current-page="currPage"
+                        :page-sizes="[10, 20, 50, 100]"
+                        :page-size="pageSize"
+                        layout="prev, pager, next,sizes, jumper,total"
+                        :total="totSize">
+                </el-pagination>
+            </template>
+
+        </div>
+    </div>
+</div>
+
+<script>
+    var remoteCtrl_vue = new Vue({
+        el: '#remoteCtrl',
+        data: {
+            tableData: [],
+            currPage: 1,
+            pageSize: 10,
+            totSize: 0,
+            currentRow: null,
+            remoteform: {
+                devname: '',
+                buildingid: '',
+                regionid:'',
+                regionvalue:[],
+                Rregionid:''
+            },
+            regions:[],
+            regionoptions:[],
+            buildings:[],
+            selectList:[],
+
+        },
+        methods: {
+            handleSizeChange: function (val) {
+                this.pageSize = val;
+                remoteCtrl_commonQuery(this, this.remoteform, this.currPage, val);
+            },
+            currPageChange: function (val) {
+                this.currPage = val;
+                remoteCtrl_commonQuery(this, this.remoteform, this.currPage, this.pageSize);
+            },
+            currRowChange: function (val) {
+                this.currentRow = val;
+            },
+            query: function () {
+                this.pageSize = 10;
+                this.currPage = 1;
+                remoteCtrl_commonQuery(this, this.remoteform, this.currPage, this.pageSize);
+            },
+
+            handleSelect:function(val){
+                this.selectList=val;
+            },
+            regionChange:function(value){
+                this.buildings=[];
+                this.remoteform.buildingid='';
+                remoteCtrl_getRegionBuilding(this,value);
+            },
+            handleChange(value) {
+                if (value.length > 0) {
+                    this.remoteform.Rregionid = value[value.length - 1]
+                } else {
+                    this.remoteform.Rregionid = ''
+                }
+                //console.log(this.remoteform.Rregionid);
+
+                this.buildings = [];
+                this.remoteform.buildingid = '';
+                if (this.remoteform.Rregionid == '') {
+                    remoteCtrl_getRegionBuilding(this, '0');
+                } else {
+                    remoteCtrl_getRegionBuilding(this, this.remoteform.Rregionid);
+                }
+            }
+        },
+        created: function () {
+            var url = "[[@{/system/getAllNcDevForRemote}]]";
+            var _self = this;
+            var token=$("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "post",
+                dataType: "json",
+                url: encodeURI(url),
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                success: function (data) {
+                    _self.totSize = data.PageResult.totalCount;
+                    _self.tableData = data.PageResult.list;
+                    var regionlist = [];
+                    regionlist.push({
+                        value:'',
+                        label:'全部'
+                    });
+                    var region = data.regions;
+                    if(region!=null) {
+                        for (var i = 0; i < region.length; i++) {
+                            regionlist.push({
+                                value: region[i]["regionid"],
+                                label: region[i]["regionname"]
+                            })
+                        }
+                        //级联选择器区域数据填充
+                        remoteCtrl_vue.regionoptions = remoteCtrl_getTreeData(data.regions) ;
+                    }
+
+                    var buildinglist = [];
+                    buildinglist.push({
+                        value:'',
+                        label:'全部'
+                    });
+                    var building = data.buildings;
+                    for (var i = 0; i < building.length; i++) {
+                        buildinglist.push({
+                            value: building[i]["buildingid"],
+                            label: building[i]["buildingname"]
+                        })
+                    }
+                    remoteCtrl_vue.regions = regionlist;
+                    remoteCtrl_vue.buildings = buildinglist
+                }
+            })
+        }
+    });
+
+    function remoteCtrl_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){
+            //获取第二级
+            remoteCtrl_pushRegion(regionlst,f);
+        }else {
+            f.push({
+                value:regionlst[0].regionid,
+                label:regionlst[0].regionname,
+            })
+            //获取第二级
+            remoteCtrl_pushRegion(regionlst,f);
+        }
+        remoteCtrl_cyclePushRegion(f,regionlst)
+        return f;
+    }
+
+    function remoteCtrl_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 remoteCtrl_cyclePushRegion(fList,regionlst){
+        for (var i in fList){
+            var s = fList[i].children;
+            if (s!=undefined && s.length>0){
+                remoteCtrl_pushRegion(regionlst,s);
+            }
+            for (j in s) {
+                var l = s[j].children;
+                if (l!=undefined && l.length>0){
+                    remoteCtrl_cyclePushRegion(s,regionlst)
+                }
+            }
+        }
+    }
+
+
+    function remoteCtrl_commonQuery(_self, remoteCtrl, pageno, pagesize) {
+
+        var url = "[[@{/system/getAllNcDevForRemote?}]]"+"&devname=" + remoteCtrl.devname
+            +"&regionid=" +remoteCtrl.Rregionid + "&buildingid=" + remoteCtrl.buildingid;
+        var token=$("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "POST",
+            dataType: "json",
+            url: encodeURI(url),
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            success: function (ret) {
+                if (ret.PageResult != null) {
+                    _self.totSize = ret.PageResult.totalCount;
+                    _self.tableData = ret.PageResult.list;
+                    if(_self.totSize == 0 ){
+                        layer.msg("暂无数据", {icon: 2, time: 1000});
+                    }
+                }
+            }
+        })
+    }
+
+
+    function remoteCtrl_getRegionBuilding(_self,value){
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("[[@{/ncmgr/getRegionBuilding?regionid=}]]" + value),
+            success: function (ret) {
+                var bList = [];
+                bList.push({
+                    value:'',
+                    label:'全部'
+                });
+                var rB = ret.reBuilding;
+                if (rB!=null) {
+                    for (var j = 0; j < rB.length; j++) {
+                        bList.push({
+                            value: rB[j]["buildingid"],
+                            label: rB[j]["buildingname"]
+                        });
+                    }
+                }
+
+                _self.buildings = bList;
+            }
+        })
+    }
+
+
+    function remoteCtrl_remoteCtrlSelect(deviceid,crtlcode){
+
+        layer.confirm('确定执行此动作吗？', {icon: 3, title:'请确认'}, function(index) {
+            var token=$("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: encodeURI("[[@{/system/remoteCtrlDoorOnlyOne?deviceid=}]]" +deviceid+
+                    "&crtlcode=" + crtlcode),
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                success: function (ret) {
+                    if (ret.okFlag == undefined) {
+                        layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
+                        window.location = "[[@{/login}]]";
+                        return;
+                    }
+                    if (ret.okFlag != 1) {
+                        layer.msg(ret.msg, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg(ret.msg, {icon: 1, time: 1000});
+                    }
+                }
+            })
+        })
+    }
+
+
+</script>
\ No newline at end of file
