diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoorcardlstInfo.java b/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoorcardlstInfo.java
index 7e0d970..9eceda6 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoorcardlstInfo.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/bean/TDoorcardlstInfo.java
@@ -204,6 +204,9 @@
         this.feedbackTime = feedbackTime;
     }
 
+    public TDoorcardlstInfo() {
+    }
+
     public TDoorcardlstInfo(String listid, String factoryId, String factoryName, String doorName, String custName, String operName, String stuempNo, String buildingName, String regionName, String syncStatus, String operFlagIndex, String operFlag, String allocatTime, String syncTime, String feedbackTime, String retmsg, String reason, String usetype, String closedate) {
         this.listid = listid;
         this.factoryId = factoryId;
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 05e54a9..5e14310 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
@@ -104,7 +104,7 @@
     @Override
     public List<TDoordtlInfo> findOperatorExportExcelDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingid, String regionid, String doorName, String factoryId, String streamstatus, String operRegionid) {
         try {
-            String queryString = "select a.dtldesc , c.factoryname,d.doorname,b.stuempno,b.custname,tb.buildingname,tr.regionname," +
+            String queryString = "select a.dtldesc ,a.doorseqno, c.factoryname,d.doorname,b.stuempno,b.custname,tb.buildingname,tr.regionname," +
                     " to_char(to_date(a.transdate||a.transtime ,'yyyymmddhh24miss'),'yyyy-mm-dd hh24:mi:ss') as transdate, "
                     + "case when a.status='0' then '失败' else '成功' end status,to_char(to_date(  a.coldate||a.coltime,'yyyymmddhh24miss'),'yyyy-mm-dd hh24:mi:ss') as coldate  " + "from  "
                     + "t_doordtl a "
@@ -197,12 +197,12 @@
     @Transactional
     @Override
     public Pagination findSystemTDoordtl(String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingid, String doorName, String factoryId, String streamstatus, int pageNo, int pageSize, String regionid) {
-        String queryString = "select a.doorid, d.doorname,a.stuempno,a.custname,a.transdate||a.transtime transdate,tb.buildingname,tr.regionname, "
+        String queryString = "select a.doorid,a.doorseqno, c.factoryname, d.doorname,a.stuempno,a.custname,a.transdate||a.transtime transdate,tb.buildingname,tr.regionname, "
                 + "case when a.status='0' then '失败' else '成功' end status,a.coldate||a.coltime coldate,a.dtldesc,a.cardphyid  "
                 + "from t_doordtl a left join t_doordev d  on a.doorid = d.doorid "
                 + "left join t_building tb on a.buildingid=tb.buildingid "
-                + "left join tb_region tr on a.regionid=tr.regionid "
-                + "where 1>0 ";
+                + "left join tb_region tr on a.regionid=tr.regionid, "
+                +" t_keys c " + "where a.factoryid=c.factoryid  ";
         if (!startTranDate.equals("")) {
             queryString += " and transdate between :startTranDate and :endTranDate ";
         }
@@ -352,13 +352,13 @@
     @Override
     public Pagination findOperatorTDoordtl(String operid, String startTranDate, String endTranDate, String startTranTime, String endTranTime, String stuempno, String custname, String buildingid, String doorName, String factoryId, String streamstatus, int pageNo, int pageSize, String regionid,String operRegionid) {
         try{
-            String queryString = "select a.doorid,d.doorname,a.stuempno,a.custname,a.transdate||a.transtime transdate,"
+            String queryString = "select a.doorid,a.doorseqno,c.factoryname,d.doorname,a.stuempno,a.custname,a.transdate||a.transtime transdate,"
                     + " case when a.status='0' then '失败' else '成功' end status,a.coldate||a.coltime coldate,a.dtldesc,a.cardphyid,tb.buildingname,tr.regionname "
                     + " from t_doordtl a left join t_doordev d on a.doorid = d.doorid"
                     + " left join t_operdevice od on a.doorid = od.deviceid"
                     + "left join t_building tb on a.buildingid=tb.buildingid "
-                    + "left join tb_region tr on a.regionid=tr.regionid "
-                    + " where 1>0 ";
+                    + "left join tb_region tr on a.regionid=tr.regionid, "
+                    + " t_keys c " + "where a.factoryid=c.factoryid  ";
             if (!startTranDate.equals("")) {
                 queryString += " and transdate between :startTranDate and :endTranDate ";
             }
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
index dfec0c4..ddc8527 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -123,7 +123,7 @@
         }
     }
 
-    @PostMapping("/resetpwd")
+    @GetMapping("/resetpwd")
     //@PreAuthorize("hasPermission('/operator/resetpwd','')")
     @ResponseBody
     public JsonResult resetpwd(@RequestParam("operid") String operid) {
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 44981c8..1232481 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/SystemController.java
@@ -363,7 +363,7 @@
             region.setRegionname(postData.getRegionname());
             region.setRemarks(postData.getRemarks());
             TRegion tRegion = systemService.getRegionById(postData.getParentid());
-            region.setParentname(tRegion.getParentname());
+            region.setParentname(tRegion.getRegionname());
             region.setFlag(1);
 
             systemService.updateRegion(region);
diff --git a/src/main/resources/templates/doorlist/searchDoorlist.html b/src/main/resources/templates/doorlist/searchDoorlist.html
index a59a02c..2c77b7b 100644
--- a/src/main/resources/templates/doorlist/searchDoorlist.html
+++ b/src/main/resources/templates/doorlist/searchDoorlist.html
@@ -106,11 +106,11 @@
                 </el-row>
                 <el-row>
                     <el-col :span="8" :offset="16">
-                        <button type="button" style="margin-left: 48px" class="btn btn-info" @click="query" id="qrybtn">
+                        <button type="button" style="margin-left: 48px" class="btn btn-info" @click="query" id="searchDoorlist_qrybtn">
                             查询
                         </button>
-                        <button type="button" class="btn btn-info" @click="excel" id="excel">导出Excel</button>
-                        <button type="button" class="btn btn-info" @click="reIssuedList">重新下发名单</button>
+                        <button type="button" class="btn btn-info" @click="excel" id="searchDoorlist_excel">导出Excel</button>
+                        <button type="button" class="btn btn-info" @click="searchDoorlist_reIssuedList">重新下发名单</button>
                     </el-col>
                 </el-row>
 
@@ -223,17 +223,14 @@
                 </el-pagination>
             </template>
 
-            <el-dialog title="时间段和节假日名称" :visible.sync="dialogFormVisible" center="true" top="3%" size="tiny">
-                <p>正在查看<span style="color:#f96" id="custNameId"></span>学生的时间段和节假日名称:</p>
+            <el-dialog title="时间段名称" :visible.sync="dialogFormVisible" center="true" top="3%" size="tiny">
+                <p>正在查看<span style="color:#f96" id="searchDoorlist_custNameId"></span>学生的时间段名称:</p>
                 <div style="width: 100%;">
 		            <span style="font-size: 16px!important;">时间段名称：
                         {{alloTimeName}}
                     </span>
                 </div>
-                <div style="width:100%; margin-top:10px;">
-                    <span style="font-size: 16px!important;">节假日名称：</span>
-                    {{alloHolidayName}}
-                </div>
+
                 <span slot="footer" class="dialog-footer">
                     <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
                   </span>
@@ -244,7 +241,7 @@
 </div>
 
 <script>
-    var vue = new Vue({
+    var searchDoorlist_vue = new Vue({
         el: "#searchDoorlist",
         data: {
             tableData: [],
@@ -295,11 +292,11 @@
         methods: {
             handleSizeChange: function (val) {
                 this.pageSize = val;
-                commonQuery(this, this.searchDoorForm, this.currPage, val);
+                searchDoorlist_commonQuery(this, this.searchDoorForm, this.currPage, val);
             },
             currPageChange: function (val) {
                 this.currPage = val;
-                commonQuery(this, this.searchDoorForm, this.currPage, this.pageSize);
+                searchDoorlist_commonQuery(this, this.searchDoorForm, this.currPage, this.pageSize);
             },
             currRowChange: function (val) {
                 this.currentRow = val;
@@ -307,7 +304,7 @@
             query: function () {
                 this.pagesize = 10;
                 this.currPage = 1;
-                commonQuery(this, this.searchDoorForm, this.currPage, this.pageSize);
+                searchDoorlist_commonQuery(this, this.searchDoorForm, this.currPage, this.pageSize);
             },
             excel: function () {
                 var _self=this;
@@ -316,7 +313,7 @@
                     cancelButtonText: '取消',
                     type: 'warning'
                 }).then(function(){
-                    exportExcel(_self, _self.searchDoorForm);
+                    searchDoorlist_exportExcel(_self, _self.searchDoorForm);
 
                 });
             },
@@ -329,8 +326,8 @@
             },
             regionChange:function(value){
                 this.buildings=[];
-                this.searchDoorForm.buildingid='',
-                getRegionBuilding(this,value);
+                this.searchDoorForm.buildingid='';
+                searchDoorlist_getRegionBuilding(this,value);
             },
         },
         created: function () {
@@ -395,14 +392,14 @@
                             label: building[i]["buildingname"]
                         })
                     }
-                    vue.factoryIds = factoryList;
-                    vue.syncStatus = syncDicts;
-                    vue.operFlag = operDicts;
-                    vue.regions = regionlist;
-                    vue.buildings = buildinglist;
-                    vue.searchDoorForm.factoryId = 'all';
-                    vue.searchDoorForm.syncStatus = 'all';
-                    vue.searchDoorForm.operFlag = 'all';
+                    searchDoorlist_vue.factoryIds = factoryList;
+                    searchDoorlist_vue.syncStatus = syncDicts;
+                    searchDoorlist_vue.operFlag = operDicts;
+                    searchDoorlist_vue.regions = regionlist;
+                    searchDoorlist_vue.buildings = buildinglist;
+                    searchDoorlist_vue.searchDoorForm.factoryId = 'all';
+                    searchDoorlist_vue.searchDoorForm.syncStatus = 'all';
+                    searchDoorlist_vue.searchDoorForm.operFlag = 'all';
                 }
             })
             this.searchDoorForm.allocatStartDate ='';
@@ -432,7 +429,7 @@
     }
 
 
-    function commonQuery(_self, searchDoor, pageno, pagesize) {
+    function searchDoorlist_commonQuery(_self, searchDoor, pageno, pagesize) {
         var startStr = '';
         var endStr = '';
         if (searchDoor.allocatStartDate != '') {
@@ -473,7 +470,7 @@
         })
     }
 
-    function exportExcel(_self, searchDoor) {
+    function searchDoorlist_exportExcel(_self, searchDoor) {
         var startStr = '';
         var endStr = '';
         if(_self.totSize > 1000){
@@ -499,8 +496,8 @@
         window.open(uri);
     }
 
-    function reIssuedList() {
-        var listIds=vue.selectList;
+    function searchDoorlist_reIssuedList() {
+        var listIds=searchDoorlist_vue.selectList;
         if(listIds ==''){
             layer.msg('请选择要重新下发的名单！',{icon:2,time:1000});
         }else {
@@ -520,14 +517,14 @@
                     data:JSON.stringify(listIds) ,
                     success: function (data) {
                         layer.msg(data.result,{time:2000})
-                        refreshThisTable();
+                        searchDoorlist_refreshThisTable();
                     }
                 });
             })
         }
     }
 
-    function getRegionBuilding(_self,value){
+    function searchDoorlist_getRegionBuilding(_self,value){
         $.ajax({
             type: "get",
             dataType: "json",
@@ -550,6 +547,6 @@
     }
 
     function refreshThisTable(){
-        $("#qrybtn").click();
+        $("#searchDoorlist_qrybtn").click();
     }
 </script>
\ No newline at end of file
diff --git a/src/main/resources/templates/ncmgr/nc_dev.html b/src/main/resources/templates/ncmgr/nc_dev.html
index 52157b7..4b093cf 100644
--- a/src/main/resources/templates/ncmgr/nc_dev.html
+++ b/src/main/resources/templates/ncmgr/nc_dev.html
@@ -16,7 +16,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-input v-model="devform.devname" id="devname"></el-input>
+                            <el-input v-model="devform.devname" ></el-input>
                         </div>
                     </div>
                 </div>
@@ -84,7 +84,7 @@
 
                 <div class="col-md-12" style="padding-left: 905px">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="dev_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addDev">添加设备</button>
                     </div>
                 </div>
@@ -257,7 +257,8 @@
                     </el-form-item>
                     <el-form-item label="读头号:" prop="devno">
                         <el-col :span="18">
-                            <el-input v-model.number="devUpform.devno" :disabled="devnoDis" style="width: 187px;">
+                            <el-input v-model.number="devUpform.devno" :disabled="devnoDis"
+                                      placeholder="读头需输入读头号" style="width: 187px;">
 
                             </el-input>
                         </el-col>
@@ -320,9 +321,9 @@
 </div>
 
 <script>
-    var validatePass = function (rule, value, callback) {
+    var dev_validatePass = function (rule, value, callback) {
         //console.log(vue.devnoDis)
-        if (!vue.devnoDis) {
+        if (!dev_vue.devnoDis) {
             if (!value) {
                 return callback(new Error('请输入读头号'));
             }
@@ -339,7 +340,7 @@
             callback();
         }
     }
-    var vue = new Vue({
+    var dev_vue = new Vue({
         el: '#devapp',
         data: {
             tableData: [],
@@ -368,6 +369,7 @@
             devusetypes: [],
             dialogFormVisible: false,
             dlgAllotDevVisible: false,
+            fillFlag: false,
             devtitle: '添加设备',
             devUpform: {
                 deviceid: '',
@@ -397,11 +399,11 @@
                     {required: true, message: '请输入设备编号', trigger: 'blur'}
                 ],
                 devno: [
-                    {validator: validatePass, trigger: 'blur'}
+                    {validator: dev_validatePass, trigger: 'blur'}
                 ],
-                regionid: [
+                /*regionid: [
                     {required: true, message: '请选择设备所在区域', trigger: 'blur'}
-                ],
+                ],*/
                 buildingid: [
                     {required: true, message: '请选择设备所在楼栋', trigger: 'blur'}
                 ],
@@ -412,31 +414,31 @@
         methods: {
             handleSizeChange: function (val) {
                 this.pageSize = val;
-                commonQuery(this, this.devform, this.currPage, val);
+                dev_commonQuery(this, this.devform, this.currPage, val);
             },
             currPageChange: function (val) {
                 this.currPage = val;
-                commonQuery(this, this.devform, this.currPage, this.pageSize);
+                dev_commonQuery(this, this.devform, this.currPage, this.pageSize);
             },
             currRowChange: function (val) {
                 this.currentRow = val;
             },
             delDev: function (row) {
-                deletedata(row);
+                dev_deletedata(row);
             },
             listClean: function(row){
-                listCleanMethod(row);
+                dev_listCleanMethod(row);
             },
             listReload: function(row){
-                listReloadMethod(row);
+                dev_listReloadMethod(row);
             },
             query: function () {
                 this.pagesize = 10;
                 this.currPage = 1;
-                commonQuery(this, this.devform, this.currPage, this.pageSize);
+                dev_commonQuery(this, this.devform, this.currPage, this.pageSize);
             },
             addDev: function (formName) {
-                getFillData(this, "-1");
+                dev_getFillData(this, "-1");
                 this.dialogFormVisible = true;
                 this.devtitle = "添加设备"
                 this.continueadd = true;
@@ -466,7 +468,7 @@
                         }
                     });
                 if (vali == true) {
-                    saveData(_that, _that.devUpform, formName);
+                    dev_saveData(_that, _that.devUpform, formName);
 
                 }
 
@@ -489,21 +491,24 @@
             regionChange:function(value){
                 this.buildings=[];
                 this.devform.buildingid='';
-                getRegionBuilding(this,value);
+                dev_getRegionBuilding(this,value);
                 if (this.devform.regionid==''){
-                    getRegionBuilding(this,'0');
+                    dev_getRegionBuilding(this,'0');
                 }
             },
             regionfillChange:function(value){
                 this.buildingsfill=[];
-                this.devUpform.buildingid='';
-                getRegionBuildingfill(this,value);
+                if(this.fillFlag==false) {
+                    this.devUpform.buildingid = '';
+                }
+                this.fillFlag=false;
+                dev_getRegionBuildingfill(this,value);
             },
             editDev: function (deviceid) {
                 this.devnoDis = false;
                 this.fdevDis = false;
                 this.phyDis = true;
-                getFillData(this, deviceid);
+                dev_getFillData(this, deviceid);
                 this.dialogFormVisible = true;
                 this.devtitle = "设备信息修改"
                 this.continueadd = false;
@@ -543,12 +548,12 @@
             },
             syncform: function (row, column, cellValue) {
                 if (row.synctime != null) {
-                    return timeformatter(row.synctime);
+                    return dev_timeformatter(row.synctime);
                 }
             },
             updform: function (row, column, cellValue) {
                 if (row.updtime != null) {
-                    return timeformatter(row.updtime);
+                    return dev_timeformatter(row.updtime);
                 }
             }
 
@@ -572,7 +577,7 @@
                     });
                     if (rt!=null) {
                         if (rt.length == 1) {
-                            vue.devform.regionid = rt[0].regionid;
+                            dev_vue.devform.regionid = rt[0].regionid;
                         }
                         for (var j = 0; j < rt.length; j++) {
                             uows.push({
@@ -611,9 +616,9 @@
 
                         });
                     }
-                    vue.devtypes = dictlist;
-                    vue.regions = uows;
-                    vue.buildings = rows;
+                    dev_vue.devtypes = dictlist;
+                    dev_vue.regions = uows;
+                    dev_vue.buildings = rows;
 
                 }
             })
@@ -621,14 +626,14 @@
 
     })
 
-    function timeformatter(time) {
+    function dev_timeformatter(time) {
 
         return time.substr(0, 4) + '-' + time.substr(4, 2) + '-' + time.substr(6, 2) + ' '
             + time.substr(8, 2) + ':' + time.substr(10, 2) + ':' + time.substr(12, 2);
 
     }
 
-    function commonQuery(_self, rolename, pageno, pagesize) {
+    function dev_commonQuery(_self, rolename, pageno, pagesize) {
         $.ajax({
             type: "get",
             dataType: "json",
@@ -643,7 +648,7 @@
         })
     }
 
-    function getFillData(_self, id) {
+    function dev_getFillData(_self, id) {
         $.ajax({
             type: "get",
             dataType: "json",
@@ -713,6 +718,7 @@
                     _self.devUpform.ip = ret.device.ip;
                     _self.devUpform.regionid = ret.device.regionid;
                     _self.devUpform.buildingid = ret.device.buildingid;
+                    _self.fillFlag = true;
 
                 }
                 _self.devtypes = dictlist;
@@ -724,8 +730,8 @@
         })
     }
 
-    function saveData(_that, formdata, formName) {
-        if (!checkNumber(formdata.devno) && formdata.devtype == 'R') {
+    function dev_saveData(_that, formdata, formName) {
+        if (!dev_checkNumber(formdata.devno) && formdata.devtype == 'R') {
             layer.msg('读头号为1~4位数字', {icon: 2, time: 1000});
             return;
         }
@@ -754,22 +760,22 @@
                 if (data.errStr != "") {
                     layer.msg(data.errStr, {icon: 2, time: 2000});
                 } else {
-                    if (vue.continueadd == false) {
+                    if (dev_vue.continueadd == false) {
                         layer.msg('保存信息成功!', {icon: 1, time: 1000});
-                        vue.devUpform.deviceid = '';
+                        dev_vue.devUpform.deviceid = '';
                         _that.$refs[formName].resetFields();
                         _that.dialogFormVisible = false;
                     } else {
                         layer.msg('保存信息成功，继续添加!', {icon: 1, time: 1000});
-                        vue.devUpform.deviceid = '';
+                        dev_vue.devUpform.deviceid = '';
                     }
-                    refreshThisTable();
+                    dev_refreshThisTable();
                 }
             }
         });
     }
 
-    function checkNumber(theObj) {
+    function dev_checkNumber(theObj) {
         var reg = /^\d{1,4}$/;
         if (reg.test(theObj)) {
             return true;
@@ -777,11 +783,11 @@
         return false;
     }
 
-    function refreshThisTable() {
-        commonQuery(vue, vue.devform, vue.currPage, vue.pageSize);
+    function dev_refreshThisTable() {
+        dev_commonQuery(dev_vue, dev_vue.devform, dev_vue.currPage, dev_vue.pageSize);
     };
 
-    function deletedata(id) {
+    function dev_deletedata(id) {
         layer.confirm('你确定要删除选择的设备吗?', {icon: 3, title: '请确认', offset: '30%'}, function (index) {
             $.ajax({
                 type: "get",
@@ -798,7 +804,7 @@
                         layer.msg(ret.message, {icon: 2, time: 1000});
                     } else {
                         layer.msg('删除成功', {icon: 1, time: 1000});
-                        refreshThisTable();
+                        dev_refreshThisTable();
 
                     }
                 }
@@ -806,7 +812,7 @@
         });
     };
 
-    function listCleanMethod(id){
+    function dev_listCleanMethod(id){
         layer.confirm('你确定要清空该设备名单吗?',{icon: 3,title: '请确认',offset: '30%'},function (index) {
             $.ajax({
                 type: "get",
@@ -828,7 +834,7 @@
         });
     };
 
-    function listReloadMethod(id){
+    function dev_listReloadMethod(id){
         layer.confirm('你确定要重下该设备名单吗?',{icon: 3,title: '请确认',offset: '30%'},function (index) {
             $.ajax({
                 type: "get",
@@ -850,7 +856,7 @@
         });
     }
 
-    function getRegionBuilding(_self,value){
+    function dev_getRegionBuilding(_self,value){
         $.ajax({
             type: "get",
             dataType: "json",
@@ -872,7 +878,7 @@
         })
     }
 
-    function getRegionBuildingfill(_self,value) {
+    function dev_getRegionBuildingfill(_self,value) {
         $.ajax({
             type: "get",
             dataType: "json",
diff --git a/src/main/resources/templates/ncmgr/nc_devweek.html b/src/main/resources/templates/ncmgr/nc_devweek.html
index 803fab0..9a53880 100644
--- a/src/main/resources/templates/ncmgr/nc_devweek.html
+++ b/src/main/resources/templates/ncmgr/nc_devweek.html
@@ -14,7 +14,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-input v-model="devweekform.devname" id="devname"></el-input>
+                            <el-input v-model="devweekform.devname" ></el-input>
                         </div>
                     </div>
                 </div>
@@ -36,7 +36,7 @@
                 </div>
                 <div class="col-md-3">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="devweek_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addDevWeek">添加设备时间周</button>
                     </div>
                 </div>
@@ -85,7 +85,7 @@
                 </el-pagination>
             </template>
 
-            <el-dialog :title="devweekTitle" :visible.sync="dialogFormVisible" size=large top="30px" style="width: 900px;height:700px;left: 220px;top:0px" >
+            <el-dialog :title="devweekTitle" :visible.sync="dialogFormVisible" size="mini"top="30px" >
                 <el-form ref="devweekDiaform" :model="devweekDiaform" :rules="rules" label-width="100px" >
                     <el-form-item label="选择时间周:" prop="weekid">
                         <el-col  :span="24">
@@ -108,7 +108,7 @@
                                         :data="devs"
                                         :target-keys="selectDevList"
                                         :list-style="listStyle"
-                                        :panelWidth="panelWidth"
+
                                         :operations="['移除','选择']"
                                         :button-texts="['移除', '选择']"
                                         :titles="['待选设备','已选设备']"
@@ -130,7 +130,7 @@
     </div>
 </div>
 <script>
-    var vue = new Vue({
+    var devweek_vue = new Vue({
         el:'#devweek',
         data:{
             tableData:[],
@@ -156,7 +156,7 @@
                 width: '500px',
                 height: '600px'
             },
-            panelWidth:300,
+
             reWeekId:0,
             chosenDevs:[],
             rules:{
@@ -172,12 +172,12 @@
         methods:{
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                commonQuery(this,this.devweekform.weekid,this.devweekform.devname,this.currPage,val);
+                devweek_commonQuery(this,this.devweekform.weekid,this.devweekform.devname,this.currPage,val);
                 //console.log('每页条'+val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                commonQuery(this,this.devweekform.weekid,this.devweekform.devname,this.currPage,this.pageSize);
+                devweek_commonQuery(this,this.devweekform.weekid,this.devweekform.devname,this.currPage,this.pageSize);
                 //console.log('当前页:'+val);
             },
             currRowChange:function(val) {
@@ -186,17 +186,17 @@
             query:function(){
                 this.pagesize=10;
                 this.currPage=1;
-                commonQuery(this,this.devweekform.weekid,this.devweekform.devname,this.currPage,this.pageSize);
+                devweek_commonQuery(this,this.devweekform.weekid,this.devweekform.devname,this.currPage,this.pageSize);
             },
             devChange:function (newTargetKeys) {
                 //console.log(newTargetKeys);
                 this.selectDevList=newTargetKeys;
             },
             delDevWeek:function(devid,weekid){
-                deletedata(devid,weekid);
+                devweek_deletedata(devid,weekid);
             },
             addDevWeek:function () {
-                getFillData(this,"-1");
+                devweek_getFillData(this,"-1");
                 this.dialogFormVisible = true;
                 this.timetitile="添加时间段"
             },
@@ -222,7 +222,7 @@
 
                     saveData(_that,_that.devweekDiaform,formName);
                 }*/
-                saveData(_that,_that.devweekDiaform,_that.chosenDevs);
+                devweek_saveData(_that,_that.devweekDiaform,_that.chosenDevs);
 
                 //_that.chosenDevs=[];
                 //_that.devs=[];
@@ -233,7 +233,7 @@
             },
             getReWeekId:function(val){
                 var _self=this;
-                getChosenDev(_self,val);
+                devweek_getChosenDev(_self,val);
 
             },
 
@@ -262,11 +262,11 @@
             })
         }
     });
-    function refreshThisTable(){
+    function devweek_refreshThisTable(){
 
-        commonQuery(vue,vue.devweekform.weekid,vue.devweekform.devname,vue.currPage,vue.pageSize);
+        devweek_commonQuery(devweek_vue,devweek_vue.devweekform.weekid,devweek_vue.devweekform.devname,devweek_vue.currPage,devweek_vue.pageSize);
     };
-    function commonQuery(_self,weekid,devname,pageNo,pageSize){
+    function devweek_commonQuery(_self,weekid,devname,pageNo,pageSize){
         var id=weekid;
         if(!weekid){
             id=0;
@@ -284,7 +284,7 @@
             }
         })
     }
-    function deletedata(devid,weekid){
+    function devweek_deletedata(devid,weekid){
         layer.confirm('是否删除该设备时间周?', {icon: 3, title:'请确认',offset:'30%'},function(index){
             $.ajax({
                 type:"get",
@@ -300,13 +300,13 @@
                         layer.msg(ret.message, {icon:2,time:1000});
                     }else{
                         layer.msg('删除成功', {icon: 1,time:1000});
-                        refreshThisTable();
+                        devweek_refreshThisTable();
                     }
                 }
             })
         })
     }
-    function getFillData(_self,id){
+    function devweek_getFillData(_self,id){
         $.ajax({
             type:"get",
             dataType:"json",
@@ -335,7 +335,7 @@
             }
         })
     }
-    function saveData(_that,formdata,formName){
+    function devweek_saveData(_that,formdata,formName){
 
         var weekid = formdata.weekid;
         var devs = formName;
@@ -372,14 +372,14 @@
                 } else {
                     layer.msg('保存信息成功!', {icon: 1,time:1000});
                     _that.selectDevList=[];
-                    refreshThisTable();
+                    devweek_refreshThisTable();
 
                 }
             }
         });
     }
 
-    function getChosenDev(_self,reData){
+    function devweek_getChosenDev(_self,reData){
 
         var reWeekId=reData;
         $.ajax({
@@ -403,15 +403,20 @@
 
 </script>
 
-<style>
+<style lang="scss">
     .el-checkbox-group.el-transfer-panel__list{
-        height:250px;
+        height:365px;
+    }
+
+    .el-dialog {
+        width: 900px;
     }
     .el-transfer-panel{
-        width:260px;
+        width:330px;
     }
     .el-transfer-panel__body{
-        height:330px;
-        width:250px;
+        height:360px;
+        width:328px;
     }
+
 </style>
\ No newline at end of file
diff --git a/src/main/resources/templates/ncmgr/nc_time.html b/src/main/resources/templates/ncmgr/nc_time.html
index 3d5099b..5d609f0 100644
--- a/src/main/resources/templates/ncmgr/nc_time.html
+++ b/src/main/resources/templates/ncmgr/nc_time.html
@@ -15,13 +15,13 @@
                         <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="timeform.timename" id="timename"></el-input>
+                            <el-input v-model="timeform.timename"></el-input>
                         </div>
                     </div>
                 </div>
                 <div class="col-md-3">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="time_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addTime">添加时间段</button>
                     </div>
                 </div>
@@ -112,7 +112,7 @@
 </div>
 
 <script>
-    var vue = new Vue({
+    var time_vue = new Vue({
         el:'#timeapp',
         data:{
             tableData:[],
@@ -143,33 +143,33 @@
         methods:{
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                commonQuery(this,this.timeform.timename,this.currPage,val);
+                time_commonQuery(this,this.timeform.timename,this.currPage,val);
                 //console.log('每页条'+val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                commonQuery(this,this.timeform.timename,this.currPage,this.pageSize);
+                time_commonQuery(this,this.timeform.timename,this.currPage,this.pageSize);
                 //console.log('当前页:'+val);
             },
             currRowChange:function(val) {
                 this.currentRow = val;
             },
             pickbTime:function(val){
-                vue.btime = val;
+                time_vue.btime = val;
             },
             pickeTime:function(val){
-                vue.etime = val;
+                time_vue.etime = val;
             },
             query:function(){
                 this.pagesize=10;
                 this.currPage=1;
-                commonQuery(this,this.timeform.timename,this.currPage,this.pageSize);
+                time_commonQuery(this,this.timeform.timename,this.currPage,this.pageSize);
             },
             delTime:function(timeid){
-                deletedata(timeid);
+                time_deletedata(timeid);
             },
             addTime:function () {
-                getFillData(this,"-1");
+                time_getFillData(this,"-1");
                 this.dialogFormVisible = true;
                 this.timetitile="添加时间段"
             },
@@ -178,7 +178,7 @@
                 this.dialogFormVisible = false
             },
             editTime:function(timeid){
-                getFillData(this,timeid);
+                time_getFillData(this,timeid);
                 this.dialogFormVisible = true;
                 this.timetitile="修改时间段"
             },
@@ -207,24 +207,12 @@
                     time.btime = btimesp[0]+":"+btimesp[1];
                     var etimesp = this.etime.split(":");
                     time.etime = etimesp[0]+":"+etimesp[1];
-                    saveData(_that,time,formName);
-                }
-            },
-            falgform:function (row,column,cellValue) {
-                if(row.syncfalg=='S'){
-                    return '已同步';
-                }else {
-                    return '未同步';
-                }
-            },
-            syncform:function (row,column,cellValue) {
-                if(row.synctime != null) {
-                    return timeformatter(row.synctime);
+                    time_saveData(_that,time,formName);
                 }
             },
             updform:function(row,column,cellValue){
                 if(row.updtime != null) {
-                    return timeformatter(row.updtime);
+                    return time_timeformatter(row.updtime);
                 }
             }
         },
@@ -242,7 +230,7 @@
             })
         }
     });
-    function timeformatter(time){
+    function time_timeformatter(time){
 
         return time.substr(0,4)+'-'+time.substr(4,2)+'-'+time.substr(6,2)+' '
             +time.substr(8,2)+':'+time.substr(10,2)+':'+time.substr(12,2);
@@ -250,10 +238,10 @@
 //        return [year,month,date].join('-')+' '+[hour,moment,second].join(':');
 
     }
-    function refreshThisTable(){
-        commonQuery(vue,vue.timeform.timename,vue.currPage,vue.pageSize);
+    function time_refreshThisTable(){
+        time_commonQuery(time_vue,time_vue.timeform.timename,time_vue.currPage,time_vue.pageSize);
     };
-    function commonQuery(_self,timename,pageNo,pageSize){
+    function time_commonQuery(_self,timename,pageNo,pageSize){
         $.ajax({
             type:"get",
             dataType:"json",
@@ -267,7 +255,7 @@
             }
         })
     }
-    function deletedata(timeid){
+    function time_deletedata(timeid){
         layer.confirm('是否删除该时间段', {icon: 3, title:'请确认',offset:'30%'},function(index){
             $.ajax({
                 type:"get",
@@ -284,17 +272,17 @@
                     }else{
                         if(ret.flag == 0){
                             layer.msg('删除成功', {icon: 1,time:1000});
-                            refreshThisTable();
+                            time_refreshThisTable();
                         }else {
                             layer.msg(ret.message, {icon:2,time:3000});
-                            refreshThisTable();
+                            time_refreshThisTable();
                         }
                     }
                 }
             })
         })
     }
-    function getFillData(_self,id){
+    function time_getFillData(_self,id){
         $.ajax({
             type:"get",
             dataType:"json",
@@ -316,12 +304,12 @@
             }
         })
     }
-    function saveData(_that,formdata,formName){
+    function time_saveData(_that,formdata,formName){
         var url = null;
-        if(vue.timetitile == "添加时间段"){
+        if(time_vue.timetitile == "添加时间段"){
             url = encodeURI("[[@{/ncmgr/addNcTime}]]");
         }
-        if(vue.timetitile == "修改时间段"){
+        if(time_vue.timetitile == "修改时间段"){
             url = encodeURI("[[@{/ncmgr/updateNcTime}]]")
         }
         var token=$("meta[name='_csrf_token']").attr("value");
@@ -346,7 +334,7 @@
                     layer.msg(data.errStr, {icon: 2,time:1000});
                 } else {
                     layer.msg('保存信息成功!', {icon: 1,time:1000});
-                    refreshThisTable();
+                    time_refreshThisTable();
                     _that.$refs[formName].resetFields();
                     _that.dialogFormVisible = false;
                 }
diff --git a/src/main/resources/templates/ncmgr/nc_timegrp.html b/src/main/resources/templates/ncmgr/nc_timegrp.html
index 58d531d..9956a04 100644
--- a/src/main/resources/templates/ncmgr/nc_timegrp.html
+++ b/src/main/resources/templates/ncmgr/nc_timegrp.html
@@ -15,7 +15,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-input v-model="timegrpform.timegrpname" id="timegrpname"></el-input>
+                            <el-input v-model="timegrpform.timegrpname" ></el-input>
                         </div>
                     </div>
                 </div>
@@ -23,7 +23,7 @@
 
                 <div class="col-md-3">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="timegrp_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addTimegrp">添加时间组</button>
                     </div>
                 </div>
@@ -199,7 +199,7 @@
 
 
 <script>
-    var vue = new Vue({
+    var timegrp_vue = new Vue({
         el: '#timegrpapp',
         data:{
             tableData: [],
@@ -235,25 +235,25 @@
         methods: {
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                commonQuery(this,this.timegrpform.timegrpname,this.currPage,val);
+                timegrp_commonQuery(this,this.timegrpform.timegrpname,this.currPage,val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                commonQuery(this,this.timegrpform.timegrpname,this.currPage,this.pageSize);
+                timegrp_commonQuery(this,this.timegrpform.timegrpname,this.currPage,this.pageSize);
             },
             currRowChange:function(val) {
                 this.currentRow = val;
             },
             delTimegrp:function (row) {
-                deletedata(row);
+                timegrp_deletedata(row);
             },
             query:function () {
                 this.pagesize=10;
                 this.currPage=1;
-                commonQuery(this,this.timegrpform.timegrpname,this.currPage,this.pageSize);
+                timegrp_commonQuery(this,this.timegrpform.timegrpname,this.currPage,this.pageSize);
             },
             addTimegrp:function (formName) {
-                getFillData(this,"-1");
+                timegrp_getFillData(this,"-1");
                 this.dialogFormVisible = true;
                 this.timegrptitle="添加时间组"
             },
@@ -273,39 +273,39 @@
                         }
                     });
                 if (vali==true){
-                    saveData(_that,_that.timegrpDiaForm,formName);
+                    timegrp_saveData(_that,_that.timegrpDiaForm,formName);
 
                 }
 
             },
             editTimegrp:function (deviceid) {
-                getFillData(this,deviceid);
+                timegrp_getFillData(this,deviceid);
                 this.dialogFormVisible = true;
                 this.timegrptitle="修改时间组"
             },
             time1for:function(row){
-                return timename(row.timeid1);
+                return timegrp_timename(row.timeid1);
             },
             time2for:function(row){
-                return timename(row.timeid2);
+                return timegrp_timename(row.timeid2);
             },
             time3for:function(row){
-                return timename(row.timeid3);
+                return timegrp_timename(row.timeid3);
             },
             time4for:function(row){
-                return timename(row.timeid4);
+                return timegrp_timename(row.timeid4);
             },
             time5for:function(row){
-                return timename(row.timeid5);
+                return timegrp_timename(row.timeid5);
             },
             time6for:function(row){
-                return timename(row.timeid6);
+                return timegrp_timename(row.timeid6);
             },
             time7for:function(row){
-                return timename(row.timeid7);
+                return timegrp_timename(row.timeid7);
             },
             time8for:function(row){
-                return timename(row.timeid8);
+                return timegrp_timename(row.timeid8);
             },
         },
         created:function(){
@@ -333,10 +333,10 @@
 
     })
 
-    function timename(timeid){
+    function timegrp_timename(timeid){
 //        console.log(typeof timeid)
         if(timeid!=null){
-            var list = vue.timeList;
+            var list = timegrp_vue.timeList;
             for(var i=0;i<list.length;i++){
                 if(list[i].value == timeid){
                     return list[i].label;
@@ -345,7 +345,7 @@
         }
     }
 
-    function commonQuery(_self,timegrpname,pageno,pagesize) {
+    function timegrp_commonQuery(_self,timegrpname,pageno,pagesize) {
         $.ajax({
             type:"get",
             dataType:"json",
@@ -369,7 +369,7 @@
         })
     }
 
-    function getFillData(_self,id){
+    function timegrp_getFillData(_self,id){
         $.ajax({
             type:"get",
             dataType:"json",
@@ -394,12 +394,12 @@
         })
     }
 
-    function saveData(_that,formdata,formName) {
+    function timegrp_saveData(_that,formdata,formName) {
         var url;
-        if(vue.timegrptitle == "添加时间组"){
+        if(timegrp_vue.timegrptitle == "添加时间组"){
             url = encodeURI("[[@{/ncmgr/addNcTimegrp}]]");
         }
-        if(vue.timegrptitle == "修改时间组"){
+        if(timegrp_vue.timegrptitle == "修改时间组"){
             url = encodeURI("[[@{/ncmgr/updateNcTimegrp}]]");
         }
         var timeid1=formdata.timeid1;
@@ -436,7 +436,7 @@
                         layer.msg(data.errStr, {icon: 2,time:1000});
                     } else {
                         layer.msg('保存信息成功!', {icon: 1,time:1000});
-                        refreshThisTable();
+                        timegrp_refreshThisTable();
                         _that.$refs[formName].resetFields();
                         _that.dialogFormVisible = false;
                     }
@@ -445,11 +445,11 @@
         }
     }
 
-    function refreshThisTable(){
-        commonQuery(vue,vue.timegrpform.timegrpname,vue.currPage,vue.pageSize);
+    function timegrp_refreshThisTable(){
+        timegrp_commonQuery(timegrp_vue,timegrp_vue.timegrpform.timegrpname,timegrp_vue.currPage,timegrp_vue.pageSize);
     };
 
-    function deletedata(id){
+    function timegrp_deletedata(id){
         layer.confirm('你确定要删除选择的时间组吗?', {icon: 3, title:'请确认',offset:'30%'}, function(index){
             $.ajax({
                 type:"get",
@@ -467,10 +467,10 @@
                     }else{
                         if(ret.flag==0){
                             layer.msg('删除成功', {icon: 1,time:1000});
-                            refreshThisTable();
+                            timegrp_refreshThisTable();
                         }else {
                             layer.msg(ret.message, {icon:2,time:3000});
-                            refreshThisTable();
+                            timegrp_refreshThisTable();
                         }
                     }
                 }
diff --git a/src/main/resources/templates/ncmgr/nc_weektime.html b/src/main/resources/templates/ncmgr/nc_weektime.html
index 482fe7d..c5cee30 100644
--- a/src/main/resources/templates/ncmgr/nc_weektime.html
+++ b/src/main/resources/templates/ncmgr/nc_weektime.html
@@ -15,7 +15,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-input v-model="weektimeform.weektimename" id="weektimename"></el-input>
+                            <el-input v-model="weektimeform.weektimename"></el-input>
                         </div>
                     </div>
                 </div>
@@ -23,7 +23,7 @@
 
                 <div    class="col-md-3">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="weektime_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addWeektime">添加时间周</button>
                     </div>
                 </div>
@@ -221,7 +221,7 @@
 </div>
 
 <script>
-    var vue = new Vue({
+    var weektime_vue = new Vue({
         el: '#weektimeapp',
         data:{
             tableData: [],
@@ -256,25 +256,25 @@
         methods: {
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                commonQuery(this,this.weektimeform.weektimename,this.currPage,val);
+                weektime_commonQuery(this,this.weektimeform.weektimename,this.currPage,val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                commonQuery(this,this.weektimeform.weektimename,this.currPage,this.pageSize);
+                weektime_commonQuery(this,this.weektimeform.weektimename,this.currPage,this.pageSize);
             },
             currRowChange:function(val) {
                 this.currentRow = val;
             },
             delWeektime:function (row) {
-                deletedata(row);
+                weektime_deletedata(row);
             },
             query:function () {
                 this.pagesize=10;
                 this.currPage=1;
-                commonQuery(this,this.weektimeform.weektimename,this.currPage,this.pageSize);
+                weektime_commonQuery(this,this.weektimeform.weektimename,this.currPage,this.pageSize);
             },
             addWeektime:function (formName) {
-                getFillData(this,"-1");
+                weektime_getFillData(this,"-1");
                 this.dialogFormVisible = true;
                 this.weektimetitle="添加时间周";
             },
@@ -294,36 +294,36 @@
                         }
                     });
                 if (vali==true){
-                    saveData(_that,_that.weektimeDiaForm,formName);
+                    weektime_saveData(_that,_that.weektimeDiaForm,formName);
 
                 }
 
             },
             editWeektime:function (id) {
-                getFillData(this,id);
+                weektime_getFillData(this,id);
                 this.dialogFormVisible = true;
                 this.weektimetitle="修改时间周"
             },
             day1for:function (row) {
-                return grpname(row.day1grpid);
+                return weektime_grpname(row.day1grpid);
             },
             day2for:function (row) {
-                return grpname(row.day2grpid);
+                return weektime_grpname(row.day2grpid);
             },
             day3for:function (row) {
-                return grpname(row.day3grpid);
+                return weektime_grpname(row.day3grpid);
             },
             day4for:function (row) {
-                return grpname(row.day4grpid);
+                return weektime_grpname(row.day4grpid);
             },
             day5for:function (row) {
-                return grpname(row.day5grpid);
+                return weektime_grpname(row.day5grpid);
             },
             day6for:function (row) {
-                return grpname(row.day6grpid);
+                return weektime_grpname(row.day6grpid);
             },
             day7for:function (row) {
-                return grpname(row.day7grpid);
+                return weektime_grpname(row.day7grpid);
             },
 
         },
@@ -352,10 +352,10 @@
 
     })
 
-    function grpname(grpid){
+    function weektime_grpname(grpid){
 //        console.log(typeof timeid)
         if(grpid!=null){
-            var list = vue.timegrplist;
+            var list = weektime_vue.timegrplist;
             for(var i=0;i<list.length;i++){
                 if(list[i].value == grpid){
                     return list[i].label;
@@ -364,7 +364,7 @@
         }
     }
 
-    function commonQuery(_self,weektimename,pageno,pagesize) {
+    function weektime_commonQuery(_self,weektimename,pageno,pagesize) {
         $.ajax({
             type:"get",
             dataType:"json",
@@ -379,7 +379,7 @@
         })
     }
 
-    function getFillData(_self,id){
+    function weektime_getFillData(_self,id){
         $.ajax({
             type:"get",
             dataType:"json",
@@ -404,12 +404,12 @@
         })
     }
 
-    function saveData(_that,formdata,formName) {
+    function weektime_saveData(_that,formdata,formName) {
         var url;
-        if(vue.weektimetitle == "添加时间周"){
+        if(weektime_vue.weektimetitle == "添加时间周"){
             url = encodeURI("[[@{/ncmgr/addNcweektime}]]");
         }
-        if(vue.weektimetitle == "修改时间周"){
+        if(weektime_vue.weektimetitle == "修改时间周"){
             url = encodeURI("[[@{/ncmgr/updateNcweektime}]]");
         }
         var timeid1=formdata.day1grpid;
@@ -445,7 +445,7 @@
                         layer.msg(data.errStr, {icon: 2, time: 1000});
                     } else {
                         layer.msg('保存信息成功!', {icon: 1, time: 1000});
-                        refreshThisTable();
+                        weektime_refreshThisTable();
                         _that.$refs[formName].resetFields();
                         _that.dialogFormVisible = false;
                     }
@@ -454,11 +454,11 @@
         }
     }
 
-    function refreshThisTable(){
-        commonQuery(vue,vue.weektimeform.weektimename,vue.currPage,vue.pageSize);
+    function weektime_refreshThisTable(){
+        weektime_commonQuery(weektime_vue,weektime_vue.weektimeform.weektimename,weektime_vue.currPage,weektime_vue.pageSize);
     };
 
-    function deletedata(id){
+    function weektime_deletedata(id){
         layer.confirm('你确定要删除选择的时间周吗?', {icon: 3, title:'请确认',offset:'30%'}, function(index){
             $.ajax({
                 type:"get",
@@ -476,7 +476,7 @@
                     }else{
                         if(ret.flag==0) {
                             layer.msg('删除成功', {icon: 1, time: 1000});
-                            refreshThisTable();
+                            weektime_refreshThisTable();
                         }else {
                             layer.msg(ret.message, {icon:2,time:3000});
                         }
diff --git a/src/main/resources/templates/query/tdoorstream.html b/src/main/resources/templates/query/tdoorstream.html
index 41e6510..3e9c138 100644
--- a/src/main/resources/templates/query/tdoorstream.html
+++ b/src/main/resources/templates/query/tdoorstream.html
@@ -95,9 +95,9 @@
 
                     <el-col :span="8" >
                         <button type="button" class="btn btn-info" @click="query"
-                                id="qrybtn" style="margin-left:95px">查 询</button>
+                                id="tdoorstream_qrybtn" style="margin-left:95px">查 询</button>
                         <button type="button" class="btn btn-info" @click="excel"
-                                id="eclbtn">导出Excel</button>
+                                id="tdoorstream_eclbtn">导出Excel</button>
                     </el-col>
                 </el-row>
             </el-form>
@@ -157,7 +157,7 @@
 </div>
 
 <script>
-    var vue = new Vue({
+    var tdoorstream_vue = new Vue({
         el : '#tdoorstream',
         data : {
             loading:'',
@@ -174,7 +174,7 @@
             },
             pickerOptions1: {
                 disabledDate:function(time) {
-                    return time.getTime() <vue.starttransdate.getTime();
+                    return time.getTime() <tdoorstream_vue.starttransdate.getTime();
                 }
             },
             tlist:[],
@@ -209,13 +209,13 @@
             handleSizeChange : function(val) {
                 this.loading=true;
                 this.pageSize = val;
-                commonQuery(this,this.starttransdate,this.endtransdate,  this.currPage, val);
+                tdoorstream_commonQuery(this,this.starttransdate,this.endtransdate,  this.currPage, val);
                 //console.log('每页条'+val);
             },
             currPageChange : function(val) {
                 this.loading=true;
                 this.currPage = val;
-                commonQuery(this,this.starttransdate,this.endtransdate,  this.currPage, this.pageSize);
+                tdoorstream_commonQuery(this,this.starttransdate,this.endtransdate,  this.currPage, this.pageSize);
                 //console.log('当前页:'+val);
             },
             currRowChange : function(val) {
@@ -226,7 +226,7 @@
                 this.loading=true;
                 this.pagesize = 10;
                 this.currPage = 1;
-                commonQuery(this,this.starttransdate,this.endtransdate,  this.currPage,this.pageSize);
+                tdoorstream_commonQuery(this,this.starttransdate,this.endtransdate,  this.currPage,this.pageSize);
                 //console.log(this.currentRow);
             },
             excel:function(){
@@ -236,20 +236,20 @@
                     cancelButtonText: '取消',
                     type: 'warning'
                 }).then(function(){
-                    downloadExcel(_self,_self.starttransdate,_self.endtransdate);
+                    tdoorstream_downloadExcel(_self,_self.starttransdate,_self.endtransdate);
                 });
             },
             regionChange:function(value){
                 this.buildings=[];
                 this.tdoorstream.buildingid='';
-                getRegionBuilding(this,value);
+                tdoorstream_getRegionBuilding(this,value);
             },
         },
         created : function() {
             this.loading=true;
             var _self = this;
-            var starttransdate = Formatdate(_self.starttransdate);
-            var endtransdate = Formatdate(_self.endtransdate);
+            var starttransdate = tdoorstream_Formatdate(_self.starttransdate);
+            var endtransdate =tdoorstream_Formatdate(_self.endtransdate);
 
             $.ajax({
                 type : "get",
@@ -297,13 +297,13 @@
         }
 
     })
-    function downloadExcel(_self, Ustarttransdate,Uendtransdate) {
+    function tdoorstream_downloadExcel(_self, Ustarttransdate,Uendtransdate) {
         var factoryid = _self.tdoorstream.factoryid;
         if(factoryid==''){
             factoryid='all';
         }
-        var starttransdate = Formatdate(Ustarttransdate);
-        var endtransdate = Formatdate(Uendtransdate);
+        var starttransdate = tdoorstream_Formatdate(Ustarttransdate);
+        var endtransdate = tdoorstream_Formatdate(Uendtransdate);
         var stuempno = _self.tdoorstream.stuempno;
         var custname = _self.tdoorstream.custname;
         var buildingid = _self.tdoorstream.buildingid;
@@ -322,10 +322,10 @@
 
     }
 
-    function commonQuery(_self, Ustarttransdate,Uendtransdate,pageno, pagesize) {
+    function tdoorstream_commonQuery(_self, Ustarttransdate,Uendtransdate,pageno, pagesize) {
         var factoryid = _self.tdoorstream.factoryid;
-        var starttransdate = Formatdate(Ustarttransdate);
-        var endtransdate = Formatdate(Uendtransdate);
+        var starttransdate = tdoorstream_Formatdate(Ustarttransdate);
+        var endtransdate = tdoorstream_Formatdate(Uendtransdate);
         var stuempno = _self.tdoorstream.stuempno;
         var custname = _self.tdoorstream.custname;
         var buildingid = _self.tdoorstream.buildingid;
@@ -350,7 +350,7 @@
             }
         })
     }
-    function Formatdate(date){
+    function tdoorstream_Formatdate(date){
         if(date==null||date==''){
             return '';
         }
@@ -367,7 +367,7 @@
 
         return formated;
     }
-    function Formattime(time){
+    function tdoorstream_Formattime(time){
         if(time==null||time==''){
             return '';
         }
@@ -389,7 +389,7 @@
         return formated;
     }
 
-    function getRegionBuilding(_self,value){
+    function tdoorstream_getRegionBuilding(_self,value){
         $.ajax({
             type: "get",
             dataType: "json",
diff --git a/src/main/resources/templates/system/building.html b/src/main/resources/templates/system/building.html
index 90795bd..dc6518e 100644
--- a/src/main/resources/templates/system/building.html
+++ b/src/main/resources/templates/system/building.html
@@ -28,14 +28,14 @@
                                style="font-size: 14px;">楼栋名称:</span>
                         </label>
                         <div class="col-md-7 col-sm-12 col-xs-12">
-                            <el-input v-model="buildingform.buildingname" id="buildingname"></el-input>
+                            <el-input v-model="buildingform.buildingname"></el-input>
                         </div>
                     </div>
                 </div>
 
                 <div class="col-md-3">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="building_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addBuilding">添加楼栋</button>
                     </div>
                 </div>
@@ -150,7 +150,7 @@
 </div>
 
 <script>
-    var vue = new Vue({
+    var building_vue = new Vue({
         el: '#buildingApp',
         data:{
             tableData: [],
@@ -189,11 +189,11 @@
         methods: {
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,val);
+                building_commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,this.pageSize);
+                building_commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,this.pageSize);
             },
             currRowChange:function(val) {
                 this.currentRow = val;
@@ -201,14 +201,14 @@
             query:function () {
                 this.pagesize=10;
                 this.currPage=1;
-                commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,this.pageSize);
+                building_commonQuery(this,this.buildingform.regionid,this.buildingform.buildingname,this.currPage,this.pageSize);
             },
             addBuilding:function () {
-                getFillData(this,"-1");
+                building_getFillData(this,"-1");
                 this.dialogFormVisible = true;
                 this.buildingtitile="添加楼栋";
             },
-            resetForm:function() {
+            resetForm:function(formName) {
                 this.$refs[formName].resetFields();
                 this.dialogFormVisible = false;
             },
@@ -224,21 +224,21 @@
                         }
                     });
                 if (vali==true){
-                    saveData(_that,_that.buildingDiaForm,formName);
+                    building_saveData(_that,_that.buildingDiaForm,formName);
                 }
             },
             delBuilding:function(buildingid){
-                deletedata(buildingid);
+                building_deletedata(buildingid);
             },
 
             editBuilding:function (buildingid) {
-                getFillData(this,buildingid);
+                building_getFillData(this,buildingid);
                 this.dialogFormVisible = true;
                 this.buildingtitile="修改楼栋"
             },
             updform: function (row, column, cellValue) {
                 if (row.updtime != null) {
-                    return timeformatter(row.updtime);
+                    return building_timeformatter(row.updtime);
                 }
             }
         },
@@ -261,14 +261,14 @@
                                 label: rlist[i].regionname
                             });
                         }
-                        vue.regionlist = rows;
+                        building_vue.regionlist = rows;
                     }
                 }
             })
         }
     })
 
-    function commonQuery(_self,regionid,buildingname,pageno,pagesize) {
+    function building_commonQuery(_self,regionid,buildingname,pageno,pagesize) {
         $.ajax({
             type:"get",
             dataType:"json",
@@ -282,7 +282,7 @@
         })
     }
 
-    function getFillData(_self, id) {
+    function building_getFillData(_self, id) {
         $.ajax({
             type: "get",
             dataType: "json",
@@ -301,7 +301,7 @@
                     _self.buildingDiaForm.buildingid = ret.building.buildingid;
                     _self.buildingDiaForm.buildingname = ret.building.buildingname;
                     _self.buildingDiaForm.buildingdesc = ret.building.buildingdesc;
-                    _self.buildingDiaForm.regionid = ret.region.regionid;
+                    _self.buildingDiaForm.regionid = ret.building.regionid;
                 }
 
                 _self.regions = regionslist;
@@ -309,12 +309,12 @@
         })
     }
 
-    function saveData(_that,formdata,formName) {
+    function building_saveData(_that,formdata,formName) {
         var url = null;
-        if(vue.buildingtitile == "添加楼栋"){
+        if(building_vue.buildingtitile == "添加楼栋"){
             url = encodeURI("[[@{/system/addBuilding}]]");
         }
-        if(vue.buildingtitile == "修改楼栋"){
+        if(building_vue.buildingtitile == "修改楼栋"){
             url = encodeURI("[[@{/system/updateBuilding}]]")
         }
         var token=$("meta[name='_csrf_token']").attr("value");
@@ -334,7 +334,7 @@
                     layer.msg(data.errStr, {icon: 2,time:1000});
                 } else {
                     layer.msg('保存信息成功!', {icon: 1,time:1000});
-                    refreshThisTable();
+                    building_refreshThisTable();
                     _that.$refs[formName].resetFields();
                     _that.dialogFormVisible = false;
                 }
@@ -342,7 +342,7 @@
         });
     }
 
-    function deletedata(buildingid){
+    function building_deletedata(buildingid){
         layer.confirm('是否删除该楼栋', {icon: 3, title:'请确认',offset:'30%'},function(index){
             $.ajax({
                 type:"get",
@@ -358,7 +358,7 @@
                         layer.msg(ret.message, {icon: 2, time: 1000});
                     } else {
                         layer.msg('删除成功', {icon: 1, time: 1000});
-                        refreshThisTable();
+                        building_refreshThisTable();
                     }
                 }
             })
@@ -366,11 +366,11 @@
     }
 
 
-    function refreshThisTable(){
-        commonQuery(vue,vue.buildingform.regionid,vue.buildingform.buildingname,vue.currPage,vue.pageSize);
+    function building_refreshThisTable(){
+        building_commonQuery(building_vue,building_vue.buildingform.regionid,building_vue.buildingform.buildingname,building_vue.currPage,building_vue.pageSize);
     };
 
-    function timeformatter(time) {
+    function building_timeformatter(time) {
 
         return time.substr(0, 4) + '-' + time.substr(4, 2) + '-' + time.substr(6, 2) + ' '
             + time.substr(8, 2) + ':' + time.substr(10, 2) + ':' + time.substr(12, 2);
diff --git a/src/main/resources/templates/system/dictionary.html b/src/main/resources/templates/system/dictionary.html
index b9b72f6..64ee61b 100644
--- a/src/main/resources/templates/system/dictionary.html
+++ b/src/main/resources/templates/system/dictionary.html
@@ -28,14 +28,14 @@
                                style="font-size: 14px;">字典名称:</span>
                         </label>
                         <div class="col-md-7 col-sm-12 col-xs-12">
-                            <el-input v-model="dictcaption" id="dictcaption"></el-input>
+                            <el-input v-model="dictcaption" ></el-input>
                         </div>
                     </div>
                 </div>
 
                 <div class="col-md-3">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="dict_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addDict">添加</button>
                     </div>
                 </div>
@@ -100,12 +100,12 @@
                 <el-form ref="dict" :model="dict" :rules="rules" label-width="120px">
                     <el-form-item label="字典编号:" prop="dicttype">
                         <el-col :span="22">
-                            <el-input v-model="dict.dicttype" id="dicttype"></el-input>
+                            <el-input v-model="dict.dicttype" id="dict_dicttype"></el-input>
                         </el-col>
                     </el-form-item>
                     <el-form-item label="字典类型名称:">
                         <el-col :span="22">
-                            <el-input v-model="dict.dicttypename" id="dicttypename"></el-input>
+                            <el-input v-model="dict.dicttypename" id="dict_dicttypename"></el-input>
                         </el-col>
                     </el-form-item>
                     <el-form-item label="字典值:" prop="dictval">
@@ -131,7 +131,7 @@
 </div>
 
 <script>
-    var vue = new Vue({
+    var dict_vue = new Vue({
         el: '#dictionary',
         data:{
             tableData: [],
@@ -166,11 +166,11 @@
         methods: {
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                commonQuery(this,this.dicttype,this.dictcaption,this.currPage,val);
+                dict_commonQuery(this,this.dicttype,this.dictcaption,this.currPage,val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                commonQuery(this,this.dicttype,this.dictcaption,this.currPage,this.pageSize);
+                dict_commonQuery(this,this.dicttype,this.dictcaption,this.currPage,this.pageSize);
             },
             currRowChange:function(val) {
                 this.currentRow = val;
@@ -178,31 +178,31 @@
             query:function () {
                 this.pagesize=10;
                 this.currPage=1;
-                commonQuery(this,this.dicttype,this.dictcaption,this.currPage,this.pageSize);
+                dict_commonQuery(this,this.dicttype,this.dictcaption,this.currPage,this.pageSize);
             },
             addDict:function () {
-                disableSwitch(0);
+                dict_disableSwitch(0);
                 this.dialogFormVisible = true;
                 this.opertitle="添加字典 ";
             },
             resetForm:function() {
-                ResetForm(this);
+                dict_ResetForm(this);
                 this.dialogFormVisible = false
                 this.dialogFormVisible2 = false
             },
 
             saveDict:function (dict) {
                 if(this.opertitle=='字典修改'){
-                    updateData(dict,this.oriengal);
+                    dict_updateData(dict,this.oriengal);
                 }else if(this.opertitle=='添加字典 '){
-                    saveData(dict);
+                    dict_saveData(dict);
                 }else{
-                    saveAdditionalData(dict);
+                    dict_saveAdditionalData(dict);
                 }
             },
 
             additionalDict:function(id,name){
-                disableSwitch(1);
+                dict_disableSwitch(1);
                 this.dict.dicttype=id;
                 this.dict.dicttypename=name;
                 this.opertitle="添加字典";
@@ -210,7 +210,7 @@
 
             },
             editDict:function (id,name,val,caption) {
-                disableSwitch(1);
+                dict_disableSwitch(1);
                 this.dict.dictval=val;
                 this.dict.dictcaption=caption;
                 this.dict.dicttype=id;
@@ -239,11 +239,11 @@
                     _self.tableData=ret.pageResult.list;
                 }
             })
-            fillSelect(_self);
+            dict_fillSelect(_self);
         }
     })
 
-    function commonQuery(_self,dicttype,dictcaption,pageno,pagesize) {
+    function dict_commonQuery(_self,dicttype,dictcaption,pageno,pagesize) {
         $.ajax({
             type:"get",
             dataType:"json",
@@ -257,8 +257,8 @@
         })
     }
 
-    function saveData(dict) {
-        var tlist=vue.tlist;
+    function dict_saveData(dict) {
+        var tlist=dict_vue.tlist;
 
 
         $.ajax({
@@ -277,13 +277,13 @@
                     layer.msg(data.errStr, {icon: 2,time:1000});
                 } else {
                     layer.msg('保存成功!', {icon: 1,time:1000});
-                    refreshThisTable();
-                    vue.dialogFormVisible = false
+                    dict_refreshThisTable();
+                    dict_vue.dialogFormVisible = false
                 }
             }
         });
     }
-    function updateData(dict,oriengal) {
+    function dict_updateData(dict,oriengal) {
         $.ajax({
             type: "get",
             dataType: "json",
@@ -301,14 +301,14 @@
                     layer.msg(data.errStr, {icon: 2,time:1000});
                 } else {
                     layer.msg('修改成功!', {icon: 1,time:1000});
-                    refreshThisTable();
-                    vue.dialogFormVisible = false
+                    dict_refreshThisTable();
+                    dict_vue.dialogFormVisible = false
                 }
             }
         });
     }
 
-    function saveAdditionalData(dict){
+    function dict_saveAdditionalData(dict){
         $.ajax({
             type: "get",
             dataType: "json",
@@ -325,26 +325,26 @@
                     layer.msg(data.errStr, {icon: 2,time:1000});
                 } else {
                     layer.msg('添加成功!', {icon: 1,time:1000});
-                    refreshThisTable();
-                    vue.dialogFormVisible = false
+                    dict_refreshThisTable();
+                    dict_vue.dialogFormVisible = false
                 }
             }
         });
     }
-    function ResetForm(_self){
+    function dict_ResetForm(_self){
         _self.$refs.dict.resetFields();
         _self.dict.dicttypename='';
         _self.dict.dicttype='';
         _self.dict.dictval='';
         _self.dict.dictcaption=caption='';
     }
-    function refreshThisTable(){
-        commonQuery(vue,vue.dicttype,vue.dictcaption,vue.currPage,vue.pageSize);
-        ResetForm(vue);
-        fillSelect(vue);
+    function dict_refreshThisTable(){
+        dict_commonQuery(vue,vue.dicttype,vue.dictcaption,vue.currPage,vue.pageSize);
+        dict_ResetForm(vue);
+        dict_fillSelect(vue);
     };
 
-    function fillSelect(_self){
+    function dict_fillSelect(_self){
         $.ajax({
             type : "get",
             dataType : "json",
@@ -375,19 +375,19 @@
             }
         })
     }
-    function disableSwitch(n){
+    function dict_disableSwitch(n){
         if(n==1){
             $.ajax({
                 success:function(ret){
-                    $('#dicttype').children()[0].setAttribute("disabled", "disabled");
-                    $('#dicttypename').children()[0].setAttribute("disabled", "disabled");
+                    $('#dict_dicttype').children()[0].setAttribute("disabled", "disabled");
+                    $('#dict_dicttypename').children()[0].setAttribute("disabled", "disabled");
                 }
             })
         }else{
             $.ajax({
                 success:function(ret){
-                    $('#dicttype').children()[0].removeAttribute("disabled");
-                    $('#dicttypename').children()[0].removeAttribute("disabled");
+                    $('#dict_dicttype').children()[0].removeAttribute("disabled");
+                    $('#dict_dicttypename').children()[0].removeAttribute("disabled");
                 }
             })
         }
diff --git a/src/main/resources/templates/system/operator.html b/src/main/resources/templates/system/operator.html
index 2a05b42..a79978d 100644
--- a/src/main/resources/templates/system/operator.html
+++ b/src/main/resources/templates/system/operator.html
@@ -31,7 +31,7 @@
                 </div>
                 <div class="col-md-3">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="oper_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addOperator">添加操作员</button>
                     </div>
                 </div>
@@ -264,7 +264,7 @@
 </div>
 
 <script>
-    var vue = new Vue({
+    var oper_vue = new Vue({
         el:'#operatorapp',
         data:{
             tableData:[],
@@ -337,12 +337,12 @@
         methods:{
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,val);
+                oper_commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,val);
                 //console.log('每页条'+val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,this.pageSize);
+                oper_commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,this.pageSize);
                 //console.log('当前页:'+val);
             },
             currRowChange:function(val) {
@@ -351,18 +351,18 @@
             query:function(){
                 this.pagesize=10;
                 this.currPage=1;
-                commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,this.pageSize);
+                oper_commonQuery(this,this.operatorform.operid,this.operatorform.realname,this.currPage,this.pageSize);
             },
             addOperator:function () {
-                getFillData(this,"-1");
+                oper_getFillData(this,"-1");
                 this.dialogFormVisible = true;
                 this.operatortitile="添加操作员(默认密码为123456)"
             },
             delOperator:function(operid){
-                deletedata(operid);
+                oper_deletedata(operid);
             },
             editOperator:function(operid){
-                getFillData(this,operid);
+                oper_getFillData(this,operid);
                 this.dialogFormVisible = true;
                 this.operatortitile="修改操作员(默认密码为123456)"
             },
@@ -382,7 +382,7 @@
                         }
                     });
                 if (vali==true){
-                    saveData(_that,_that.operatorDiaForm,formName);
+                    oper_saveData(_that,_that.operatorDiaForm,formName);
                 }
             },
             opertypeChange: function (value) {
@@ -410,7 +410,7 @@
                 }
             },
             resetPwd:function (operid) {
-                resetpwd(operid);
+                oper_resetpwd(operid);
             },
             allotBuilding:function (operid,opername) {
                 this.buildingTitle="正在为["+opername+"]分配设备"
@@ -419,7 +419,7 @@
                     label: opername
                 })
                 this.operBuildingDiaform.operid = operid
-                getBuildingData(this,operid);
+                oper_getBuildingData(this,operid);
                 this.dlgAllotBuildingVisible=true;
 
             },
@@ -474,11 +474,11 @@
         }
     })
 
-    function refreshThisTable(){
-        commonQuery(vue,vue.operatorform.operid,vue.operatorform.realname,vue.currPage,vue.pageSize);
+    function oper_refreshThisTable(){
+        oper_commonQuery(oper_vue,oper_vue.operatorform.operid,oper_vue.operatorform.realname,oper_vue.currPage,oper_vue.pageSize);
     };
 
-    function commonQuery(_self,operid,realname,pageno,pagesize){
+    function oper_commonQuery(_self,operid,realname,pageno,pagesize){
         $.ajax({
             type: "get",
             dataType: "json",
@@ -493,7 +493,7 @@
         })
     }
 
-    function deletedata(operid){
+    function oper_deletedata(operid){
         layer.confirm('是否删除该操作员', {icon: 3, title:'请确认',offset:'30%'},function(index){
             $.ajax({
                 type:"get",
@@ -509,7 +509,7 @@
                         layer.msg(ret.message, {icon: 2, time: 1000});
                     } else {
                         layer.msg('删除成功', {icon: 1, time: 1000});
-                        refreshThisTable();
+                        oper_refreshThisTable();
                     }
                 }
             })
@@ -517,7 +517,7 @@
     }
 
 
-    function getFillData(_self, id) {
+    function oper_getFillData(_self, id) {
         $.ajax({
             type: "get",
             dataType: "json",
@@ -573,12 +573,12 @@
 
 
 
-    function saveData(_that,formdata,formName){
+    function oper_saveData(_that,formdata,formName){
         var url = null;
-        if(vue.operatortitile == "添加操作员(默认密码为123456)"){
+        if(oper_vue.operatortitile == "添加操作员(默认密码为123456)"){
             url = encodeURI("[[@{/operator/addOperator}]]");
         }
-        if(vue.operatortitile == "修改操作员(默认密码为123456)"){
+        if(oper_vue.operatortitile == "修改操作员(默认密码为123456)"){
             url = encodeURI("[[@{/operator/updateOperator}]]")
         }
         var token=$("meta[name='_csrf_token']").attr("value");
@@ -598,7 +598,7 @@
                     layer.msg(data.errStr, {icon: 2,time:1000});
                 } else {
                     layer.msg('保存信息成功!', {icon: 1,time:1000});
-                    refreshThisTable();
+                    oper_refreshThisTable();
                     _that.$refs[formName].resetFields();
                     _that.dialogFormVisible = false;
                 }
@@ -607,7 +607,7 @@
     }
 
 
-    function resetpwd(operid){
+    function oper_resetpwd(operid){
         layer.confirm('是否重置该操作员密码?', {icon: 3, title:'请确认'}, function(index){
             $.ajax({
                 type:"get",
@@ -623,7 +623,7 @@
                     if (ret.code != 200) {
                         layer.msg(ret.message, {icon:2,time:1000});
                     }else{
-                        layer.msg(ret.message, {icon: 1,time:1000});
+                        layer.msg("操作成功，密码重置为123456", {icon: 1,time:1000});
 
                     }
                 }
@@ -631,7 +631,7 @@
         });
     };
 
-    function getBuildingData(_that,operid) {
+    function oper_getBuildingData(_that,operid) {
         $.ajax({
             type:"get",
             dataType:"json",
diff --git a/src/main/resources/templates/system/region.html b/src/main/resources/templates/system/region.html
index 0004100..d84fadb 100644
--- a/src/main/resources/templates/system/region.html
+++ b/src/main/resources/templates/system/region.html
@@ -15,13 +15,13 @@
                         <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">区域名称:</span>
                         </label>
                         <div class="col-md-8 col-sm-12 col-xs-12">
-                            <el-input v-model="regionform.regionname" id="regionname"></el-input>
+                            <el-input v-model="regionform.regionname" ></el-input>
                         </div>
                     </div>
                 </div>
                 <div class="col-md-3">
                     <div class="form-group">
-                        <button type="button" class="btn btn-info" @click="query" id="qrybtn">查 询</button>
+                        <button type="button" class="btn btn-info" @click="query" id="region_qrybtn">查 询</button>
                         <button class="btn btn-primary" type="button" @click="addRegion">添加区域</button>
                         <!--<button class="btn btn-info" type="button" @click="lookTree">查看区域树形图</button>-->
                     </div>
@@ -173,7 +173,7 @@
 </div>
 
 <script>
-    var vue = new Vue({
+    var region_vue = new Vue({
         el:'#regionapp',
         data:{
             tableData:[],
@@ -219,12 +219,12 @@
         methods:{
             handleSizeChange:function(val) {
                 this.pageSize=val;
-                commonQuery(this,this.regionform.regionname,this.currPage,val);
+                region_commonQuery(this,this.regionform.regionname,this.currPage,val);
                 //console.log('每页条'+val);
             },
             currPageChange:function(val) {
                 this.currPage=val;
-                commonQuery(this,this.regionform.regionname,this.currPage,this.pageSize);
+                region_commonQuery(this,this.regionform.regionname,this.currPage,this.pageSize);
                 //console.log('当前页:'+val);
             },
             currRowChange:function(val) {
@@ -233,19 +233,19 @@
             query:function(){
                 this.pagesize=10;
                 this.currPage=1;
-                commonQuery(this,this.regionform.regionname,this.currPage,this.pageSize);
+                region_commonQuery(this,this.regionform.regionname,this.currPage,this.pageSize);
             },
             addRegion:function () {
-                getFillData(this,"-1");
+                region_getFillData(this,"-1");
                 this.dialogFormVisible = true;
-                this.regiontitle="添加区域"
+                this.regiontitile="添加区域"
             },
             delRegion:function(regionid){
-                deletedata(regionid);
+                region_deletedata(regionid);
             },
             editRegion:function(regionid){
                 this.parentRegionDis=false;
-                getFillData(this,regionid);
+                region_getFillData(this,regionid);
                 this.dialogFormVisible = true;
                 this.regiontitile="修改区域"
             },
@@ -265,7 +265,7 @@
                         }
                     });
                 if (vali==true){
-                    saveData(_that,_that.regionDiaForm,formName);
+                    region_saveData(_that,_that.regionDiaForm,formName);
                 }
             },
             levelChange: function (value) {
@@ -273,7 +273,7 @@
                     this.parentRegionDis = true;
                 } else  {
                     this.parentRegionDis = false;
-                    getFregion(this,value);
+                    region_getFregion(this,value);
                 }
             },
             levelform: function (row, column, cellValue) {
@@ -295,11 +295,11 @@
         }
     })
 
-    function refreshThisTable(){
-        commonQuery(vue,vue.regionform.regionname,vue.currPage,vue.pageSize);
+    function region_refreshThisTable(){
+        region_commonQuery(region_vue,region_vue.regionform.regionname,region_vue.currPage,region_vue.pageSize);
     };
 
-    function commonQuery(_self,regionname,pageno,pagesize){
+    function region_commonQuery(_self,regionname,pageno,pagesize){
         $.ajax({
             type: "get",
             dataType: "json",
@@ -314,7 +314,7 @@
         })
     }
 
-    function deletedata(regionid){
+    function region_deletedata(regionid){
         layer.confirm('是否删除该区域', {icon: 3, title:'请确认',offset:'30%'},function(index){
             $.ajax({
                 type:"get",
@@ -330,7 +330,7 @@
                         layer.msg(ret.message, {icon: 2, time: 1000});
                     } else {
                         layer.msg('删除成功', {icon: 1, time: 1000});
-                        refreshThisTable();
+                        region_refreshThisTable();
                     }
                 }
             })
@@ -338,7 +338,7 @@
     }
 
 
-    function getFillData(_self, id) {
+    function region_getFillData(_self, id) {
         $.ajax({
             type: "get",
             dataType: "json",
@@ -359,7 +359,7 @@
                 if (ret.region != null) {
                     _self.regionDiaForm.regionid = ret.region.regionid;
                     _self.regionDiaForm.regionname = ret.region.regionname;
-                    _self.regionDiaForm.level = ret.region.level;
+                    _self.regionDiaForm.level = ret.region.level+"";
                     _self.regionDiaForm.parentid = ret.region.parentid;
                     _self.regionDiaForm.address = ret.region.address;
                     if (ret.region.level == 0) {
@@ -388,12 +388,12 @@
     }*/
 
 
-    function saveData(_that,formdata,formName){
+    function region_saveData(_that,formdata,formName){
         var url = null;
-        if(vue.regiontitile == "添加区域"){
+        if(region_vue.regiontitile == "添加区域"){
             url = encodeURI("[[@{/system/addRegion}]]");
         }
-        if(vue.regiontitile == "修改区域"){
+        if(region_vue.regiontitile == "修改区域"){
             url = encodeURI("[[@{/system/updateRegion}]]")
         }
         var token=$("meta[name='_csrf_token']").attr("value");
@@ -413,7 +413,7 @@
                     layer.msg(data.errStr, {icon: 2,time:1000});
                 } else {
                     layer.msg('保存信息成功!', {icon: 1,time:1000});
-                    refreshThisTable();
+                    region_refreshThisTable();
                     _that.$refs[formName].resetFields();
                     _that.dialogFormVisible = false;
                 }
@@ -422,7 +422,7 @@
     }
 
 
-    function getFregion(_self,value){
+    function region_getFregion(_self,value){
         $.ajax({
             type: "get",
             dataType: "json",
