huangmp %!s(int64=4) %!d(string=hai) anos
pai
achega
4cac13f5f4

+ 27 - 5
package-lock.json

@@ -2538,6 +2538,16 @@
       "dev": true,
       "optional": true
     },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz",
+      "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
     "block-stream": {
       "version": "0.0.9",
       "resolved": "https://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz",
@@ -4936,6 +4946,14 @@
         "stream-shift": "^1.0.0"
       }
     },
+    "e-vue-contextmenu": {
+      "version": "0.1.3",
+      "resolved": "https://registry.nlark.com/e-vue-contextmenu/download/e-vue-contextmenu-0.1.3.tgz",
+      "integrity": "sha1-/eMlKLbhybjzkq678TndMFtgUbc=",
+      "requires": {
+        "vue": "^2.6.6"
+      }
+    },
     "easy-stack": {
       "version": "1.0.1",
       "resolved": "https://registry.npm.taobao.org/easy-stack/download/easy-stack-1.0.1.tgz",
@@ -5850,6 +5868,13 @@
         }
       }
     },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=",
+      "dev": true,
+      "optional": true
+    },
     "filesize": {
       "version": "3.6.1",
       "resolved": "https://registry.npmmirror.com/filesize/download/filesize-3.6.1.tgz?cache=0&sync_timestamp=1635764078375&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffilesize%2Fdownload%2Ffilesize-3.6.1.tgz",
@@ -12750,11 +12775,6 @@
       "resolved": "https://registry.npmmirror.com/vue-axios/download/vue-axios-2.1.5.tgz",
       "integrity": "sha1-GvS/EhjtcTCcdq+zjQ9oPjEsJKc="
     },
-    "vue-contextmenujs": {
-      "version": "1.3.13",
-      "resolved": "https://registry.npm.taobao.org/vue-contextmenujs/download/vue-contextmenujs-1.3.13.tgz",
-      "integrity": "sha1-O9rgI8e9QgleeNpCWAACUNUKuO8="
-    },
     "vue-count-to": {
       "version": "1.0.13",
       "resolved": "https://registry.npm.taobao.org/vue-count-to/download/vue-count-to-1.0.13.tgz",
@@ -13008,6 +13028,7 @@
           "dev": true,
           "optional": true,
           "requires": {
+            "bindings": "^1.5.0",
             "nan": "^2.12.1"
           }
         },
@@ -13337,6 +13358,7 @@
           "dev": true,
           "optional": true,
           "requires": {
+            "bindings": "^1.5.0",
             "nan": "^2.12.1"
           }
         },

+ 0 - 1
package.json

@@ -38,7 +38,6 @@
     "three": "^0.128.0",
     "vue": "^2.6.10",
     "vue-axios": "^2.1.2",
-    "vue-contextmenujs": "^1.3.13",
     "vue-count-to": "^1.0.13",
     "vue-drag-resize": "^1.5.4",
     "vue-grid-layout": "^2.3.12",

BIN=BIN
public/img/face/tw1.png


BIN=BIN
public/img/face/tw1_bg.png


+ 1 - 0
src/api/estate/parkingarea.js

@@ -48,6 +48,7 @@ export const update = (row) => {
   })
 }
 
+
 export const saveLayout = (row) => {
   return request({
     url: '/api/cyzh-estate/parkingarea/saveLayout',

+ 20 - 0
src/api/estate/parkingspace.js

@@ -32,6 +32,16 @@ export const remove = (ids) => {
   })
 }
 
+export const removeParkingSpace = (id) => {
+  return request({
+    url: '/api/cyzh-estate/parkingspace/removeParkingSpace',
+    method: 'post',
+    params: {
+      id,
+    }
+  })
+}
+
 export const add = (row) => {
   return request({
     url: '/api/cyzh-estate/parkingspace/submit',
@@ -48,6 +58,16 @@ export const update = (row) => {
   })
 }
 
+export const saveOrUpdate = (row) => {
+  return request({
+    url: '/api/cyzh-estate/parkingspace/saveOrUpdate',
+    method: 'post',
+    data: row
+  })
+}
+
+
+
 export const bindCar = (carId, parkingSpaceId) => {
   return request({
     url: '/api/cyzh-estate/parkingspace/bindCar',

+ 2 - 2
src/page/index/sidebar/index.vue

@@ -41,8 +41,8 @@
     methods: {}
   };
 </script>
-<style>
-  .el-menu-item.is-active {
+<style scoped>
+ .el-menu-item.is-active {
     background-color: #3b8ff4 !important;
   }
 </style>

+ 65 - 0
src/views/dashboard/onefaceaccess/onefaceaccess - 副本.vue

@@ -0,0 +1,65 @@
+<template>
+  <div class="body">
+    <el-row>
+      <!-- 左容器 -->
+      <el-col :span="18">
+        <div style="box-sizing: border-box;margin: 0.625rem;margin-top: 0;">
+          <function-list></function-list>
+          <resident></resident>
+          <strange></strange>
+        </div>
+      </el-col>
+      <!-- 右容器 -->
+      <el-col :span="6">
+        <today-visitor></today-visitor>
+      </el-col>
+    </el-row>
+
+    <div style="height: 1.25rem;"></div>
+  </div>
+</template>
+
+<script>
+  import strange from "./comps/strange.vue"
+  import resident from "./comps/resident.vue"
+  import functionList from "./comps/function_list.vue"
+  import todayVisitor from "./comps/today_visitor.vue"
+  export default {
+    components: {
+      strange,
+      resident,
+      functionList,
+      todayVisitor
+    },
+    data() {
+      return {
+
+      };
+    }
+  };
+</script>
+
+<style>
+  .avue-main {
+    background-color: #F5F5F5 !important;
+  }
+</style>
+
+<style lang="scss" scoped>
+  .body {
+    box-sizing: border-box;
+    background-color: #F5F5F5;
+    height: 100%;
+  }
+
+  .my-layout {
+    margin-top: 0.625rem;
+    display: flex;
+    width: 100%;
+    justify-content: space-between;
+
+    .layout {
+      width: calc(50% - 5px);
+    }
+  }
+</style>

+ 2 - 2
src/views/dashboard/parkingmng/comps/operate-list.vue

@@ -8,7 +8,7 @@
     <div class="operate_list" v-else>
       <div @click="parkingClick(item,index)" v-for="(item,index) in parkList" :key="index"
         style="padding-right: 1.25rem;">
-        <el-popover placement="bottom" title="" width="300" trigger="hover">
+        <el-popover placement="bottom" title="" width="300" trigger="manual">
           <div class="tips" style="position: relative;">
             <div style="position: absolute;right: 0rem;top: -10px">
               <i class="el-icon-edit-outline" style="margin-left: 0.25rem;font-weight: 800;" @click="rowEdit(item)"></i>
@@ -240,7 +240,7 @@
       },
       parkingClick(item, index) {
         this.activedIndex = index
-        this.parkingLayout.parkingLotObj = this.parkList[index]
+        this.$emit('changeParking',item)
       },
       operateClick(item, index) {
         if (item.name == '保存布局') {

+ 153 - 48
src/views/dashboard/parkingmng/comps/paking-layout.vue

@@ -1,7 +1,8 @@
 <template>
   <div class="page animate__animated animate__faster animate__fadeInLeft">
     <more title="车位使用情况" nomore></more>
-    <operateList @save="save" @search="search" ref="operateList" @initDone="initDone"></operateList>
+    <operateList @save="save" @search="search" @changeParking='changeParking' ref="operateList" @initDone="initDone">
+    </operateList>
 
     <div v-show="$isNotEmpty(parkingLotObj)" class="parking-layout" @click="activedIndex=-1;closePopover"
       id="parkingLayout"
@@ -13,11 +14,14 @@
         <i class="el-icon-circle-plus-outline" style="color: #3b8ff4;font-size: 3.125rem;"></i>
         <span>添加区域</span>
       </div>
+
+      <!-- 可拖拽区域begin -->
       <VueDragResize class="animate__animated animate__faster animate__zoomIn" v-if="item.show&&!enlarge"
         :isDraggable="disabled" :isResizable="disabled" v-for="(item, index) in parkingAreaList" :key="index"
         :w="item.width" :h="item.height" :x="item.x" :y="item.y" :z="(index+1)" :parentW="listWidth"
         :parentH="listHeight" :parentLimitation="true" :snapToGrid="true" :gridX="10" :gridY="10"
         @resizestop="rectStop($event, index)" @dragstop="rectStop($event, index)">
+
         <div @click.stop="activedIndex=index"
           style="width: 100%;height: 100%;position: relative;z-index: 9999999999999999;">
           <el-button class="delLayoutClass" @click.stop="delLayout(item)" v-if="delLayoutShow" type="danger"
@@ -26,25 +30,40 @@
             @click.stop="enlarge=true;enlargeItem=item;" type="primary" icon="el-icon-zoom-in" size="mini"
             style="padding: 0.26rem;" circle></el-button>
 
-          <div id="parkingBox" class="parking-box" style="position:relative;">
+          <div id="parkingBox" @click="editPopoverShow" class="parking-box" style="position:relative;">
             <div class="watermark">
               {{item.name}}
             </div>
             <div @click.stop="showPopover(item1)" v-if="$isNotEmpty(item.parkingSpaceList)" class="car"
               :style="changeParkingSpaceParams(item)" v-for="(item1,index1) in item.parkingSpaceList" :key="index1">
-              <el-popover placement="bottom" title="" width="230" v-model="item1.popoverShow" trigger="manual">
+
+              <el-popover placement="bottom" title="" :width="260" v-model="item1.popoverShow" trigger="manual">
                 <div class="tips" style="position: relative;">
                   <div style="position: absolute;right: 0rem;top: -10px">
-                    <i class="el-icon-delete" style="font-weight: 800;"></i>
-                    <i class="el-icon-edit-outline" style="margin-left: 0.25rem;font-weight: 800;"></i>
+                    <i class="el-icon-delete" style="font-weight: 800;color:red"
+                      @click="delParkingSpace(item.parkingSpaceList,index1)"></i>
+                  </div>
+                  <div v-if="item1.id">
+                    <label>id:</label>
+                    {{item1.id}}
+                  </div>
+                  <div v-else>
+                    <label>id:</label>
+                    <span style="color:red">未保存</span>
                   </div>
                   <div>
                     <label>停车场:</label>
                     {{parkingLotObj.parkName}}
                   </div>
-                  <div>
-                    <label>车位编号:</label>
-                    {{item1.number}}
+                  <div style="justify-conetnt:flex-start;padding-top:0" class="">
+                    <div class="center">
+                      <label>车位编号:</label>
+                    </div>
+                    <el-input v-model="parkingSpaceNumber" placeholder="请输入车位编号" size="mini">
+                      <div slot="append" class="numberClass">
+                        <el-button icon="el-icon-check" size="mini" @click="updateParkingspace(item1)"></el-button>
+                      </div>
+                    </el-input>
                   </div>
                   <div style="display: flex;">
                     <label>车牌号码:</label>
@@ -67,7 +86,7 @@
 
             <div class="car" :style="changeParkingSpaceParams(item)">
               <i class="el-icon-circle-plus-outline" @click.stop="addParkingSpace(item)"></i>
-              <el-popover placement="bottom" title="" width="270" trigger="hover">
+              <el-popover placement="bottom" title="" width="190" trigger="hover">
                 <div class="popoverContent" style="justify-content: center;">
                   <el-button style="margin:0.25rem" v-for="(item2,index2) in tipsBtnList" :key="index2"
                     @click="popoverClick(item,item2)" type="primary" size="mini" plain>{{item2.name}}</el-button>
@@ -80,6 +99,9 @@
         </div>
       </VueDragResize>
 
+      <!-- 可拖拽区域end -->
+
+      <!-- 放大区域 begin-->
       <VueDragResize class="animate__animated animate__faster "
         :class="enlargeAreaShow()?'animate__zoomIn':'animate__zoomOut'" v-if="enlargeAreaShow()" :isDraggable="false"
         :isResizable="false" :w="(listWidth - 20)" :h="(listHeight - 20)" :x="10" :y="10" :parentW="listWidth"
@@ -92,11 +114,11 @@
             <div v-if="$isNotEmpty(enlargeItem.parkingSpaceList)" class="car"
               :style="changeParkingSpaceParams(enlargeItem)" v-for="(item1,index1) in enlargeItem.parkingSpaceList"
               :key="index1">
-              <el-popover placement="bottom" title="" width="230" trigger="hover">
+              <el-popover placement="bottom" title="" width="250" trigger="hover">
                 <div class="tips" style="position: relative;">
-                  <div style="position: absolute;right: 0rem;top: -10px">
-                    <i class="el-icon-delete" style="font-weight: 800;"></i>
-                    <i class="el-icon-edit-outline" style="margin-left: 0.25rem;font-weight: 800;"></i>
+                  <div>
+                    <label>id:</label>
+                    {{item1.id}}
                   </div>
                   <div>
                     <label>停车场:</label>
@@ -109,11 +131,9 @@
                   <div style="display: flex;">
                     <label>车牌号码:</label>
                     <span v-if="item1.carNo">{{item1.carNo}}
-                      <span v-if="item1.id" class="bind" @click="parkingSpaceItem=item1;tableShow=true">换绑</span>
                     </span>
                     <span style="color: red;justify-content: center;display: flex;align-items: center;" v-else>
                       车位为空
-                      <span v-if="item1.id" class="bind" @click="parkingSpaceItem=item1;tableShow=true">绑定</span>
                     </span>
                   </div>
                 </div>
@@ -125,7 +145,7 @@
           </div>
         </div>
       </VueDragResize>
-
+      <!-- 放大区域 end-->
     </div>
 
     <el-dialog style="z-index: 99999;" :close-on-click-modal="false" :append-to-body="true"
@@ -156,8 +176,6 @@
       :close-on-click-modal="false" :visible.sync="tableShow">
       <car-table ref="car" @bindCar="bindCar"></car-table>
     </el-dialog>
-
-
   </div>
 </template>
 <script>
@@ -167,8 +185,13 @@
   } from '@/util/util.js'
   import {
     saveLayout,
-    getLayout
+    getLayout,
+    update as updateParkingarea,
   } from '@/api/estate/parkingarea.js'
+  import {
+    saveOrUpdate as updateParkingspace,
+    removeParkingSpace,
+  } from '@/api/estate/parkingspace.js'
   import VueDragResize from 'vue-drag-resize';
   import operateList from "./operate-list.vue"
   import more from "@/components/more.vue"
@@ -191,6 +214,14 @@
     },
     data() {
       return {
+        //延时器
+        timer1: null,
+        timer2: null,
+        timer3: null,
+
+        //修改车位编号
+        parkingSpaceNumber: '',
+
         //搜索匹配的项
         searchList: [],
         //绑定车辆
@@ -257,12 +288,12 @@
               this.operateDialogShow = true
             }
           },
-          {
-            name: '修改宽高',
-            event: () => {
-              this.$message.success('操作成功')
-            }
-          },
+          // {
+          //   name: '修改宽高',
+          //   event: () => {
+          //     this.$message.success('操作成功')
+          //   }
+          // },
           {
             name: '车位翻转',
             event: () => {
@@ -295,18 +326,61 @@
       },
     },
     methods: {
+      changeParking(data) {
+        if (this.parkingLotObj.id != data.id) {
+          this.parkingLotObj = deepClone(data)
+          this.getParkingArealist()
+        }
+      },
+      fullLoading(text = 'loading') {
+        const loading = this.$loading({
+          lock: true,
+          text,
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        })
+        return loading
+      },
+      /**
+       * 更新车位信息
+       */
+      updateParkingspace(data) {
+        let tmp = deepClone(data)
+        tmp.number = this.parkingSpaceNumber
+        updateParkingspace(tmp).then(res => {
+          if (res.data.success) {
+            this.$message.success('操作成功')
+            data.number = this.parkingSpaceNumber
+          }
+        })
+        this.editPopoverShow()
+      },
+      delParkingSpace(arr, index) {
+        let data = arr[index]
+        if (this.$isEmpty(data.id)) {
+          arr.splice(index, 1)
+          this.$message.success('删除成功')
+          return
+        }
+        this.$confirm('确定删除该车位?').then(() => {
+          removeParkingSpace(data.id).then(async (res) => {
+            if (res.data.success) {
+              arr.splice(index, 1)
+              this.$message.success('删除成功')
+            }
+          })
+        })
+      },
       editPopoverShow() {
         this.parkingAreaList.forEach(item => {
           item.parkingSpaceList.forEach(item1 => item1.popoverShow = false)
         })
       },
       showPopover(data) {
+        this.parkingSpaceNumber = data.number
         let flag = data.popoverShow
         this.editPopoverShow()
         data.popoverShow = !flag
-        setTimeout(() => {
-          data.popoverShow = false
-        }, 5000)
       },
       search(searchKey) {
         this.searchList = []
@@ -370,34 +444,41 @@
         })
       },
       async getParkingArealist() {
-        let res=await getLayout(this.parkingLotObj.id)
-        if (this.$isNotEmpty(res.data.data)) {
-          let tmp = res.data.data
-           tmp.forEach(item => {
-            item.show = true
-            item.width=digital.floatMul(this.listWidth,item.width)
-            item.height=digital.floatMul(this.listHeight,item.height)
-            item.x=digital.floatMul(this.listWidth,item.x)
-            item.y=digital.floatMul(this.listHeight,item.y)
-          })
-          this.parkingAreaList=tmp
-        }
+        let res = await getLayout(this.parkingLotObj.id)
+        let tmp = res.data.data
+        tmp.forEach(item => {
+          item.show = true
+          item.width = digital.floatMul(this.listWidth, item.width)
+          item.height = digital.floatMul(this.listHeight, item.height)
+          item.x = digital.floatMul(this.listWidth, item.x)
+          item.y = digital.floatMul(this.listHeight, item.y)
+        })
+        this.parkingAreaList = tmp
       },
       save() {
-        let tmp=deepClone(this.parkingAreaList)
-        tmp.forEach(item=>{
-          item.width =digital.keepTwoDecimalFull(item.width / this.listWidth)
-          item.height=digital.keepTwoDecimalFull(item.height / this.listHeight)
-          item.x=digital.keepTwoDecimalFull(item.x / this.listWidth)
-          item.y=digital.keepTwoDecimalFull(item.y / this.listHeight)
+        if (this.$isEmpty(this.parkingAreaList)) {
+          this.$message.success('保存成功')
+          return
+        }
+        let loading = this.fullLoading("布局保存中...")
+        let tmp = deepClone(this.parkingAreaList)
+        tmp.forEach(item => {
+          item.width = digital.keepTwoDecimalFull(item.width / this.listWidth)
+          item.height = digital.keepTwoDecimalFull(item.height / this.listHeight)
+          item.x = digital.keepTwoDecimalFull(item.x / this.listWidth)
+          item.y = digital.keepTwoDecimalFull(item.y / this.listHeight)
         })
-        saveLayout(tmp).then(res => {
+        saveLayout(tmp).then(async (res) => {
           if (res.data.success) {
             this.$message.success('保存成功')
-            this.getParkingArealist()
+            await this.getParkingArealist()
+            this.disabled = true
           } else {
             this.$message.success('保存失败')
           }
+          loading.close()
+        }).catch(() => {
+          loading.close()
         })
       },
       delLayout(item) {
@@ -422,6 +503,9 @@
         tmp.number = guid(8)
         item.parkingSpaceList.push(tmp)
       },
+      /**
+       * flag true 主动修改
+       */
       changeParkingSpaceParams(item, flag = false) {
         let arr = item.parkingSpaceParams.split(',')
         if (flag) {
@@ -429,11 +513,22 @@
           arr[0] = arr[1]
           arr[1] = tmp
           item.parkingSpaceParams = arr.join(',')
+          this.remoteChangeParkingSpaceParams(item)
         }
         let flexStyle = arr[0] > arr[1] ? 'flex-direction: row' : 'flex-direction: column'
         let parkingSpaceStyle = `width:${arr[0]}px;height:${arr[1]}px;${flexStyle}`
         return parkingSpaceStyle
       },
+      remoteChangeParkingSpaceParams(data) {
+        if (this.$isEmpty(data.id)) {
+          return
+        }
+        let params = {
+          id: data.id,
+          parkingSpaceParams: data.parkingSpaceParams
+        }
+        updateParkingarea(params)
+      },
       popoverClick(item, item2) {
         this.operatePopoverItem = item
         item2.event(item)
@@ -474,6 +569,12 @@
     margin: 0;
   }
 
+  .center {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+
   .watermark {
     width: 100%;
     height: 30px;
@@ -490,6 +591,10 @@
     pointer-events: none;
   }
 
+  .numberClass:active {
+    transform: scale(1.05);
+  }
+
   .addParkingArea {
     display: flex;
     justify-content: center;

+ 367 - 0
src/views/dashboard/parkingmng/dialog/parkingspace-table.vue

@@ -0,0 +1,367 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" :permission="permissionList"
+      :before-open="beforeOpen" v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave" @row-del="rowDel"
+      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger" size="small" icon="el-icon-delete" plain v-if="permission.parkingspace_delete"
+          @click="handleDelete">删 除
+        </el-button>
+      </template>
+      <template slot="residentialId" slot-scope="scope">{{scope.row.residentialName}}</template>
+      <template slot="residentialIdForm" slot-scope="scope">
+        <select-dialog-residential :disabled="residentialDisabled" :id="form.residentialId" :name="form.residentialName"
+          :callback="selectCallback"></select-dialog-residential>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {
+    getList,
+    getDetail,
+    add,
+    update,
+    remove
+  } from "@/api/estate/parkingspace";
+  import {
+    mapGetters
+  } from "vuex";
+  import SelectDialogResidential from "@/components/select-dialog/select-dialog-residential";
+
+  export default {
+    components: {
+      SelectDialogResidential
+    },
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        residentialDisabled: false,
+        option: {
+          height: 'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [{
+              label: "车位编号",
+              prop: "number",
+              rules: [{
+                required: true,
+                message: "请输入车位编号",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "车位类型",
+              prop: "type",
+              type: 'select',
+              dataType: 'number',
+              dicUrl: "/api/blade-system/dict-biz/dictionary?code=parkinglot-type",
+              props: {
+                label: 'dictValue',
+                value: 'dictKey'
+              },
+              rules: [{
+                required: true,
+                message: "请输入车位类型(微型,小型,中型,大型)跟车辆类型对应",
+                trigger: "blur"
+              }]
+            },
+            // {
+            //   label: "占用车辆",
+            //   prop: "carId",
+            //   rules: [{
+            //     required: true,
+            //     message: "请输入占用车辆",
+            //     trigger: "blur"
+            //   }]
+            // },
+            {
+              label: "是否收费",
+              prop: "isFree",
+              type: "select",
+              value: 1,
+              dicData: [{
+                label: '是',
+                value: 0
+              }, {
+                label: '否',
+                value: 1
+              }],
+              rules: [{
+                required: false,
+                message: "请输入是否收费",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "是否室内",
+              prop: "isIndoor",
+              type: "select",
+              value: 1,
+              dicData: [{
+                label: '是',
+                value: 0
+              }, {
+                label: '否',
+                value: 1
+              }],
+              rules: [{
+                required: false,
+                message: "请输入是否室内",
+                trigger: "blur"
+              }],
+            },
+            {
+              label: "所属区域",
+              prop: "residentialId",
+              type: "select",
+              slot: true,
+              formslot: true,
+              // dicUrl: "/api/cyzh-community/residential/list?agencyId={{key}}&&size=9999",
+              dicUrl: "/api/cyzh-community/residential/list?size=500",
+              dicFormatter: (res) => {
+                return res.data.records; //返回字典的层级结构
+              },
+              // dicFlag: false,
+              filterable: true,
+              props: {
+                label: "name",
+                value: "id"
+              },
+              rules: [{
+                required: false,
+                message: "请选择所属区域",
+                trigger: "blur"
+              }]
+            },
+            // {
+            //   label: "机构路径",
+            //   prop: "orgPosition",
+            //   rules: [{
+            //     required: true,
+            //     message: "请输入机构路径",
+            //     trigger: "blur"
+            //   }]
+            // },
+
+            {
+              label: "所属车场",
+              prop: "parkingLotId",
+              type: "select",
+              search: true,
+              // dicFlag: false,
+              // remote: true,
+              dicUrl: "/api/cyzh-estate/parkinglot/list",
+              props: {
+                label: 'parkName',
+                value: 'id'
+              },
+              filterable: true,
+              searchFilterable: true,
+              dicFormatter: (res) => {
+                return res.data.records;
+              },
+              rules: [{
+                require: true,
+                message: "请选择所属车场",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "是否占用",
+              prop: "isUsed",
+              type: "select",
+              value: 0,
+              dicData: [{
+                label: "已占用",
+                value: 1
+              }, {
+                label: "未占用",
+                value: 0
+              }],
+              rules: [{
+                required: false,
+                message: "请输入是否占用: 1-已占用 0-未占用",
+                trigger: "blur"
+              }],
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.parkingspace_add, false),
+          viewBtn: this.vaildData(this.permission.parkingspace_view, false),
+          delBtn: this.vaildData(this.permission.parkingspace_delete, false),
+          editBtn: this.vaildData(this.permission.parkingspace_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    created() {
+      const tenantType = localStorage.getItem("tenantType");
+      if (tenantType == 0) {
+        this.option.column[4].label = "所属区域"
+      } else if (tenantType == 1) {
+        this.option.column[4].label = "所属区域"
+      }
+    },
+    methods: {
+      selectCallback(row) {
+        this.form.residentialId = row.id;
+        this.form.residentialName = row.name;
+        if (this.option.column[5].prop == 'parkingLotId' && this.option.column[5].dicUrl.indexOf('residentialId') == -
+          1) {
+          this.option.column[5].dicUrl += '?residentialId=' + this.form.residentialId + '&size=100';
+
+        }
+      },
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowEdit(id) {
+        getDetail(id).then(res => {
+          this.$refs.crud.rowEdit(res.data.data)
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        this.residentialDisabled = false;
+        if (["edit", "view"].includes(type)) {
+          this.residentialDisabled = type == "view";
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage) {
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize) {
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 3 - 3
src/views/dashboard/parkingmng/parkingmng1.vue

@@ -4,7 +4,7 @@
       <!-- 左容器 -->
       <el-col :span="18">
         <div style="box-sizing: border-box;margin: 0.625rem;margin-top: 0rem;">
-          <parking-usage></parking-usage>
+          <paking-layout></paking-layout>
           <paking-capture></paking-capture>
           <paking-charts></paking-charts>
         </div>
@@ -25,13 +25,13 @@
   import pakingCapture from "./comps/paking-capture.vue"
   import pakingData from './comps/parking-data.vue'
   import parkingStatistics from "./comps/parking-statistics.vue"
-  import parkingUsage from "./comps/parking-usage.vue"
+  import pakingLayout from "./comps/paking-layout.vue"
   export default {
     components: {
       pakingCharts,
       pakingCapture,
       pakingData,
-      parkingUsage,
+      pakingLayout,
       parkingStatistics
     },
     data() {