Forráskód Böngészése

完善房间管理

zhengqiang 5 éve
szülő
commit
c59919b12e

+ 6 - 2
src/api/base/roomInfo.js

@@ -5,8 +5,12 @@ function pageList(formData){
   return request.post(constant.serverUrl + "/base/roomInfo/pageList", formData);
 }
 
-function create(){
-  return request.get(constant.serverUrl + "/base/roomInfo/create");
+function create(parentId){
+  if(parentId==null){
+    parentId = "";
+  }
+  
+  return request.get(constant.serverUrl + `/base/roomInfo/create?parentId=${parentId}`);
 }
 
 function edit(id){

+ 50 - 27
src/views/base/roomInfo-detail.vue

@@ -12,7 +12,7 @@
     @close="closeDialog"
   >
     <div class="user-panel" v-loading="loading">
-      <el-form ref="form" :model="formModel" :rules="ruleValidate" :label-width="'100px'">
+      <el-form ref="form" :model="formModel" :rules="ruleValidate" :label-width="'150px'">
         <el-form-item label="名称" prop="name">
           <el-input v-model="formModel.name" placeholder="请输入名称" style="width:300px"></el-input>
         </el-form-item>
@@ -37,7 +37,7 @@
             v-bind:disabled="useDisabled"
           >
             <el-option
-              v-for="useType in useTypeListFilter"
+              v-for="useType in useTypeList"
               :key="useType.id"
               :label="useType.name"
               :value="useType.id"
@@ -47,7 +47,7 @@
         <el-form-item label="排序号" prop="sortNo">
           <el-input v-model="formModel.sortNo" placeholder="请输入排序号" style="width:300px"></el-input>
         </el-form-item>
-        <el-form-item label="上级菜单" prop="parentId">
+        <el-form-item label="所属园区/楼栋" prop="parentId">
           <el-select
             v-model="formModel.parentId"
             filterable
@@ -55,7 +55,7 @@
             placeholder
             :remote-method="queryRoomInfo"
             style="width:300px"
-            v-bind:disabled="parentDsabled"
+            :disabled="parentDisabled"
           >
             <el-option
               v-for="roomInfo in roomInfoListFilter"
@@ -79,8 +79,16 @@ import roomInfoApi from "@/api/base/roomInfo";
 import dataDictionaryApi from "@/api/sys/dataDictionary";
 
 export default {
-  props: ["businessKey", "title"],
+  props: ["businessKey", "title","parentId"],
   data() {
+    var validateUseType = (rule, value, callback) => {
+        if(this.formModel.type == 3 && value==='') {
+          callback(new Error('用电类型不能为空!'));
+        } else {
+          callback();
+        }
+    };
+
     return {
       ruleValidate: {
         name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
@@ -92,7 +100,7 @@ export default {
           }
         ],
         useType: [
-          { required: true, message: "用电类型不能为空", trigger: "blur" }
+          { validator: validateUseType, trigger: "blur" }
         ],
         sortNo: [{ required: true, message: "排序号不能为空", trigger: "blur" }]
       },
@@ -102,7 +110,7 @@ export default {
       loading: false,
       submitting: false,
       formModel: {},
-      parentDsabled: true,
+      parentDisabled: true,
       useDisabled: true,
       parentType: ""
     };
@@ -111,16 +119,19 @@ export default {
     roomInfoListFilter() {
       var self = this;
 
-      return self.roomInfoList.filter(roomInfo => {
-        return roomInfo.id;
-      });
-    },
-    useTypeListFilter() {
-      var self = this;
+      var list = [];
 
-      return self.useTypeList.filter(useType => {
-        return useType.id;
+      var roomMap = {};
+
+      self.roomInfoList.forEach((room)=>{
+        roomMap[room.id] = room;
       });
+
+      for(var key in roomMap){
+        list.push(roomMap[key]);
+      }
+
+      return list;
     }
   },
   methods: {
@@ -148,14 +159,19 @@ export default {
                 type: "success"
               });
 
-              self.$emit("close", true);
+              self.$emit("close", {
+                result : true,
+                data : jsonData.data
+              });
             } else {
               self.$message({
                 message: jsonData.message + "",
                 type: "warning"
               });
 
-              self.$emit("close", false);
+              self.$emit("close", {
+                result : false
+              });
             }
           });
         }
@@ -198,9 +214,9 @@ export default {
       this.parentType = keywords;
       this.queryRoomInfo("");
       if (keywords == "1") {
-        this.parentDsabled = true;
+        this.parentDisabled = true;
       } else {
-        this.parentDsabled = false;
+        this.parentDisabled = false;
         if (keywords == "3") {
           this.useDisabled = false;
         } else {
@@ -212,10 +228,13 @@ export default {
   async mounted() {
     var self = this;
     self.loading = true;
-    this.queryUseType("d18b7e03-63ed-4d86-b2b3-b93a7de2673b");
+    
+    await this.queryUseType("d18b7e03-63ed-4d86-b2b3-b93a7de2673b");
+    await this.queryRoomInfo("");
+
     (function() {
       if (self.businessKey.length == 0) {
-        return roomInfoApi.create();
+        return roomInfoApi.create(self.parentId);
       } else {
         return roomInfoApi.edit(self.businessKey);
       }
@@ -223,16 +242,20 @@ export default {
       .then(response => {
         var jsonData = response.data;
         self.loading = false;
+        
         if (jsonData.result) {
           self.formModel = jsonData.data;
-          if (
-            self.formModel.parentId != "" &&
-            self.formModel.parentId != null
-          ) {
+
+          if (self.formModel.parentId !== "") {
             this.parentType = self.formModel.type;
-            this.queryRoomInfo("");
-            this.parentDsabled = false;
+            this.parentDisabled = false;
+
+            self.roomInfoList.push({
+              id: self.formModel.parentId,
+              name: self.formModel.parentName
+            });
           }
+
           if (self.formModel.type == "3") {
             this.useDisabled = false;
           }

+ 116 - 66
src/views/base/roomInfo-list.vue

@@ -10,58 +10,34 @@
       </el-breadcrumb-item>
     </el-breadcrumb>
     <el-divider></el-divider>
-    <!--
-      要resetFields起作用,必须配置:model和prop
-    -->
-    <el-form ref="queryForm" :model="queryModel" inline class="demo-form-inline">
-      <el-form-item label="名称" prop="name">
-        <el-input type="text" size="mini" v-model="queryModel.name"></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-button
-          type="primary"
-          size="mini"
-          icon="ios-search"
-          @click="changePage(1)"
-          :loading="loading"
-        >查询</el-button>&nbsp;
-        <el-button
-          type="info"
-          size="mini"
-          style="margin-left: 8px"
-          @click="handleReset('queryForm')"
-        >重置</el-button>&nbsp;
-      </el-form-item>
-    </el-form>
-    <el-divider></el-divider>
     <el-row class="button-group">
       <el-button
         type="primary"
         size="small"
         plain
         icon="el-icon-circle-plus"
-        @click="handleAdd"
+        @click="handleAdd(null)"
       >新增园区</el-button>
-      <el-button
+      <!-- <el-button
         type="primary"
         size="small"
         plain
         icon="el-icon-circle-plus"
         :disabled="multipleSelection.length==0"
         @click="handleBatchDelete"
-      >删除选中项</el-button>
+      >删除选中项</el-button> -->
     </el-row>
     <el-table
       :data="tableData"
       style="min-height:400px;"
       row-key="id"
+      stripe
       border
       lazy
       :load="load"
       :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
       @selection-change="handleSelectionChange"
     >
-      <el-table-column type="selection" width="55"></el-table-column>
       <el-table-column prop="name" sort-by="name_" label="名称" sortable="custom" width="180"></el-table-column>
       <el-table-column prop="number" sort-by="number_" label="编号" sortable="custom" width="180"></el-table-column>
       <el-table-column prop="type" sort-by="type_" label="类型" sortable="custom" width="180">
@@ -81,22 +57,18 @@
       <el-table-column prop="sortNo" sort-by="sort_no" label="排序号" sortable="custom" width="180"></el-table-column>
       <el-table-column label="操作">
         <template slot-scope="{row}">
+          <el-button size="mini" type="primary" @click="handleAdd(row)" v-show="row.type!=3">
+              {{row.type==1 ? "添加楼栋" : "添加房间"}}
+          </el-button>
           <el-button size="mini" type="warning" @click="handleEdit(row)">编辑</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    <el-pagination
-      :current-page.sync="pageIndex"
-      :total="totalElements"
-      :page-sizes="pageSizeList"
-      @current-change="changePage"
-      @size-change="pageSizeChange"
-      layout="total, sizes, prev, pager, next, jumper"
-    ></el-pagination>
     <roomInfo-detail
       v-if="showModal"
       :businessKey="businessKey"
+      :parentId="selectedRecord.id"
       :title="modalTitle"
       @close="onDetailModalClose"
     ></roomInfo-detail>
@@ -130,7 +102,7 @@ export default {
       loading: false,
       tableData: [],
       pageIndex: 1,
-      pageSize: 10,
+      pageSize: 100,
       totalPages: 0,
       totalElements: 0,
       field: "",
@@ -139,15 +111,18 @@ export default {
       multipleSelection: [],
       showModal: false,
       modalTitle: "",
-      businessKey: ""
+      operation:'',
+      businessKey: "",
+      selectedRecord : null
       //loadNodeMap: new Map()
     };
   },
   methods: {
-    load(tree, treeNode, resolve) {
-      if (tree != null) {
-        const id = tree.id;
+    load(row, treeNode, resolve) {
+      if (row != null) {
+        const id = row.id;
         var formData = new FormData();
+        
         formData.append("parentId", id);
         // const pid = tree.id;
         // this.loadNodeMap.set(pid, { tree, treeNode, resolve });
@@ -156,6 +131,9 @@ export default {
           .then(function(response) {
             self.loading = false;
             var jsonData = response.data.data;
+
+            row.children = jsonData.data;
+
             resolve(jsonData.data);
           })
           .catch(error => {
@@ -175,17 +153,8 @@ export default {
       formData.append("pageIndex", self.pageIndex);
       formData.append("pageSize", self.pageSize);
 
-      formData.append("id", self.queryModel.id);
       formData.append("name", self.queryModel.name);
-      formData.append("number", self.queryModel.number);
       formData.append("type", self.queryModel.type);
-      formData.append("sortNo", self.queryModel.sortNo);
-      formData.append("parentId", self.queryModel.parentId);
-      formData.append("createBy", self.queryModel.createBy);
-      formData.append("createTime", self.queryModel.createTime);
-      formData.append("updateBy", self.queryModel.updateBy);
-      formData.append("updateTime", self.queryModel.updateTime);
-      formData.append("delFlag", self.queryModel.delFlag);
 
       if (this.field != null) {
         formData.append("field", this.field);
@@ -227,21 +196,72 @@ export default {
     handleReset(name) {
       this.$refs[name].resetFields();
     },
-    handleAdd() {
+    handleAdd(record) {
       this.modalTitle = "新增";
+      this.operation = "add";
       this.businessKey = "";
+
+      if(record!=null){
+        this.selectedRecord = record;
+      }
+      else{
+        this.selectedRecord = {};
+      }
+
       this.showModal = true;
     },
     handleEdit(record) {
       this.modalTitle = "编辑";
+      this.operation = "edit";
       this.businessKey = record.id;
+      this.selectedRecord = record;
       this.showModal = true;
     },
+    loopDelete(list,id){
+      var rs = false;
+
+      for(var i=0;i<list.length;i++){
+        if(list[i].id == id){
+          list.splice(i,1);
+          rs = true;
+          break;
+        }
+
+        if(list[i].children!=null){
+          rs = this.loopDelete(list[i].children,id);
+
+          if(rs){
+            break;
+          }
+        }
+      }
+
+      return rs;
+    },    
+    loopFind(list,id){
+      var rs = null;
+
+      for(var i=0;i<list.length;i++){
+        if(list[i].id == id){
+          rs = list[i];
+          break;
+        }
+
+        if(list[i].children!=null){
+          rs = this.loopFind(list[i].children,id);
+
+          if(rs!=null){
+            break;
+          }
+        }
+      }
+
+      return rs;
+    },
     handleDelete(record) {
       var self = this;
-      console.log(record);
-      self
-        .$confirm("是否确认删除?", "提示", {
+
+      self.$confirm("是否确认删除?", "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
@@ -251,18 +271,12 @@ export default {
             var jsonData = response.data;
 
             if (jsonData.result) {
-              // var index = self.tableData.indexOf(record);
-              // self.tableData.splice(index, 1);
-              self.changePage(self.pageIndex);
+              var rs = self.loopDelete(self.tableData,record.id);
+
               self.$message({
                 type: "success",
                 message: "删除成功!"
               });
-              self.tableData.splice(index, 1);
-
-              // const { pid } = record;
-              // const { tree, treeNode, resolve } = self.loadNodeMap.get(pid);
-              // self.load(tree, treeNode, resolve);
             }
           });
         });
@@ -293,12 +307,48 @@ export default {
         });
       });
     },
-    onDetailModalClose(refreshed) {
+    onDetailModalClose(retObj) {
       //保存成功后回调
       this.showModal = false;
 
-      if (refreshed) {
-        this.changePage(this.pageIndex);
+      if (retObj.result) {
+        var retData = retObj.data;
+
+        if(this.operation=="edit"){
+          this.selectedRecord.name = retData.name;
+          this.selectedRecord.number = retData.number;
+          this.selectedRecord.type = retData.type;
+          this.selectedRecord.useType = retData.useType;
+          this.selectedRecord.sortNo = retData.sortNo;
+
+          if(this.selectedRecord.parentId != retData.parentId){
+            this.loopDelete(this.tableData,this.selectedRecord.id);
+
+            var parent = this.loopFind(this.tableData,retData.parentId);
+
+            if(parent!=null){
+              if(parent.children==null){
+                parent.children = []
+              }
+
+              parent.children.push(retData);
+            }
+          }
+        }
+        else if(this.operation=="add"){
+          if(this.selectedRecord.id==null){
+            console.log("tableData.push");
+            this.tableData.push(retData);
+          }
+          else{
+            if(this.selectedRecord.children==null){
+              this.selectedRecord.children = [];
+            }
+
+            this.selectedRecord.hasChildren = true;
+            this.selectedRecord.children.push(retData);
+          }
+        }
       }
     }
   },
@@ -326,7 +376,7 @@ export default {
 }
 
 .button-group {
-  margin-left: 10px;
+  padding: 10px;
   text-align: left;
 }
 </style>

+ 15 - 7
src/views/sys/dataDictionary-detail.vue

@@ -13,6 +13,12 @@
   >
     <div class="user-panel" v-loading="loading">
       <el-form ref="form" :model="formModel" :rules="ruleValidate" :label-width="'100px'">
+        <el-form-item label="字典类型" prop="dataType">
+          <el-select v-model="formModel.dataType">
+            <el-option label="字典目录" value="1"></el-option>
+            <el-option label="数据" value="2"></el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="名称" prop="name">
           <el-input v-model="formModel.name" placeholder="请输入名称" style="width:300px"></el-input>
         </el-form-item>
@@ -46,12 +52,6 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="字典类型" prop="dataType">
-          <el-select v-model="formModel.dataType">
-            <el-option label="字典目录" value="1"></el-option>
-            <el-option label="数据" value="2"></el-option>
-          </el-select>
-        </el-form-item>
       </el-form>
     </div>
     <span slot="footer" class="dialog-footer">
@@ -67,11 +67,19 @@ import dataDictionaryApi from "@/api/sys/dataDictionary";
 export default {
   props: ["dictId", "modalTitle"],
   data() {
+    var validateValue = (rule, value, callback) => {
+        if(this.formModel.dataType == '2' && value==='') {
+          callback(new Error('类型为数据时,值不能为空!'));
+        } else {
+          callback();
+        }
+    };
+
     return {
       formModel: {},
       ruleValidate: {
         name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
-        value: [{ required: true, message: "数值不能为空", trigger: "blur" }],
+        value: [{ validator: validateValue, trigger: "blur" }],
         sortNo: [
           { required: true, message: "显示序号不能为空", trigger: "blur" }
         ],

+ 14 - 8
src/views/sys/dataDictionary-list.vue

@@ -50,10 +50,23 @@
       style="min-height:400px;"
       v-loading="loading"
       stripe
+      border
       @sort-change="sortChange"
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55"></el-table-column>
+      <el-table-column
+        prop="dataType"
+        sort-by="data_type"
+        label="类型"
+        sortable="custom"
+        width="180"
+      >
+       <template slot-scope="{row}">
+         <span v-if="row.dataType=='1'">字典目录</span>
+         <span v-else>数据</span>
+       </template>
+      </el-table-column>
       <el-table-column prop="name" sort-by="name_" label="名称" sortable="custom" width="180"></el-table-column>
       <el-table-column prop="value" sort-by="value_" label="数值" sortable="custom" width="180"></el-table-column>
       <el-table-column prop="sortNo" sort-by="sort_no" label="排序号" sortable="custom" width="180"></el-table-column>
@@ -64,13 +77,6 @@
         sortable="custom"
         width="180"
       ></el-table-column>
-      <el-table-column
-        prop="dataType"
-        sort-by="data_type"
-        label="1-字典目录,2-数据"
-        sortable="custom"
-        width="180"
-      ></el-table-column>
       <el-table-column label="操作">
         <template slot-scope="{row}">
           <el-button size="mini" type="warning" @click="handleEdit(row)">编辑</el-button>
@@ -282,7 +288,7 @@ export default {
 }
 
 .button-group {
-  margin-left: 10px;
+  padding: 10px;
   text-align: left;
 }
 </style>

+ 15 - 6
src/views/sys/menu-detail.vue

@@ -39,7 +39,6 @@
               :value="menu.id"
             ></el-option>
           </el-select>
-          <el-button icon="el-icon-search" circle size="small" @click="innerVisible=true;"></el-button>
         </el-form-item>
         <el-form-item label="排序号" prop="sortNo">
           <el-input v-model="formModel.sortNo" placeholder="请输入排序号" style="width:300px"></el-input>
@@ -108,9 +107,19 @@ export default {
     menuListFilter () {
       var self = this;
 
-      return self.menuList.filter((menu)=>{
-        return self.formModel.parentId != menu.id;
+      var list = [];
+
+      var menuMap = {};
+
+      self.menuList.forEach((menu)=>{
+        menuMap[menu.id] = menu;
       });
+
+      for(var key in menuMap){
+        list.push(menuMap[key]);
+      }
+
+      return list;
     }
   },
   methods: {
@@ -194,9 +203,9 @@ export default {
 
         // 增加初始值
         self.menuList.push({
-          id: self.formModel.parentId,
-          name: self.formModel.parentName
-        });
+          id: jsonData.data.parentId,
+          menuName: jsonData.data.parentName
+        });  
       } else {
         self.$message.error(jsonData.message + "");
       }

+ 2 - 1
src/views/sys/menu-list.vue

@@ -72,6 +72,7 @@
       :data="tableData"
       v-loading="loading"
       stripe
+      border
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55"></el-table-column>
@@ -338,7 +339,7 @@ export default {
 }
 
 .button-group {
-  margin-left: 10px;
+  padding: 10px;
   text-align: left;
 }
 </style>

+ 2 - 1
src/views/sys/permission-list.vue

@@ -57,6 +57,7 @@
       style="min-height:400px;"
       v-loading="loading"
       stripe
+      border
       @sort-change="sortChange"
       @selection-change="handleSelectionChange"
     >
@@ -314,7 +315,7 @@ export default {
 }
 
 .button-group {
-  margin-left: 10px;
+  padding: 10px;
   text-align: left;
 }
 </style>

+ 2 - 1
src/views/sys/role-list.vue

@@ -53,6 +53,7 @@
       style="min-height:400px;"
       v-loading="loading"
       stripe
+      border
       @sort-change="sortChange"
       @selection-change="handleSelectionChange"
     >
@@ -342,7 +343,7 @@ export default {
 }
 
 .button-group {
-  margin-left: 10px;
+  padding: 10px;
   text-align: left;
 }
 </style>

+ 2 - 1
src/views/sys/user-list.vue

@@ -53,6 +53,7 @@
       style="min-height:400px;"
       v-loading="loading"
       stripe
+      border
       @sort-change="sortChange"
       @selection-change="handleSelectionChange"
     >
@@ -298,7 +299,7 @@ export default {
 }
 
 .button-group {
-  margin-left: 10px;
+  padding: 10px;
   text-align: left;
 }
 </style>