Przeglądaj źródła

1、视频监控
2、物联网设备

slowslo 4 lat temu
rodzic
commit
8b4b1b22aa

+ 10 - 10
src/api/dataview/dataviewoption.js

@@ -78,8 +78,8 @@ export const dataDisplay = (obj,parent) =>{
         click: function (item) {
           parent.select(this.deviceType,this.deviceStatus)
         },
-        count: obj.normalCount,
-        title: '正常',
+        count: obj.registerCount,
+        title: '注册',
         deviceType: obj.deviceType,
         deviceStatus: 1,
       },
@@ -87,8 +87,8 @@ export const dataDisplay = (obj,parent) =>{
         click: function (item) {
           parent.select(this.deviceType,this.deviceStatus)
         },
-        count: obj.alertCount,
-        title: '告警',
+        count: obj.activeCount,
+        title: '激活',
         deviceType: obj.deviceType,
         deviceStatus: 2,
       },
@@ -96,8 +96,8 @@ export const dataDisplay = (obj,parent) =>{
         click: function (item) {
           parent.select(this.deviceType,this.deviceStatus)
         },
-        count: obj.outlineCount,
-        title: '失联',
+        count: obj.onlineCount,
+        title: '在线',
         deviceType: obj.deviceType,
         deviceStatus: 3,
       },
@@ -105,8 +105,8 @@ export const dataDisplay = (obj,parent) =>{
         click: function (item) {
           parent.select(this.deviceType,this.deviceStatus)
         },
-        count: obj.pauseCount,
-        title: '停用',
+        count: obj.offlineCount,
+        title: '离线',
         deviceType: obj.deviceType,
         deviceStatus: 4,
       },
@@ -114,8 +114,8 @@ export const dataDisplay = (obj,parent) =>{
         click: function (item) {
           parent.select(this.deviceType,this.deviceStatus)
         },
-        count: obj.armedCount,
-        title: '待布防',
+        count: obj.alarmCount,
+        title: '告警',
         deviceType: obj.deviceType,
         deviceStatus: 5,
       }

+ 10 - 0
src/api/device/doordevice.js

@@ -48,3 +48,13 @@ export const update = (row) => {
   })
 }
 
+export const remoteOpenDoor = (id, isOpen) => {
+  return request({
+    url: '/api/cyzh-smart-device/doordevice/remoteOpenDoor',
+    method: 'post',
+    params: {
+      id,
+      isOpen
+    }
+  })
+}

+ 22 - 5
src/api/estate/guest.js → src/api/device/gb/gbdevice.js

@@ -1,8 +1,17 @@
 import request from '@/router/axios';
 
+//绑定设备
+export const bind = (row) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevice/bind',
+    method: 'post',
+    data: row
+  })
+}
+
 export const getList = (current, size, params) => {
   return request({
-    url: '/api/cyzh-estate/guest/list',
+    url: '/api/cyzh-smart-device/gbdevice/list',
     method: 'get',
     params: {
       ...params,
@@ -14,7 +23,7 @@ export const getList = (current, size, params) => {
 
 export const getDetail = (id) => {
   return request({
-    url: '/api/cyzh-estate/guest/detail',
+    url: '/api/cyzh-smart-device/gbdevice/detail',
     method: 'get',
     params: {
       id
@@ -24,7 +33,7 @@ export const getDetail = (id) => {
 
 export const remove = (ids) => {
   return request({
-    url: '/api/cyzh-estate/guest/remove',
+    url: '/api/cyzh-smart-device/gbdevice/remove',
     method: 'post',
     params: {
       ids,
@@ -34,7 +43,7 @@ export const remove = (ids) => {
 
 export const add = (row) => {
   return request({
-    url: '/api/cyzh-estate/guest/submit',
+    url: '/api/cyzh-smart-device/gbdevice/submit',
     method: 'post',
     data: row
   })
@@ -42,7 +51,15 @@ export const add = (row) => {
 
 export const update = (row) => {
   return request({
-    url: '/api/cyzh-estate/guest/submit',
+    url: '/api/cyzh-smart-device/gbdevice/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const sync = (row) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevice/sync',
     method: 'post',
     data: row
   })

+ 74 - 0
src/api/device/gb/gbdevicechannel.js

@@ -0,0 +1,74 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevicechannel/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevicechannel/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevicechannel/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevicechannel/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevicechannel/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+//设备点播
+export const startPlay = (deviceId, channelId) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevicechannel/play',
+    method: 'post',
+    params: {
+      deviceId,
+      channelId
+    }
+  })
+}
+
+//设备停止播放
+export const stopPlay = (deviceId, channelId) => {
+  return request({
+    url: '/api/cyzh-smart-device/gbdevicechannel/stop',
+    method: 'post',
+    params: {
+      deviceId,
+      channelId
+    }
+  })
+}
+

+ 13 - 1
src/api/device/wvpvideodevice.js

@@ -1,5 +1,18 @@
 import request from '@/router/axios';
 
+//绑定设备
+export const bind = (deviceId, agencyId, residentialId) => {
+  return request({
+    url: '/api/cyzh-third/wvp/device/bind',
+    method: 'post',
+    params: {
+      deviceId,
+      agencyId,
+      residentialId,
+    }
+  })
+}
+
 //获取设备列表
 export const getList = (current, size, params) => {
   return request({
@@ -100,7 +113,6 @@ export const stopPlayBack = (deviceId, channelId) => {
 }
 
 
-
 /*export const getDetail = (id) => {
   return request({
     url: '/api/cyzh-smart-device/videoclouddevice/detail',

+ 10 - 0
src/api/enterprise/staff.js

@@ -67,3 +67,13 @@ export const pushUserFaceBatch = (ids) => {
     }
   })
 }
+
+export const deleteUserFace = (ids) => {
+  return request({
+    url: '/api/cyzh-enterprise/staff/deleteUserFace',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}

+ 66 - 0
src/api/estate/guestrecord.js

@@ -0,0 +1,66 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/cyzh-estate/guestrecord/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/cyzh-estate/guestrecord/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/cyzh-estate/guestrecord/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/cyzh-estate/guestrecord/save',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/cyzh-estate/guestrecord/update',
+    method: 'post',
+    data: row
+  })
+}
+
+export const pushGuestFace = (row) => {
+  return request({
+    url: '/api/cyzh-estate/guestrecord/pushGuestFace',
+    method: 'post',
+    data: row
+  })
+}
+
+export const deleteGuestFace = (row) => {
+  return request({
+    url: '/api/cyzh-estate/guestrecord/deleteGuestFace',
+    method: 'post',
+    data: row
+  })
+}
+

+ 3 - 3
src/components/staff/review-staff.vue

@@ -12,9 +12,9 @@
      <div>
        <el-row>
          <el-col span="24" align="right">
-           <el-button type="warning" icon="el-icon-edit" size="small" @click="reviewauditStatus(0)">待审核</el-button>
-           <el-button type="primary" icon="el-icon-check" size="small" @click="reviewauditStatus(1)">通过</el-button>
-           <el-button type="info" icon="el-icon-delete" size="small" @click="reviewauditStatus(2)">不通过</el-button>
+<!--           <el-button type="warning" icon="el-icon-edit" size="small" @click="reviewauditStatus(0)">待审核</el-button>-->
+           <el-button type="success" icon="el-icon-check" size="small" @click="reviewauditStatus(1)">通过</el-button>
+           <el-button type="danger" icon="el-icon-delete" size="small" @click="reviewauditStatus(2)">不通过</el-button>
          </el-col>
        </el-row>
      </div>

+ 1 - 4
src/views/community/agency.vue

@@ -43,9 +43,7 @@
                @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.agency_delete" @click="handleDelete">删
-          除
-        </el-button>
+        <el-button type="danger" size="small" icon="el-icon-delete" plain v-if="permission.agency_delete" @click="handleDelete">删 除</el-button>
         <cy-excel-import :flag="1" file-name="社区信息导入模板" @success="onLoad(page)"></cy-excel-import>
       </template>
       <template slot="mapSelectForm" slot-scope="scope">
@@ -58,7 +56,6 @@
           </el-dialog>
         </div>
       </template>
-
     </avue-crud>
   </basic-container>
 </template>

+ 21 - 11
src/views/device/doordevice.vue

@@ -27,6 +27,9 @@
                    @click="handleDelete">删 除
         </el-button>
       </template>
+      <template slot="menu" slot-scope="{row}">
+        <el-button @click="openDoor(row)" size="small" type="text">远程开门</el-button>
+      </template>
       <template slot="mapSelectForm" slot-scope="scope">
         <!-- <avue-map v-model="scope.row.mapSelect"></avue-map> -->
         <div>
@@ -53,7 +56,7 @@
 </template>
 
 <script>
-import {getList, getDetail, add, update, remove} from "../../api/device/doordevice.js";
+import {getList, getDetail, add, update, remove, remoteOpenDoor} from "../../api/device/doordevice.js";
 import {mapGetters} from "vuex";
 import customAvueMap from "../../components/residential/customAvueMap.vue"
 import editPolygonMap from "../../components/residential/editPolygonMap.vue";
@@ -83,7 +86,8 @@ export default {
         searchMenuSpan: 6,
         border: true,
         index: true,
-        viewBtn: true,
+        viewBtn: false,
+        delBtn: true,
         selection: true,
         dialogClickModal: false,
         menuWidth:350,
@@ -211,6 +215,10 @@ export default {
             dataType: "number",
             display: false,
             slot: true
+          },
+          {
+            label: "最近心跳",
+            prop: "heartbeatTime"
           }
         ]
       },
@@ -235,6 +243,7 @@ export default {
       return ids.join(",");
     }
   },
+
   watch: {
     'form.mapSelect': {
       handler: function(value) {
@@ -247,6 +256,7 @@ export default {
       },
     }
   },
+
   created() {
     const tenantType = localStorage.getItem("tenantType");
     if (tenantType == 0){
@@ -259,16 +269,16 @@ export default {
       this.findObject(this.option.column, 'residentialId').rules[0].message = "请选择所属区域";
     }
   },
-  /*mounted() {
-    let tenantType = localStorage.getItem("tenantType");
-    const residentialColumn = this.findObject(this.option.column, "residentialId");
-    if (tenantType == 1) { //园区
-      residentialColumn.label = "所属区域";
-    } else { //社区
-      residentialColumn.label = "所属小区";
-    }
-  },*/
+
   methods: {
+    openDoor(row){
+      remoteOpenDoor(row.id, true).then(res =>{
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+      });
+    },
     selectCallback(row){
       this.form.latitude = row.latitude;
       this.form.longitude = row.longitude;

+ 558 - 0
src/views/device/gb/gbdevice.vue

@@ -0,0 +1,558 @@
+<template>
+  <basic-container>
+    <avue-crud v-if="!showDeviceChannelCrud"
+               :option="deviceOption"
+               :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.gbdevice_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+      <template slot="online" slot-scope="{row}">
+        <el-tag v-if="row.online === 1" type="success">在线</el-tag>
+        <el-tag v-if="row.online === 0" type="info">离线</el-tag>
+      </template>
+      <template slot="hostAddress" slot-scope="{row}">
+        <el-tag type="primary">{{row.hostAddress}}</el-tag>
+      </template>
+      <template slot="menu" slot-scope="{row}">
+        <el-button type="text" size="mini" icon="el-icon-setting">
+          <el-dropdown>
+            <span class="el-dropdown-link">
+              操作<i class="el-icon-arrow-down el-icon--right"></i>
+            </span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item style="color: orange" v-if="permission.gbdevice_bind" @click.native="bindDevice(row)" icon="el-icon-paperclip">绑定</el-dropdown-item>
+              <el-dropdown-item style="color: limegreen" @click.native="handleSync(row, row.$index)" icon="el-icon-refresh">刷新</el-dropdown-item>
+              <el-dropdown-item style="color: #0087ff" @click.native="handleChannel(row.deviceId)" icon="el-icon-video-camera-solid">通道</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </el-button>
+      </template>
+    </avue-crud>
+    <avue-crud v-if="showDeviceChannelCrud" :option="deviceChannelOption" :table-loading="loading" :data="data" :page="page" :permission="permissionList"
+                 :before-open="beforeOpen" v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave" @row-del="rowDel"
+                 @search-change="channelSearchChange" @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
+                 @size-change="sizeChange" @refresh-change="refreshChannelChange" @on-load="onLoadChannel">
+        <template slot-scope="{row}" slot="channelTypeSearch">
+          <el-select size="mini" style="margin-right: 1rem;" v-model="row.channelType" placeholder="请选择" default-first-option>
+            <el-option label="全部" value=""></el-option>
+            <el-option label="设备" value="false"></el-option>
+            <el-option label="子目录" value="true"></el-option>
+          </el-select>
+        </template>
+        <template slot-scope="{row}" slot="online">
+          <el-select size="mini" style="margin-right: 1rem;" v-model="row.online" placeholder="请选择" default-first-option>
+            <el-option label="全部" value=""></el-option>
+            <el-option label="在线" value="true"></el-option>
+            <el-option label="离线" value="false"></el-option>
+          </el-select>
+        </template>
+        <template slot="menuLeft">
+          <el-button type="primary" size="mini" icon="el-icon-arrow-left" @click="backToDeviceList">返 回</el-button>
+        </template>
+        <template slot="hasAudio" slot-scope="{row}">
+          <el-switch @change="updateChannel(scope.row)" v-model="row.hasAudio" active-color="#409EFF">
+          </el-switch>
+        </template>
+        <template slot="status" slot-scope="{row}">
+          <el-tag size="medium" v-if="row.status == 1">开启</el-tag>
+          <el-tag size="medium" v-else="row.status == 0">关闭</el-tag>
+        </template>
+        <template slot="menu" slot-scope="{row}">
+          <el-button size="mini" icon="el-icon-video-play" v-if="permission.gbdevicechannel_play" @click="devicePlay(row)">播放</el-button>
+          <el-button size="mini" icon="el-icon-switch-button" type="danger" :loading="stopBtnLoading" v-if="permission.gbdevicechannel_stop && !!row.streamId" @click="deviceStopPlay(row)">停止</el-button>
+<!--          <el-button size="mini" type="primary" icon="el-icon-video-camera" v-if="permission.wvpvideodevice_record" @click="deviceRecord(row)">设备录像</el-button>-->
+        </template>
+      </avue-crud>
+    <devicePlayer ref="devicePlayer"></devicePlayer>
+    <el-dialog :modal-append-tobody="false" append-to-body :visible.sync="bindVisible" title="设备绑定" width="60%">
+      <select-dialog-residential :id="form.residentialId" :name="form.residentialName" :callback="selectCallback" v-if="bindVisible"></select-dialog-residential>
+    </el-dialog>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove, bind, sync} from "@/api/device/gb/gbdevice";
+  import {getList as getChannelList, startPlay, stopPlay} from "@/api/device/gb/gbdevicechannel";
+  import {mapGetters} from "vuex";
+  import SelectDialogResidential from "../../../components/select-dialog/select-dialog-residential";
+  import devicePlayer from "../videodevice/devicePlayer";
+
+  export default {
+    components: {devicePlayer, SelectDialogResidential},
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        bindVisible: false,
+        showDeviceChannelCrud: false,
+        deviceId: null,
+        stopBtnLoading: false,
+        selectionList: [],
+        deviceOption: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "设备编号",
+              prop: "deviceId",
+            },
+            {
+              label: "设备名称",
+              prop: "name",
+            },
+            {
+              label: "厂商名称",
+              prop: "manufacturer",
+            },
+            {
+              label: "型号",
+              prop: "model",
+              hide:true,
+              disabled: true
+            },
+            {
+              label: "传输协议",
+              prop: "transport",
+              hide:true,
+              disabled: true
+            },
+            {
+              label: "流传输模式",
+              prop: "streamMode",
+              hide:true,
+              disabled: true,
+              type: "select",
+              dicData:[
+                {
+                  label: "udp传输",
+                  value: "UDP"
+                },
+                {
+                  label: "tcp主动模式",
+                  value: "TCP-ACTIVE"
+                },
+                {
+                  label: "tcp被动模式",
+                  value: "TCP-PASSIVE"
+                },
+              ]
+            },
+            {
+              label: "在线状态",
+              prop: "online",
+              slot:true,
+              search: true,
+              type: "select",
+              width: 100,
+              align: "center",
+              dicData:[
+                {
+                  label: "在线",
+                  value: 1
+                },
+                {
+                  label: "离线",
+                  value: 0
+                }
+              ]
+            },
+            {
+              label: "注册时间",
+              prop: "registerTime",
+            },
+            {
+              label: "心跳时间",
+              prop: "keepaliveTime",
+            },
+            {
+              label: "wan地址",
+              prop: "hostAddress",
+              slot: true
+            },
+            {
+              label: "所属园区",
+              prop: "agencyName",
+            },
+            {
+              label: "所属区域",
+              prop: "residentialName",
+            },
+            {
+              label: "所属园区",
+              prop: "agencyId",
+              hide: true,
+              search: true,
+              filterable: true,
+              cascaderItem: ['residentialId'],
+              type: "select",
+              remote: true,
+              dicUrl: "/api/cyzh-community/agency/list?size=10&name={{key}}",
+              dicFormatter:(res)=>{
+                return res.data.records;//返回字典的层级结构
+              },
+              props: {
+                label: "name",
+                value: "id"
+              },
+            },
+            {
+              label: "所属区域",
+              prop: "residentialId",
+              hide: true,
+              slot: true,
+              type: "select",
+              search: true,
+              dicUrl: "/api/cyzh-community/residential/list?agencyId={{key}}",
+              dicFormatter:(res)=>{
+                return res.data.records;//返回字典的层级结构
+              },
+              filterable: true,
+              props: {
+                label: "name",
+                value: "id"
+              },
+            },
+          ]
+        },
+        deviceChannelOption: {
+          menu: true,
+          menuWidth: 300,
+          height: 'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          labelWidth: 150,
+          border: true,
+          index: true,
+          viewBtn: false,
+          editBtn: false,
+          delBtn: false,
+          selection: true,
+          dialogClickModal: false,
+          addBtn:false,
+          column: [
+            {
+              label: "通道编号",
+              prop: "channelId",
+              span: 12,
+            },
+            {
+              label: "设备编号",
+              prop: "deviceId",
+              span: 12,
+            },
+            {
+              label: "通道名称",
+              prop: "name",
+              span: 12,
+              width: 100,
+              search: true
+            },
+            {
+              label: "开启音频",
+              prop: "hasAudio",
+              span: 12,
+              width: 80,
+              slot: true
+            },
+            {
+              label: "状态",
+              prop: "status",
+              span: 12,
+              width:80,
+              slot: true
+            },
+            {
+              label: "云台类型",
+              prop: "ptzType",
+              span: 12,
+              type: "select",
+              dicData:[
+                {
+                  label: "未知",
+                  value: 0
+                },
+                {
+                  label: "球机",
+                  value: 1
+                },
+                {
+                  label: "半球",
+                  value: 2
+                },
+                {
+                  label: "固定枪机",
+                  value: 3
+                },
+                {
+                  label: "遥控枪机",
+                  value: 4
+                }
+              ]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.gbdevice_add, false),
+          viewBtn: this.vaildData(this.permission.gbdevice_view, false),
+          delBtn: this.vaildData(this.permission.gbdevice_delete, false),
+          editBtn: this.vaildData(this.permission.gbdevice_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      devicePlay(row){
+        let deviceId = row.deviceId;
+        let channelId = row.channelId;
+        let that = this;
+        startPlay(deviceId, channelId).then(res => {
+          if (res.data.code == 200) {
+            that.$refs.devicePlayer.openDialog("media", deviceId, channelId, {
+              streamInfo: res.data.data,
+              hasAudio: row.hasAudio
+            });
+            that.onLoadChannel(that.page);
+          }else {
+            that.$message.error(res.data.msg);
+          }
+        });
+      },
+      deviceStopPlay(row) {
+        let that = this;
+        let deviceId = row.deviceId;
+        let channelId = row.channelId;
+        this.stopBtnLoading = true;
+        stopPlay(deviceId, channelId).then(res => {
+          console.log(JSON.stringify(res));
+          that.onLoadChannel(that.page);
+          this.stopBtnLoading = false;
+        }).catch(err => {
+          if (err.response.status === 402) { // 已经停止过
+            that.onLoadChannel(that.page);
+          }else {
+            console.log(err)
+          }
+        });
+      },
+      channelSearchChange(params, done){
+        this.query = params;
+        this.page.currentPage = 1;
+        params.deviceId = this.deviceId;
+        this.onLoadChannel(this.page, params);
+        done();
+      },
+      handleSync(row, index){
+        sync(row).then(res => {
+          let result = res.data.data;
+          this.$set(this.data, index, result)
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+        });
+      },
+      onLoadChannel(page, params = {}) {
+        this.loading = true;
+        getChannelList(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();
+        });
+      },
+      backToDeviceList(){
+        this.showDeviceChannelCrud = false;
+        this.deviceId = null;
+      },
+      handleChannel(deviceId){
+        this.showDeviceChannelCrud = true;
+        this.deviceId = deviceId;
+        this.page.currentPage = 1;
+        this.onLoadChannel(this.page, {"deviceId": deviceId});
+      },
+      bindDevice(row){
+        this.bindVisible = true;
+        this.deviceId = row.deviceId;
+      },
+      refreshChannelChange() {
+        this.onLoadChannel(this.page, this.query);
+      },
+      selectCallback(row){
+        this.form.residentialId = row.id;
+        this.form.agencyId = row.agencyId;
+        this.form.deviceId = this.deviceId;
+        bind(this.form).then(() =>{
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+        });
+        this.bindVisible = false;
+      },
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      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) {
+        if (["edit", "view"].includes(type)) {
+          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>

+ 271 - 0
src/views/device/gb/gbdevicechannel.vue

@@ -0,0 +1,271 @@
+<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.gbdevicechannel_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/device/gb/gbdevicechannel";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "通道编号",
+              prop: "channeId",
+            },
+            {
+              label: "设备编号",
+              prop: "deviceId",
+            },
+            {
+              label: "通道名称",
+              prop: "name",
+            },
+            {
+              label: "通道厂家",
+              prop: "manufacture",
+            },
+            {
+              label: "型号",
+              prop: "model",
+            },
+            {
+              label: "通道地址",
+              prop: "address",
+            },
+            {
+              label: "父级ID",
+              prop: "parentid",
+            },
+            {
+              label: "IP",
+              prop: "ipAddress",
+            },
+            {
+              label: "端口号",
+              prop: "port",
+            },
+            {
+              label: "云台类型",
+              prop: "ptzType",
+            },
+            {
+              label: "经度",
+              prop: "longitude",
+              rules: [{
+                required: true,
+                message: "请输入经度",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "纬度",
+              prop: "latitude",
+              rules: [{
+                required: true,
+                message: "请输入纬度",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "流编号",
+              prop: "streamId",
+            },
+            {
+              label: "音频",
+              prop: "hasAudio",
+              rules: [{
+                required: true,
+                message: "请输入是否有音频,0无,1有",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.gbdevicechannel_add, false),
+          viewBtn: this.vaildData(this.permission.gbdevicechannel_view, false),
+          delBtn: this.vaildData(this.permission.gbdevicechannel_delete, false),
+          editBtn: this.vaildData(this.permission.gbdevicechannel_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      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) {
+        if (["edit", "view"].includes(type)) {
+          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>

+ 192 - 486
src/views/device/iot/firefighting.vue

@@ -8,9 +8,10 @@
       <avue-form v-model="editForm" :option="option" @submit="submitSmartgas"></avue-form>
     </el-dialog>
 
-    <avue-data-tabs :option="countOption" style="margin-left: 200px"></avue-data-tabs>
+    <avue-data-tabs :option="countOption"></avue-data-tabs>
+    <el-divider style=""></el-divider>
 
-    <avue-crud :option="option" :table-loading="loading" :data="data" :page="page" :permission="permissionList"
+    <avue-crud :option="option" :table-loading="loading" :data="data" :page="page" :permission="permissionLisZt"
       :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">
@@ -44,26 +45,6 @@
         </div>
         <!-- <avue-map v-model="scope.row.mapSelect"></avue-map> -->
       </template>
-
-      <template slot="battery" slot-scope="scope">
-        <!-- <battery style=" width: 90px;height: 30px;" :proIsCharge="proIsCharge" :proQuantity="scope.row.battery"></battery> -->
-        <el-progress v-if="scope.row.battery>20" color="green" :text-inside="true" :stroke-width="18"
-          :percentage="scope.row.battery"></el-progress>
-        <el-progress v-if="scope.row.battery<20 ||scope.row.battery == 20" color="red" :text-inside="true"
-          :stroke-width="18" :percentage="scope.row.battery"></el-progress>
-      </template>
-
-      <template slot="signalIntensity" slot-scope="scope">
-
-      </template>
-      <template slot="menuLeft">
-        <el-tabs :value="query.deviceType" @tab-click="handleClickType">
-          <el-tab-pane label="拓扑索尔-消防栓" name="960417"></el-tab-pane>
-
-          <el-tab-pane label="普通消防栓" name="100003"></el-tab-pane>
-          <el-tab-pane label="物模型消防栓" name="10000005"></el-tab-pane>
-        </el-tabs>
-      </template>
     </avue-crud>
   </basic-container>
 </template>
@@ -119,7 +100,7 @@
         homeUserForm: {},
         orderUserForm: {},
         query: {
-          deviceType: "960417"
+          deviceType: "XFS"
         },
         loading: true,
         alarmSetOptionLoading: true,
@@ -142,53 +123,52 @@
         },
         selectionList: [],
         countOption: {
-          span: 3,
-          data: [{
+          span: 4,
+          data: [
+            {
               click: function(item) {},
-              title: '设备总数',
+              title: '总数',
               count: 0,
               color: '#409EFF',
               key: '设备总数'
             },
             {
               click: function(item) {},
-              title: '正常',
+              title: '在线',
               count: 0,
               color: '#67C23A',
-              key: '正常'
+              key: '在线'
             },
             {
               click: function(item) {},
-              title: '失联',
+              title: '告警',
               count: 0,
               color: '#F56C6C',
-              key: '失联'
+              key: '告警'
             },
             {
               click: function(item) {},
-              title: '告警',
+              title: '激活',
               count: 0,
               color: '#E6A23C',
-              key: '告警'
+              key: '激活'
             },
             {
               click: function(item) {},
-              title: '停用',
+              title: '注册',
               count: 0,
-              color: '#909399',
-              key: '停用'
+              color: '#987856',
+              key: '注册'
             },
             {
               click: function(item) {},
-              title: '待布防',
+              title: '离线',
               count: 0,
-              color: '#987856',
-              key: '待布防'
-            }
+              color: '#909399',
+              key: '离线'
+            },
           ]
         },
-
-
         option: {
           height: 'auto',
           menuWidth: 200,
@@ -196,7 +176,7 @@
           calcHeight: 60,
           tip: false,
           searchShow: true,
-          searchMenuSpan: 20,
+          searchMenuSpan: 4,
           border: true,
           index: true,
           // viewBtn: false,
@@ -206,535 +186,261 @@
           selection: true,
           dialogClickModal: false,
 
-          group: [{
-            icon: 'el-icon-info',
-            label: '基础信息',
-            prop: 'group1',
-            column: [{
+          group: [
+            {
+              icon: 'el-icon-info',
+              label: '基础信息',
+              prop: 'group1',
+              column: [{
                 label: '设备名称',
                 prop: 'deviceName',
               },
-              {
-                label: 'IMEI',
-                prop: 'imei',
-              },
-              {
-                label: "操作者",
-                prop: "person",
-
-                rules: [{
-                  required: false,
-                  message: "请输入操作者",
-                  trigger: "blur"
-                }]
-              },
-
-            ]
-          }, {
-            icon: 'el-icon-bangzhu',
-            label: '产品分类',
-            // arrow: false,
-            prop: 'group2',
-            column: [{
-              label: "平台",
-              prop: "platform",
-              type: "select",
-              value: "aep",
-              cascaderItem: ['productId'],
-              dicData: [{
-                  label: "aep",
-                  value: "aep"
-                },
                 {
-                  label: "scepctwing",
-                  value: "scepctwing",
-                }
-              ],
-            }, {
-              label: "设备注册平台标识",
-              prop: "isAep",
-              search: true,
-              searchSpan: 6,
-              type: "select",
-              display: false,
-              width: 120,
-              // cascaderItem: ['productId'],
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_registry_label",
-              props: {
-                label: 'dictValue',
-                value: 'dictKey'
-              },
-              // dataType: "number",
-              search: true,
-              searchLabelWidth: 140,
-              // searchSpan: 8,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入设备注册平台标识,1:aep,2:华为,3:厂商",
-                trigger: "blur"
-              }]
+                  label: 'IMEI',
+                  prop: 'imei',
+                },
+              ]
             }, {
-              label: "产品类型",
-              prop: "productId",
-              type: "select",
-              remote: true,
-              dicUrl: `/api/cyzh-third/iotaepproduct/list?platform=aep`,
-              props: {
-                label: "productName",
-                value: "productId"
-              },
-              dicFormatter: (res) => {
-                return res.data.records;
-              },
-            }]
-          }, {
-            icon: 'el-icon-location',
-            label: '位置信息',
-            prop: 'group3',
-            column: [{
-                label: '设备用途',
-                prop: 'deviceUsage',
+              icon: 'el-icon-bangzhu',
+              label: '产品分类',
+              // arrow: false,
+              prop: 'group2',
+              column: [{
+                label: "平台",
+                prop: "platform",
                 type: "select",
-                value: 20,
+                value: "aep",
+                cascaderItem: ['productId'],
                 dicData: [{
-                    label: "公共设备",
-                    value: 20
-                  },
-                  {
-                    label: "居家设备",
-                    value: 10
-                  },
+                  label: "aep",
+                  value: "aep"
+                },
                 ],
-                rules: [{
-                  required: true,
-                  message: "设备用途",
-                  trigger: "blur"
-                }]
-              },
-              {
-                label: '所属小区',
-                prop: 'residentialId',
+              }, {
+                label: "产品类型",
+                prop: "productId",
                 type: "select",
                 remote: true,
-                cascaderItem: ['buildingId'],
-                dicUrl: "/api/cyzh-community/residential/list?size=500&name={{key}}",
+                dicUrl: `/api/cyzh-third/iotaepproduct/list?platform=aep`,
                 props: {
-                  label: "name",
-                  value: "id"
+                  label: "productName",
+                  value: "productId"
                 },
                 dicFormatter: (res) => {
-                  return res.data.records;
-                },
-                rules: [{
-                  required: true,
-                  message: "所属小区",
-                  trigger: "blur"
-                }]
-              },
-              {
-                label: '所属楼栋',
-                prop: 'buildingId',
-                type: "select",
-                display: true,
-                cascaderItem: ['unitId'],
-                dicUrl: "/api/cyzh-community/building/list?size=500&residentialId={{key}}",
-                props: {
-                  label: "name",
-                  value: "id"
+                  return res.records;
                 },
-                dicFormatter: (res) => {
-                  return res.data.records;
+              }]
+            }, {
+              icon: 'el-icon-location',
+              label: '位置信息',
+              prop: 'group3',
+              column: [
+                {
+                  label: '所属区域',
+                  prop: 'residentialId',
+                  type: "select",
+                  remote: true,
+                  cascaderItem: ['buildingId'],
+                  dicUrl: "/api/cyzh-community/residential/list?size=500&name={{key}}",
+                  props: {
+                    label: "name",
+                    value: "id"
+                  },
+                  dicFormatter: (res) => {
+                    return res.data.records;
+                  },
+                  rules: [{
+                    required: false,
+                    message: "请选择所属区域",
+                    trigger: "blur"
+                  }]
                 },
-              },
-              {
-                label: '所属单元',
-                prop: 'unitId',
-                display: true,
-                type: "select",
-                cascaderItem: ['roomId'],
-                dicUrl: "/api/cyzh-community/unit/list?size=500&buildingId={{key}}",
-                props: {
-                  label: "name",
-                  value: "id"
+                {
+                  label: '所属楼栋',
+                  prop: 'buildingId',
+                  type: "select",
+                  display: true,
+                  dicUrl: "/api/cyzh-community/building/list?size=500&residentialId={{key}}",
+                  props: {
+                    label: "name",
+                    value: "id"
+                  },
+                  dicFormatter: (res) => {
+                    return res.data.records;
+                  },
                 },
-                dicFormatter: (res) => {
-                  return res.data.records;
+                {
+                  label: '',
+                  prop: 'mapSelect',
+                  // row: true,
+                  // span: 20,
+                  formslot: true,
+                  hide: true,
                 },
-              },
-              {
-                label: '所属房间',
-                prop: 'roomId',
-                type: "select",
-                display: true,
-                dicUrl: "/api/cyzh-community/room/list?size=500&unitId={{key}}",
-                props: {
-                  label: "name",
-                  value: "id"
+                {
+                  label: "经度",
+                  prop: "longitude",
+                  // disabled: true,
                 },
-                dicFormatter: (res) => {
-                  return res.data.records;
+                {
+                  label: "纬度",
+                  prop: "latitude",
+                  // disabled: true,
                 },
-              },
-              {
-                label: '',
-                prop: 'mapSelect',
-                // row: true,
-                // span: 20,
-                formslot: true,
-                hide: true,
-              },
-              {
-                label: "经度",
-                prop: "longitude",
-                // disabled: true,
-              },
-              {
-                label: "纬度",
-                prop: "latitude",
-                // disabled: true,
-              },
-              {
-                label: "安装位置",
-                prop: "deviceInstallAddress",
-                row: true,
-                span: 24,
-                // disabled: true,
-              }
-
-            ]
-          }],
-          column: [{
-              label: "设备唯一标识",
-              prop: "deviceId",
-              display: false,
-              hide: true,
-              rules: [{
-                required: true,
-                message: "请输入设备唯一标识",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备名称",
-              prop: "deviceName",
-              search: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入设备名称",
-                trigger: "blur"
-              }]
-            },
-
-            {
-              label: "设备注册平台标识",
-              prop: "isAep",
-              search: true,
-              searchSpan: 6,
-              display: false,
-              type: "select",
-              width: 120,
-              // cascaderItem: ['productId'],
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_registry_label",
-              props: {
-                label: 'dictValue',
-                value: 'dictKey'
-              },
-              // dataType: "number",
-              search: true,
-              searchLabelWidth: 140,
-              // searchSpan: 8,
-
-              rules: [{
-                required: true,
-                message: "请输入设备注册平台标识,1:aep,2:华为,3:厂商",
-                trigger: "blur"
-              }]
-            },
-
-            {
-              label: "操作者",
-              prop: "operator",
-              hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入操作者",
-                trigger: "blur"
-              }]
-            },
+                {
+                  label: "安装位置",
+                  prop: "deviceInstallAddress",
+                  row: true,
+                  span: 24,
+                  // disabled: true,
+                }
 
-            {
-              label: "订阅事件",
-              prop: "autoObserver",
-              type: "select",
-              hide: true,
-              display: false,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=auto_subscribe",
-              props: {
-                label: "dictValue",
-                value: "dictKey"
-              },
-              dataType: "number",
-              rules: [{
-                required: true,
-                message: "请输入0 自动订阅(默认),1 取消自动订阅 (LWM2M 协议选填,其他协议不填)",
-                trigger: "blur"
-              }]
-            },
+              ]
+            }],
+          column: [
             {
               label: "设备类型",
               prop: "deviceType",
               type: "select",
-              hide: true,
+              searchSpan: 4,
               display: false,
-              // search: true,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_type",
-              props: {
-                label: "dictValue",
-                value: "dictKey",
-              },
-              rules: [{
-                required: true,
-                message: "请输入设备类型",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "安装位置",
-              prop: "deviceInstallAddress",
-              search: true,
-              display: false,
-              overHidden: true,
-              rules: [{
-                required: true,
-                message: "请输入安装位置",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备状态",
-              prop: "deviceStatus",
-              type: "select",
-              search: true,
-              display: false,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_status",
+              dicUrl: "/api/blade-system/dict-biz/dictionary?code=iot_device_type",
               props: {
                 label: "dictValue",
                 value: "dictKey"
               },
-              dataType: "number",
-              rules: [{
-                required: true,
-                message: "请输入设备状态",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "电池电量",
-              prop: "battery",
-              slot: true,
-
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入电池电量",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "信号强度",
-              prop: "signalIntensity",
-              slot: true,
-              display: false,
               rules: [{
                 required: true,
-                message: "请输入信号强度",
+                message: "请选择设备类型",
                 trigger: "blur"
               }]
             },
             {
-              label: "厂家名称",
-              prop: "manufacturers",
-              hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入厂家名称",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "厂商编号(附录)",
-              prop: "manufacturersNo",
-              hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入厂商编号(附录)",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备型号",
-              prop: "deviceSpecld",
-              hide: true,
+              label: "设备名称",
+              prop: "deviceName",
               display: false,
+              searchSpan: 4,
+              search: true,
+              overHidden:true,
               rules: [{
                 required: true,
-                message: "请输入设备型号",
+                message: "请输入设备名称",
                 trigger: "blur"
               }]
             },
             {
-              label: "IMEI号",
-              hide: true,
-              display: false,
+              label: "IMEI",
               prop: "imei",
-              rules: [{
-                required: true,
-                message: "请输入IMEI号",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "iccid",
-              prop: "iccid",
-              hide: true,
               display: false,
               rules: [{
                 required: true,
-                message: "请输入iccid",
+                message: "请输入IMEI",
                 trigger: "blur"
               }]
             },
             {
-              label: "Mcu软件版本",
-              prop: "mcuEdition",
-              hide: true,
+              label: "设备状态",
+              prop: "deviceStatus",
+              type: "select",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入Mcu软件版本",
-                trigger: "blur"
-              }]
+              searchSpan: 4,
+              search: true,
+              editDisplay: false,
+              addDisplay: false,
+              dicData:[
+                {
+                  label: "已注册",
+                  value: 0
+                },
+                {
+                  label: "已激活",
+                  value: 1
+                },
+                {
+                  label: "已注销",
+                  value: 2
+                }
+              ]
             },
             {
-              label: "NB模组型号",
-              prop: "nbModuleModel",
-              hide: true,
+              label: "在线状态",
+              prop: "deviceNetStatus",
+              type: "select",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入NB模组型号",
-                trigger: "blur"
-              }]
+              searchSpan: 4,
+              search: true,
+              editDisplay: false,
+              addDisplay: false,
+              dicData:[
+                {
+                  label: "在线",
+                  value: 1
+                },
+                {
+                  label: "离线",
+                  value: 2
+                },
+              ]
             },
             {
-              label: "NB模组版本信息",
-              prop: "nbModuleEdition",
-              hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入NB模组版本信息",
-                trigger: "blur"
-              }]
+              label: "所属园区",
+              prop: "agencyName",
+              addDisplay: false,
+              editDisplay: false
             },
             {
-              label: "最后更新时间",
-              prop: "lastUpdateTime",
-              hide: true,
-              display: false,
-              type: "datetime",
-              valueFormat: "yyyy-MM-dd HH:mm:ss",
-              rules: [{
-                required: true,
-                message: "请输入最后更新时间",
-                trigger: "blur"
-              }]
+              label: "所属区域",
+              prop: "residentialName",
+              addDisplay: false,
+              editDisplay: false
             },
             {
-              label: "心跳保护时间",
-              prop: "heartbeatTime",
-              hide: true,
+              label: "经度",
+              prop: "longitude",
               display: false,
-              type: "datetime",
-              valueFormat: "yyyy-MM-dd HH:mm:ss",
-              rules: [{
-                required: true,
-                message: "请输入心跳保护时间",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "无线信号覆盖等级",
-              prop: "wirelessLevel",
               hide: true,
-              display: false,
               rules: [{
-                required: true,
-                message: "请输入无线信号覆盖等级",
+                required: false,
+                message: "请输入经纬度",
                 trigger: "blur"
               }]
             },
             {
-              label: "当前磁场值",
-              prop: "magneticField",
-              hide: true,
+              label: "纬度",
+              prop: "latitude",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入当前磁场值",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "终端发射功率",
-              prop: "transmittingPower",
               hide: true,
-              display: false,
               rules: [{
-                required: true,
-                message: "请输入终端发射功率",
+                required: false,
+                message: "请输入经纬度",
                 trigger: "blur"
               }]
             },
+
             {
-              label: "终端接收功率",
-              prop: "receivingPower",
-              hide: true,
+              label: "安装位置",
+              prop: "deviceInstallAddress",
               display: false,
               rules: [{
-                required: true,
-                message: "请输入终端接收功率",
+                required: false,
+                message: "请输入安装位置",
                 trigger: "blur"
               }]
             },
             {
-              label: "信噪比",
-              prop: "signalNoiseRatio",
+              label: "最后上线时间",
+              prop: "lastOnlineAt",
               hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入信噪比",
-                trigger: "blur"
-              }]
+              addDisplay: false,
+              editDisplay: false,
             },
             {
-              label: "IMSI",
-              prop: "imsi",
+              label: "最后上线时间",
+              prop: "lastOfflineAt",
               hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入IMSI",
-                trigger: "blur"
-              }]
+              addDisplay: false,
+              editDisplay: false,
             },
-
           ]
         },
         data: []

+ 191 - 487
src/views/device/iot/gasmonitoring.vue

@@ -8,7 +8,8 @@
       <avue-form v-model="editForm" :option="option" @submit="submitSmartgas"></avue-form>
     </el-dialog>
 
-    <avue-data-tabs :option="countOption" style="margin-left: 200px"></avue-data-tabs>
+    <avue-data-tabs :option="countOption"></avue-data-tabs>
+    <el-divider style=""></el-divider>
 
     <avue-crud :option="option" :table-loading="loading" :data="data" :page="page" :permission="permissionList"
       :before-open="beforeOpen" v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave" @row-del="rowDel"
@@ -45,25 +46,6 @@
         <!-- <avue-map v-model="scope.row.mapSelect"></avue-map> -->
       </template>
 
-      <template slot="battery" slot-scope="scope">
-        <!-- <battery style=" width: 90px;height: 30px;" :proIsCharge="proIsCharge" :proQuantity="scope.row.battery"></battery> -->
-        <el-progress v-if="scope.row.battery>20" color="green" :text-inside="true" :stroke-width="18"
-          :percentage="scope.row.battery"></el-progress>
-        <el-progress v-if="scope.row.battery<20 ||scope.row.battery == 20" color="red" :text-inside="true"
-          :stroke-width="18" :percentage="scope.row.battery"></el-progress>
-      </template>
-
-      <template slot="signalIntensity" slot-scope="scope">
-
-      </template>
-      <template slot="menuLeft">
-        <el-tabs :value="query.deviceType" @tab-click="handleClickType">
-          <el-tab-pane></el-tab-pane>
-          <el-tab-pane label="燃气报警器" name="100020"></el-tab-pane>
-          <el-tab-pane label="燃气报警器-物模型" name="10000017"></el-tab-pane>
-          <el-tab-pane></el-tab-pane>
-        </el-tabs>
-      </template>
     </avue-crud>
   </basic-container>
 </template>
@@ -119,7 +101,7 @@
         homeUserForm: {},
         orderUserForm: {},
         query: {
-          deviceType: "100020"
+          deviceType: "QG"
         },
         loading: true,
         alarmSetOptionLoading: true,
@@ -142,53 +124,52 @@
         },
         selectionList: [],
         countOption: {
-          span: 3,
-          data: [{
+          span: 4,
+          data: [
+            {
               click: function(item) {},
-              title: '设备总数',
+              title: '总数',
               count: 0,
               color: '#409EFF',
               key: '设备总数'
             },
             {
               click: function(item) {},
-              title: '正常',
+              title: '在线',
               count: 0,
               color: '#67C23A',
-              key: '正常'
+              key: '在线'
             },
             {
               click: function(item) {},
-              title: '失联',
+              title: '告警',
               count: 0,
               color: '#F56C6C',
-              key: '失联'
+              key: '告警'
             },
             {
               click: function(item) {},
-              title: '告警',
+              title: '激活',
               count: 0,
               color: '#E6A23C',
-              key: '告警'
+              key: '激活'
             },
             {
               click: function(item) {},
-              title: '停用',
+              title: '注册',
               count: 0,
-              color: '#909399',
-              key: '停用'
+              color: '#987856',
+              key: '注册'
             },
             {
               click: function(item) {},
-              title: '待布防',
+              title: '离线',
               count: 0,
-              color: '#987856',
-              key: '待布防'
-            }
+              color: '#909399',
+              key: '离线'
+            },
           ]
         },
-
-
         option: {
           height: 'auto',
           menuWidth: 200,
@@ -196,545 +177,268 @@
           calcHeight: 60,
           tip: false,
           searchShow: true,
-          searchMenuSpan: 20,
+          searchMenuSpan: 4,
           border: true,
           index: true,
-          // viewBtn: false,
-          // addBtn: false,
-          // delBtn: false,
           editBtn: false,
           selection: true,
           dialogClickModal: false,
 
-          group: [{
-            icon: 'el-icon-info',
-            label: '基础信息',
-            prop: 'group1',
-            column: [{
+          group: [
+            {
+              icon: 'el-icon-info',
+              label: '基础信息',
+              prop: 'group1',
+              column: [{
                 label: '设备名称',
                 prop: 'deviceName',
               },
-              {
-                label: 'IMEI',
-                prop: 'imei',
-              },
-              {
-                label: "操作者",
-                prop: "person",
-
-                rules: [{
-                  required: false,
-                  message: "请输入操作者",
-                  trigger: "blur"
-                }]
-              },
-
-            ]
-          }, {
-            icon: 'el-icon-bangzhu',
-            label: '产品分类',
-            // arrow: false,
-            prop: 'group2',
-            column: [{
-              label: "平台",
-              prop: "platform",
-              type: "select",
-              value: "aep",
-              cascaderItem: ['productId'],
-              dicData: [{
-                  label: "aep",
-                  value: "aep"
-                },
                 {
-                  label: "scepctwing",
-                  value: "scepctwing",
-                }
-              ],
-            }, {
-              label: "设备注册平台标识",
-              prop: "isAep",
-              search: true,
-              searchSpan: 6,
-              type: "select",
-              display: false,
-              width: 120,
-              // cascaderItem: ['productId'],
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_registry_label",
-              props: {
-                label: 'dictValue',
-                value: 'dictKey'
-              },
-              // dataType: "number",
-              search: true,
-              searchLabelWidth: 140,
-              // searchSpan: 8,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入设备注册平台标识,1:aep,2:华为,3:厂商",
-                trigger: "blur"
-              }]
+                  label: 'IMEI',
+                  prop: 'imei',
+                },
+              ]
             }, {
-              label: "产品类型",
-              prop: "productId",
-              type: "select",
-              remote: true,
-              dicUrl: `/api/cyzh-third/iotaepproduct/list?platform=aep`,
-              props: {
-                label: "productName",
-                value: "productId"
-              },
-              dicFormatter: (res) => {
-                return res.data.records;
-              },
-            }]
-          }, {
-            icon: 'el-icon-location',
-            label: '位置信息',
-            prop: 'group3',
-            column: [{
-                label: '设备用途',
-                prop: 'deviceUsage',
+              icon: 'el-icon-bangzhu',
+              label: '产品分类',
+              // arrow: false,
+              prop: 'group2',
+              column: [{
+                label: "平台",
+                prop: "platform",
                 type: "select",
-                value: 20,
+                value: "aep",
+                cascaderItem: ['productId'],
                 dicData: [{
-                    label: "公共设备",
-                    value: 20
-                  },
-                  {
-                    label: "居家设备",
-                    value: 10
-                  },
+                  label: "aep",
+                  value: "aep"
+                },
                 ],
-                rules: [{
-                  required: true,
-                  message: "设备用途",
-                  trigger: "blur"
-                }]
-              },
-              {
-                label: '所属小区',
-                prop: 'residentialId',
+              }, {
+                label: "产品类型",
+                prop: "productId",
                 type: "select",
                 remote: true,
-                cascaderItem: ['buildingId'],
-                dicUrl: "/api/cyzh-community/residential/list?size=500&name={{key}}",
+                dicUrl: `/api/cyzh-third/iotaepproduct/list?platform=aep`,
                 props: {
-                  label: "name",
-                  value: "id"
+                  label: "productName",
+                  value: "productId"
                 },
                 dicFormatter: (res) => {
-                  return res.data.records;
+                  return res.records;
                 },
-                rules: [{
-                  required: true,
-                  message: "所属小区",
-                  trigger: "blur"
-                }]
-              },
-              {
-                label: '所属楼栋',
-                prop: 'buildingId',
-                type: "select",
-                display: true,
-                cascaderItem: ['unitId'],
-                dicUrl: "/api/cyzh-community/building/list?size=500&residentialId={{key}}",
-                props: {
-                  label: "name",
-                  value: "id"
-                },
-                dicFormatter: (res) => {
-                  return res.data.records;
+              }]
+            }, {
+              icon: 'el-icon-location',
+              label: '位置信息',
+              prop: 'group3',
+              column: [
+                {
+                  label: '所属区域',
+                  prop: 'residentialId',
+                  type: "select",
+                  remote: true,
+                  cascaderItem: ['buildingId'],
+                  dicUrl: "/api/cyzh-community/residential/list?size=500&name={{key}}",
+                  props: {
+                    label: "name",
+                    value: "id"
+                  },
+                  dicFormatter: (res) => {
+                    return res.data.records;
+                  },
+                  rules: [{
+                    required: false,
+                    message: "请选择所属区域",
+                    trigger: "blur"
+                  }]
                 },
-              },
-              {
-                label: '所属单元',
-                prop: 'unitId',
-                display: true,
-                type: "select",
-                cascaderItem: ['roomId'],
-                dicUrl: "/api/cyzh-community/unit/list?size=500&buildingId={{key}}",
-                props: {
-                  label: "name",
-                  value: "id"
+                {
+                  label: '所属楼栋',
+                  prop: 'buildingId',
+                  type: "select",
+                  display: true,
+                  dicUrl: "/api/cyzh-community/building/list?size=500&residentialId={{key}}",
+                  props: {
+                    label: "name",
+                    value: "id"
+                  },
+                  dicFormatter: (res) => {
+                    return res.data.records;
+                  },
                 },
-                dicFormatter: (res) => {
-                  return res.data.records;
+                {
+                  label: '',
+                  prop: 'mapSelect',
+                  // row: true,
+                  // span: 20,
+                  formslot: true,
+                  hide: true,
                 },
-              },
-              {
-                label: '所属房间',
-                prop: 'roomId',
-                type: "select",
-                display: true,
-                dicUrl: "/api/cyzh-community/room/list?size=500&unitId={{key}}",
-                props: {
-                  label: "name",
-                  value: "id"
+                {
+                  label: "经度",
+                  prop: "longitude",
+                  // disabled: true,
                 },
-                dicFormatter: (res) => {
-                  return res.data.records;
+                {
+                  label: "纬度",
+                  prop: "latitude",
+                  // disabled: true,
                 },
-              },
-              {
-                label: '',
-                prop: 'mapSelect',
-                // row: true,
-                // span: 20,
-                formslot: true,
-                hide: true,
-              },
-              {
-                label: "经度",
-                prop: "longitude",
-                // disabled: true,
-              },
-              {
-                label: "纬度",
-                prop: "latitude",
-                // disabled: true,
-              },
-              {
-                label: "安装位置",
-                prop: "deviceInstallAddress",
-                row: true,
-                span: 24,
-                // disabled: true,
-              }
-
-            ]
-          }],
-          column: [{
-              label: "设备唯一标识",
-              prop: "deviceId",
-              display: false,
-              hide: true,
-              rules: [{
-                required: true,
-                message: "请输入设备唯一标识",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备名称",
-              prop: "deviceName",
-              search: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入设备名称",
-                trigger: "blur"
-              }]
-            },
-
-            {
-              label: "设备注册平台标识",
-              prop: "isAep",
-              search: true,
-              searchSpan: 6,
-              display: false,
-              type: "select",
-              width: 120,
-              // cascaderItem: ['productId'],
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_registry_label",
-              props: {
-                label: 'dictValue',
-                value: 'dictKey'
-              },
-              // dataType: "number",
-              search: true,
-              searchLabelWidth: 140,
-              // searchSpan: 8,
-
-              rules: [{
-                required: true,
-                message: "请输入设备注册平台标识,1:aep,2:华为,3:厂商",
-                trigger: "blur"
-              }]
-            },
-
-            {
-              label: "操作者",
-              prop: "operator",
-              hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入操作者",
-                trigger: "blur"
-              }]
-            },
+                {
+                  label: "安装位置",
+                  prop: "deviceInstallAddress",
+                  row: true,
+                  span: 24,
+                  // disabled: true,
+                }
 
-            {
-              label: "订阅事件",
-              prop: "autoObserver",
-              type: "select",
-              hide: true,
-              display: false,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=auto_subscribe",
-              props: {
-                label: "dictValue",
-                value: "dictKey"
-              },
-              dataType: "number",
-              rules: [{
-                required: true,
-                message: "请输入0 自动订阅(默认),1 取消自动订阅 (LWM2M 协议选填,其他协议不填)",
-                trigger: "blur"
-              }]
-            },
+              ]
+            }],
+          column: [
             {
               label: "设备类型",
               prop: "deviceType",
               type: "select",
-              hide: true,
+              searchSpan: 4,
               display: false,
-              // search: true,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_type",
-              props: {
-                label: "dictValue",
-                value: "dictKey",
-              },
-              rules: [{
-                required: true,
-                message: "请输入设备类型",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "安装位置",
-              prop: "deviceInstallAddress",
-              search: true,
-              display: false,
-              overHidden: true,
-              rules: [{
-                required: true,
-                message: "请输入安装位置",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备状态",
-              prop: "deviceStatus",
-              type: "select",
-              search: true,
-              display: false,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_status",
+              dicUrl: "/api/blade-system/dict-biz/dictionary?code=iot_device_type",
               props: {
                 label: "dictValue",
                 value: "dictKey"
               },
-              dataType: "number",
-              rules: [{
-                required: true,
-                message: "请输入设备状态",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "电池电量",
-              prop: "battery",
-              slot: true,
-
-              display: false,
               rules: [{
                 required: true,
-                message: "请输入电池电量",
+                message: "请选择设备类型",
                 trigger: "blur"
               }]
             },
             {
-              label: "信号强度",
-              prop: "signalIntensity",
-              slot: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入信号强度",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "厂家名称",
-              prop: "manufacturers",
-              hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入厂家名称",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "厂商编号(附录)",
-              prop: "manufacturersNo",
-              hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入厂商编号(附录)",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备型号",
-              prop: "deviceSpecld",
-              hide: true,
+              label: "设备名称",
+              prop: "deviceName",
               display: false,
+              searchSpan: 4,
+              search: true,
+              overHidden:true,
               rules: [{
                 required: true,
-                message: "请输入设备型号",
+                message: "请输入设备名称",
                 trigger: "blur"
               }]
             },
             {
-              label: "IMEI号",
-              hide: true,
-              display: false,
+              label: "IMEI",
               prop: "imei",
-              rules: [{
-                required: true,
-                message: "请输入IMEI号",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "iccid",
-              prop: "iccid",
-              hide: true,
               display: false,
               rules: [{
                 required: true,
-                message: "请输入iccid",
+                message: "请输入IMEI",
                 trigger: "blur"
               }]
             },
             {
-              label: "Mcu软件版本",
-              prop: "mcuEdition",
-              hide: true,
+              label: "设备状态",
+              prop: "deviceStatus",
+              type: "select",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入Mcu软件版本",
-                trigger: "blur"
-              }]
+              searchSpan: 4,
+              search: true,
+              editDisplay: false,
+              addDisplay: false,
+              dicData:[
+                {
+                  label: "已注册",
+                  value: 0
+                },
+                {
+                  label: "已激活",
+                  value: 1
+                },
+                {
+                  label: "已注销",
+                  value: 2
+                }
+              ]
             },
             {
-              label: "NB模组型号",
-              prop: "nbModuleModel",
-              hide: true,
+              label: "在线状态",
+              prop: "deviceNetStatus",
+              type: "select",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入NB模组型号",
-                trigger: "blur"
-              }]
+              searchSpan: 4,
+              search: true,
+              editDisplay: false,
+              addDisplay: false,
+              dicData:[
+                {
+                  label: "在线",
+                  value: 1
+                },
+                {
+                  label: "离线",
+                  value: 2
+                },
+              ]
             },
             {
-              label: "NB模组版本信息",
-              prop: "nbModuleEdition",
-              hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入NB模组版本信息",
-                trigger: "blur"
-              }]
+              label: "所属园区",
+              prop: "agencyName",
+              addDisplay: false,
+              editDisplay: false
             },
             {
-              label: "最后更新时间",
-              prop: "lastUpdateTime",
-              hide: true,
-              display: false,
-              type: "datetime",
-              valueFormat: "yyyy-MM-dd HH:mm:ss",
-              rules: [{
-                required: true,
-                message: "请输入最后更新时间",
-                trigger: "blur"
-              }]
+              label: "所属区域",
+              prop: "residentialName",
+              addDisplay: false,
+              editDisplay: false
             },
             {
-              label: "心跳保护时间",
-              prop: "heartbeatTime",
-              hide: true,
+              label: "经度",
+              prop: "longitude",
               display: false,
-              type: "datetime",
-              valueFormat: "yyyy-MM-dd HH:mm:ss",
-              rules: [{
-                required: true,
-                message: "请输入心跳保护时间",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "无线信号覆盖等级",
-              prop: "wirelessLevel",
               hide: true,
-              display: false,
               rules: [{
-                required: true,
-                message: "请输入无线信号覆盖等级",
+                required: false,
+                message: "请输入经纬度",
                 trigger: "blur"
               }]
             },
             {
-              label: "当前磁场值",
-              prop: "magneticField",
-              hide: true,
+              label: "纬度",
+              prop: "latitude",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入当前磁场值",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "终端发射功率",
-              prop: "transmittingPower",
               hide: true,
-              display: false,
               rules: [{
-                required: true,
-                message: "请输入终端发射功率",
+                required: false,
+                message: "请输入经纬度",
                 trigger: "blur"
               }]
             },
+
             {
-              label: "终端接收功率",
-              prop: "receivingPower",
-              hide: true,
+              label: "安装位置",
+              prop: "deviceInstallAddress",
               display: false,
               rules: [{
-                required: true,
-                message: "请输入终端接收功率",
+                required: false,
+                message: "请输入安装位置",
                 trigger: "blur"
               }]
             },
             {
-              label: "信噪比",
-              prop: "signalNoiseRatio",
+              label: "最后上线时间",
+              prop: "lastOnlineAt",
               hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入信噪比",
-                trigger: "blur"
-              }]
+              addDisplay: false,
+              editDisplay: false,
             },
             {
-              label: "IMSI",
-              prop: "imsi",
+              label: "最后上线时间",
+              prop: "lastOfflineAt",
               hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入IMSI",
-                trigger: "blur"
-              }]
+              addDisplay: false,
+              editDisplay: false,
             },
-
           ]
         },
         data: []

+ 101 - 479
src/views/device/iotdevice.vue → src/views/device/iot/iotdevice.vue

@@ -8,9 +8,7 @@
                 width="80%">
       <avue-form v-model="editForm" :option="option" @submit="submitSmartDevice">
         <template slot="mapSelect">
-
           <input class="el-input--small el-input__inner" placeholder="选择地址" @click="mapVisible2 = true">
-          <!-- <avue-map v-model="editForm.mapSelect"></avue-map> -->
         </template>
       </avue-form>
     </el-dialog>
@@ -25,24 +23,6 @@
       </avue-form>
     </el-dialog>
 
-    <!-- <el-dialog :modal-append-to-body="false" :visible.sync="detailVisible" :title="titleText" width="80%">
-      <el-tabs @tab-click="handleClick" v-model="activeName">
-        <el-tab-pane label="设备详情" name="first">
-          <device-detail pic="/img/device/smoke.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 100004 || deviceDetail.deviceType == 10000002"></device-detail>
-          <device-detail pic="/img/device/gas.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 100020 || deviceDetail.deviceType == 10000017 || deviceDetail.deviceType == 100055"></device-detail>
-          <device-detail pic="/img/device/cover.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 3"></device-detail>
-          <device-detail pic="/img/device/alarm.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 950414"></device-detail>
-          <device-detail pic="/img/device/lamp.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 100011"></device-detail>
-          <device-detail pic="/img/device/fire_hydrant.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 960417"></device-detail>
-          <device-detail pic="/img/device/trashbin.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 100022"></device-detail>
-          <device-detail pic="/img/device/parkingmonitor.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 100007"></device-detail>
-          <device-detail pic="/img/device/gate.png" :device="deviceDetail" v-if="deviceDetail.deviceType == 9"></device-detail>
-        </el-tab-pane>
-        <el-tab-pane label="告警设置" name="second">
-        <alarm :alarmData="alarmData" :alarmSetData="alarmSetData" :residential-id="residentialId"></alarm>
-        </el-tab-pane>
-      </el-tabs>
-    </el-dialog> -->
     <el-container>
       <el-main>
         <template>
@@ -92,7 +72,7 @@
                @current-change="currentChange"
                @size-change="sizeChange"
                @refresh-change="refreshChange"
-               @on-load="onLoad">
+               @on-load="onLoad"></avue-crud>
 
       <template slot="mapSelectForm" slot-scope="scope">
         <div>
@@ -125,27 +105,6 @@
 
       </template>
 
-      <template slot="battery" slot-scope="scope">
-        <!-- <battery style=" width: 90px;height: 30px;" :proIsCharge="proIsCharge" :proQuantity="scope.row.battery"></battery> -->
-        <el-progress v-if="scope.row.battery>20" color="green" :text-inside="true" :stroke-width="18" :percentage="scope.row.battery"></el-progress>
-        <el-progress v-if="scope.row.battery<20 ||scope.row.battery == 20" color="red" :text-inside="true"
-                     :stroke-width="18" :percentage="scope.row.battery"></el-progress>
-      </template>
-
-      <template slot="signalIntensity" slot-scope="scope">
-        <img src="/img/device/signal0.png" :alt="scope.row.signalIntensity" :title="scope.row.signalIntensity"
-             style="width: 30px;height: 30px;text-align: center;" v-if="scope.row.signalIntensity<-100 || scope.row.signalIntensity==-100">
-        <img src="/img/device/signal1.png" :alt="scope.row.signalIntensity" :title="scope.row.signalIntensity"
-             style="width: 30px;height: 30px;text-align: center;" v-if="scope.row.signalIntensity>-100 && (scope.row.signalIntensity<-88 || scope.row.signalIntensity == -88)">
-        <img src="/img/device/signal2.png" :alt="scope.row.signalIntensity" :title="scope.row.signalIntensity"
-             style="width: 30px;height: 30px;text-align: center;" v-if="scope.row.signalIntensity>-88 && (scope.row.signalIntensity<-77 || scope.row.signalIntensity == -77)">
-        <img src="/img/device/signal3.png" :alt="scope.row.signalIntensity" :title="scope.row.signalIntensity"
-             style="width: 30px;height: 30px;text-align: center;" v-if="scope.row.signalIntensity>-66 && (scope.row.signalIntensity<-55 || scope.row.signalIntensity == -55)">
-        <img src="/img/device/signal4.png" :alt="scope.row.signalIntensity" :title="scope.row.signalIntensity"
-             style="width: 30px;height: 30px;text-align: center;" v-if="scope.row.signalIntensity>-55 || scope.row.signalIntensity==-55">
-      </template>
-    </avue-crud>
-
     <!--    小区列表-->
     <el-dialog :modal-append-to-body="false" append-to-body :visible.sync="bindVisible" title="设备绑定" center width="20%">
       <div style="text-align: center;">
@@ -191,11 +150,11 @@ import {
   mapGetters
 } from "vuex";
 import {getAllList} from "@/api/community/residential";
-import alarmhistory from "../../components/device/alarmhistory.vue";
+import alarmhistory from "../../../components/device/alarmhistory.vue";
 import {dataDisplay} from "@/api/dataview/dataviewoption";
-import customAvueMap from "../../components/residential/customAvueMap.vue"
-import editPolygonMap from "../../components/residential/editPolygonMap.vue"
-import {getEnterpriseList} from "../../api/device/iotdevice";
+import customAvueMap from "../../../components/residential/customAvueMap.vue"
+import editPolygonMap from "../../../components/residential/editPolygonMap.vue"
+import {getEnterpriseList} from "../../../api/device/iotdevice";
 export default {
   components:{
     alarmhistory,customAvueMap,editPolygonMap
@@ -246,88 +205,6 @@ export default {
 
       selectionList: [],
       dataShowOption: {},
-      transhbinRecordOption: {
-        height: 'auto',
-        menuWidth: 200,
-        calcHeight: 30,
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-
-        addBtn: false,
-
-        menu: false,
-
-        selection: true,
-        dialogClickModal: false,
-        column: [
-          // {
-          //   label:"企业绑定",
-          //   prop:"enterpriseBind",
-          //   type: 'tree',
-          //   filterText:'搜索关键字制自定义',
-          //   multiple:true,
-          //   dicData:DIC
-          // },
-          {
-            label: "时间",
-            prop: "time",
-            rules: [{
-              required: true,
-              message: "请输入设备唯一标识",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "设备号",
-            prop: "deviceNumber",
-            rules: [{
-              required: true,
-              message: "请输入设备唯一标识",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "设备名称",
-            prop: "deviceName",
-            search: true,
-            rules: [{
-              required: true,
-              message: "请输入设备名称",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "描述",
-            prop: "introduce",
-            rules: [{
-              required: true,
-              message: "请输入设备注册平台标识,1:aep,2:华为,3:厂商",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "卡号",
-            prop: "cardNo",
-            rules: [{
-              required: true,
-              message: "请输入产品,对应 aep 产品的 apikey",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "重量",
-            prop: "heavy",
-            rules: [{
-              required: true,
-              message: "请输入操作者",
-              trigger: "blur"
-            }]
-          }
-        ]
-      },
 
       option: {
         height: 'auto',
@@ -335,7 +212,7 @@ export default {
         calcHeight: 30,
         tip: false,
         searchShow: true,
-        searchMenuSpan: 20,
+        searchMenuSpan: 4,
         border: true,
         index: true,
         viewBtn:false,
@@ -344,27 +221,21 @@ export default {
         editBtn: false,
         selection: true,
         dialogClickModal: false,
-        column: [{
-          label: "设备编码",
-          prop: "deviceId",
-          width: 100,
-          hide: true,
-          // search:true,
-          // display: false,
-          rules: [{
-            required: true,
-            message: "请输入设备唯一标识",
-            trigger: "blur"
-          }]
-        },
+        column: [
           {
-            label: "IMEI号",
-            prop: "imei",
-            width: 130,
-            hide: true,
+            label: "设备类型",
+            prop: "deviceType",
+            type: "select",
+            searchSpan: 4,
+            search: true,
+            dicUrl: "/api/blade-system/dict-biz/dictionary?code=iot_device_type",
+            props: {
+              label: "dictValue",
+              value: "dictKey"
+            },
             rules: [{
               required: true,
-              message: "请输入IMEI号",
+              message: "请选择设备类型",
               trigger: "blur"
             }]
           },
@@ -373,7 +244,6 @@ export default {
             prop: "deviceName",
             searchSpan: 4,
             search: true,
-            // width:200,
             overHidden:true,
             rules: [{
               required: true,
@@ -382,398 +252,151 @@ export default {
             }]
           },
           {
-            label: "所属小区",
-            prop: "residentialId",
-            type:"select",
-            searchSpan: 4,
-            remote: true,
-            dicUrl: "/api/cyzh-community/residential/list?size=10000&name={{key}}",
-            props:{
-              label: "name",
-              value: "id"
-            },
-            dicFormatter:(res)=>{
-              return res.data.records;
-            },
-            searchFilterable: true,
-            search: true,
+            label: "IMEI",
+            prop: "imei",
             rules: [{
               required: true,
-              message: "请输入",
+              message: "请输入IMEI",
               trigger: "blur"
             }]
           },
           {
-            label: "企业",
-            prop: "enterpriseIds",
+            label: "设备状态",
+            prop: "deviceStatus",
             type: "select",
             searchSpan: 4,
-            display: false,
-            hide: true,
-            remote: true,
-            dicUrl: "/api/cyzh-enterprise/enterprise/list?enterpriseName={{key}}",
-            props:{
-              label: "enterpriseName",
-              value: "id"
-            },
-            searchFilterable: true,
-            search: false,
-            rules: [{
-              required: true,
-              message: "请输入",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "设备注册平台标识",
-            prop: "isAep",
-            type: "select",
-            width: 80,
-            dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_registry_label",
-            props: {
-              label: 'dictValue',
-              value: 'dictKey'
-            },
-            dataType: "number",
-            // search: true,
-            searchLabelWidth: 140,
-            searchSpan: 8,
-
-            rules: [{
-              required: true,
-              message: "请输入设备注册平台标识,1:aep,2:华为,3:厂商",
-              trigger: "blur"
-            }]
-          },
-          {
-            label:'',
-            prop:'mapSelect',
-            // row: true,
-            // span: 20,
-            formslot: true,
-            hide: true,
-          },
-          {
-            label: "经纬度",
-            prop: "latitudeLongitude",
-            hide: true,
-            rules: [{
-              required: true,
-              message: "请输入经纬度",
-              trigger: "blur"
-            }]
-          },
-
-          {
-            label: "apikey",
-            prop: "masterKey",
-            hide: true,
-            viewDisplay:false,
-            rules: [{
-              required: false,
-              message: "请输入产品,对应 aep 产品的 apikey",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "操作者",
-            prop: "operator",
-            hide: true,
-            addDisplay: false,
-            display: false,
-            rules: [{
-              required: false,
-              message: "请输入操作者",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "产品ID",
-            prop: "productId",
-            hide: true,
+            search: true,
+            editDisplay: false,
             addDisplay: false,
-            display: false,
-            rules: [{
-              required: false,
-              message: "请输入产品ID",
-              trigger: "blur"
-            }]
+            dicData:[
+              {
+                label: "已注册",
+                value: 0
+              },
+              {
+                label: "已激活",
+                value: 1
+              },
+              {
+                label: "已注销",
+                value: 2
+              }
+            ]
           },
           {
-            label: "订阅事件",
-            prop: "autoObserver",
+            label: "在线状态",
+            prop: "deviceNetStatus",
             type: "select",
-            hide: true,
+            searchSpan: 4,
+            search: true,
+            editDisplay: false,
             addDisplay: false,
-            display: false,
-            dicUrl: "/api/blade-system/dict-biz/dictionary?code=auto_subscribe",
-            props: {
-              label: "dictValue",
-              value: "dictKey"
-            },
-            dataType: "number",
-            rules: [{
-              required: false,
-              message: "请输入0 自动订阅(默认),1 取消自动订阅 (LWM2M 协议选填,其他协议不填)",
-              trigger: "blur"
-            }]
+            dicData:[
+              {
+                label: "在线",
+                value: 1
+              },
+              {
+                label: "离线",
+                value: 2
+              },
+            ]
           },
-          {
-            label: "设备类型",
-            prop: "deviceType",
-            type: "select",
-            width: 70,
+          /*{
+            label: "所属园区",
+            prop: "agencyId",
             searchSpan: 4,
+            slot: true,
             search: true,
-            dicUrl: "/api/blade-system/dict-biz/dictionary?code=iot_device_type",
+            cascaderItem: ['residentialId'],
+            type: "select",
+            remote: true,
+            dicUrl: "/api/cyzh-community/agency/list",
+            dicFormatter:(res)=>{
+              return res.data.records;//返回字典的层级结构
+            },
             props: {
-              label: "dictValue",
-              value: "dictKey"
+              label: "name",
+              value: "id"
             },
-            dataType: "string",
-            // display: false,
             rules: [{
               required: true,
-              message: "请输入设备类型",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "安装位置",
-            prop: "deviceInstallAddress",
-            search: true,
-            viewDisplay:false,
-            rules: [{
-              required: false,
-              message: "请输入安装位置",
+              message: "请选择所属社区",
               trigger: "blur"
             }]
           },
           {
-            label: "设备状态",
-            prop: "deviceStatus",
+            label: "所属区域",
+            prop: "residentialId",
+            slot: true,
             type: "select",
-            search: true,
-            searchSpan: 4,
-            width: 70,
-            display: false,
-            addDisplay: false,
-            dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_status",
+            dicUrl: "/api/cyzh-community/residential/list?agencyId={{key}}",
+            dicFormatter:(res)=>{
+              return res.data.records;//返回字典的层级结构
+            },
+            filterable: true,
             props: {
-              label: "dictValue",
-              value: "dictKey"
+              label: "name",
+              value: "id"
             },
-            dataType: "number",
-            rules: [{
-              required: true,
-              message: "请输入设备状态",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "电池电量",
-            prop: "battery",
-            slot: true,
-            width: 100,
-            display: false,
-            addDisplay: false,
             rules: [{
               required: true,
-              message: "请输入电池电量",
+              message: "请选择所属小区",
               trigger: "blur"
             }]
-          },
+          },*/
           {
-            label: "信号强度",
-            prop: "signalIntensity",
-            slot: true,
-            display: false,
-            width: 80,
-            addDisplay: false,
-            rules: [{
-              required: true,
-              message: "请输入信号强度",
-              trigger: "blur"
-            }]
+            label: "所属园区",
+            prop: "agencyName",
           },
           {
-            label: "厂家名称",
-            prop: "manufacturers",
-            hide: true,
-            rules: [{
-              required: false,
-              message: "请输入厂家名称",
-              trigger: "blur"
-            }]
+            label: "所属区域",
+            prop: "residentialName",
           },
           {
-            label: "厂商编号(附录)",
-            prop: "manufacturersNo",
+            label: "经度",
+            prop: "longitude",
             hide: true,
-            display: false,
-            addDisplay: false,
             rules: [{
               required: false,
-              message: "请输入厂商编号(附录)",
+              message: "请输入经纬度",
               trigger: "blur"
             }]
           },
           {
-            label: "设备型号",
-            prop: "deviceSpecld",
+            label: "纬度",
+            prop: "latitude",
             hide: true,
             rules: [{
               required: false,
-              message: "请输入设备型号",
+              message: "请输入经纬度",
               trigger: "blur"
             }]
           },
 
           {
-            label: "iccid",
-            prop: "iccid",
-            display: false,
-            addDisplay: false,
-            hide: true,
-            rules: [{
-              required: false,
-              message: "请输入iccid",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "Mcu软件版本",
-            prop: "mcuEdition",
-            hide: true,
-            viewDisplay:false,
-            rules: [{
-              required: false,
-              message: "请输入Mcu软件版本",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "NB模组型号",
-            prop: "nbModuleModel",
-            hide: true,
-            viewDisplay:false,
-            rules: [{
-              required: false,
-              message: "请输入NB模组型号",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "NB模组版本信息",
-            prop: "nbModuleEdition",
-            hide: true,
-            viewDisplay:false,
-            rules: [{
-              required: false,
-              message: "请输入NB模组版本信息",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "最后更新时间",
-            prop: "lastUpdateTime",
-            hide: true,
-            display: false,
-            addDisplay: false,
-            type: "datetime",
-            valueFormat: "yyyy-MM-dd HH:mm:ss",
-            rules: [{
-              required: false,
-              message: "请输入最后更新时间",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "心跳保护时间",
-            prop: "heartbeatTime",
-            type: "datetime",
-            addDisplay: false,
-            display: false,
-            hide: true,
-            valueFormat: "yyyy-MM-dd HH:mm:ss",
-            rules: [{
-              required: false,
-              message: "请输入心跳保护时间",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "无线信号覆盖等级",
-            prop: "wirelessLevel",
-            hide: true,
-            display: false,
-            addDisplay: false,
-            rules: [{
-              required: false,
-              message: "请输入无线信号覆盖等级",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "当前磁场值",
-            prop: "magneticField",
-            hide: true,
-            display: false,
-            addDisplay: false,
-            rules: [{
-              required: false,
-              message: "请输入当前磁场值",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "终端发射功率",
-            prop: "transmittingPower",
-            hide: true,
-            display: false,
-            addDisplay: false,
+            label: "安装位置",
+            prop: "deviceInstallAddress",
             rules: [{
               required: false,
-              message: "请输入终端发射功率",
+              message: "请输入安装位置",
               trigger: "blur"
             }]
           },
           {
-            label: "终端接收功率",
-            prop: "receivingPower",
+            label: "最后上线时间",
+            prop: "lastOnlineAt",
             hide: true,
-            display: false,
             addDisplay: false,
-            rules: [{
-              required: false,
-              message: "请输入终端接收功率",
-              trigger: "blur"
-            }]
+            editDisplay: false,
           },
           {
-            label: "信噪比",
-            prop: "signalNoiseRatio",
+            label: "最后上线时间",
+            prop: "lastOfflineAt",
             hide: true,
             addDisplay: false,
-            display: false,
-            rules: [{
-              required: false,
-              message: "请输入信噪比",
-              trigger: "blur"
-            }]
-          },
-          {
-            label: "IMSI",
-            prop: "imsi",
-            hide: true,
-            viewDisplay:false,
-            rules: [{
-              required: false,
-              message: "请输入IMSI",
-              trigger: "blur"
-            }]
+            editDisplay: false,
           },
-
         ]
       },
       //详情字段
@@ -1083,12 +706,12 @@ export default {
     },
   },
   created() {
-    deviceListCount({deviceUsage : 20}).then(res =>{
+    deviceListCount().then(res =>{
       this.deviceCount = res.data.data;
     })
   },
   mounted() {
-    this.option.column[4].search = this.permission.bind_enterprises;
+    // this.option.column[4].search = this.permission.bind_enterprises;
 
     let tenantType = localStorage.getItem("tenantType");
     const residentialColumn = this.findObject(this.option.column, "residentialId");
@@ -1378,7 +1001,6 @@ export default {
 
     onLoad(page, params = {}) {
       this.loading = true;
-      params.deviceUsage = 20; //公共区域
       /*getSmartDeviceStaticVo(Object.assign(params, this.query)).then(res =>{
         this.SmartDeviceStaticVo = res.data.data;
       })*/

+ 113 - 450
src/views/device/iot/smartsmoke.vue

@@ -8,7 +8,8 @@
       <avue-form v-model="editForm" :option="option" @submit="submitSmartsmoke"></avue-form>
     </el-dialog>
 
-    <avue-data-tabs :option="countOption" style="margin-left: 200px"></avue-data-tabs>
+    <avue-data-tabs :option="countOption"></avue-data-tabs>
+    <el-divider style=""></el-divider>
 
     <avue-crud :option="option" :table-loading="loading" :data="data" :page="page" :permission="permissionList"
       :before-open="beforeOpen" v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave" @row-del="rowDel"
@@ -44,26 +45,6 @@
         </div>
         <!-- <avue-map v-model="scope.row.mapSelect"></avue-map> -->
       </template>
-
-      <template slot="battery" slot-scope="scope">
-        <!-- <battery style=" width: 90px;height: 30px;" :proIsCharge="proIsCharge" :proQuantity="scope.row.battery"></battery> -->
-        <el-progress v-if="scope.row.battery>20" color="green" :text-inside="true" :stroke-width="18"
-          :percentage="scope.row.battery"></el-progress>
-        <el-progress v-if="scope.row.battery<20 ||scope.row.battery == 20" color="red" :text-inside="true"
-          :stroke-width="18" :percentage="scope.row.battery"></el-progress>
-      </template>
-
-      <template slot="signalIntensity" slot-scope="scope">
-
-      </template>
-      <template slot="menuLeft">
-        <el-tabs :value="query.deviceType" @tab-click="handleClickType">
-          <el-tab-pane></el-tab-pane>
-          <el-tab-pane label="烟感" name="100004"></el-tab-pane>
-          <el-tab-pane label="烟感-物模型" name="10000002"></el-tab-pane>
-          <el-tab-pane></el-tab-pane>
-        </el-tabs>
-      </template>
     </avue-crud>
   </basic-container>
 </template>
@@ -121,7 +102,7 @@
         homeUserForm: {},
         orderUserForm: {},
         query: {
-          deviceType: "100004"
+          deviceType: "YG"
         },
         loading: true,
         alarmSetOptionLoading: true,
@@ -144,53 +125,52 @@
         },
         selectionList: [],
         countOption: {
-          span: 3,
-          data: [{
+          span: 4,
+          data: [
+            {
               click: function(item) {},
-              title: '设备总数',
+              title: '总数',
               count: 0,
               color: '#409EFF',
               key: '设备总数'
             },
             {
               click: function(item) {},
-              title: '正常',
+              title: '在线',
               count: 0,
               color: '#67C23A',
-              key: '正常'
+              key: '在线'
             },
             {
               click: function(item) {},
-              title: '失联',
+              title: '告警',
               count: 0,
               color: '#F56C6C',
-              key: '失联'
+              key: '告警'
             },
             {
               click: function(item) {},
-              title: '告警',
+              title: '激活',
               count: 0,
               color: '#E6A23C',
-              key: '告警'
+              key: '激活'
             },
             {
               click: function(item) {},
-              title: '停用',
+              title: '注册',
               count: 0,
-              color: '#909399',
-              key: '停用'
+              color: '#987856',
+              key: '注册'
             },
             {
               click: function(item) {},
-              title: '待布防',
+              title: '离线',
               count: 0,
-              color: '#987856',
-              key: '待布防'
-            }
+              color: '#909399',
+              key: '离线'
+            },
           ]
         },
-
-
         option: {
           height: 'auto',
           menuWidth: 200,
@@ -198,17 +178,15 @@
           calcHeight: 60,
           tip: false,
           searchShow: true,
-          searchMenuSpan: 20,
           border: true,
           index: true,
-          // viewBtn: false,
-          // addBtn: false,
-          // delBtn: false,
           editBtn: false,
           selection: true,
+          searchMenuSpan: 4,
           dialogClickModal: false,
 
-          group: [{
+          group: [
+            {
             icon: 'el-icon-info',
             label: '基础信息',
             prop: 'group1',
@@ -220,17 +198,6 @@
                 label: 'IMEI',
                 prop: 'imei',
               },
-              {
-                label: "操作者",
-                prop: "person",
-
-                rules: [{
-                  required: false,
-                  message: "请输入操作者",
-                  trigger: "blur"
-                }]
-              },
-
             ]
           }, {
             icon: 'el-icon-bangzhu',
@@ -247,75 +214,27 @@
                   label: "aep",
                   value: "aep"
                 },
-                {
-                  label: "scepctwing",
-                  value: "scepctwing",
-                }
               ],
-            }, {
-              label: "设备注册平台标识",
-              prop: "isAep",
-              search: true,
-              searchSpan: 6,
-              type: "select",
-              display: false,
-              width: 120,
-              // cascaderItem: ['productId'],
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_registry_label",
-              props: {
-                label: 'dictValue',
-                value: 'dictKey'
-              },
-              // dataType: "number",
-              search: true,
-              searchLabelWidth: 140,
-              // searchSpan: 8,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入设备注册平台标识,1:aep,2:华为,3:厂商",
-                trigger: "blur"
-              }]
             }, {
               label: "产品类型",
               prop: "productId",
               type: "select",
-              remote: true,
-              dicUrl: `/api/cyzh-third/iotaepproduct/list?platform=aep`,
+              dicUrl: `/api/cyzh-third/iotaepproduct/list?platform=aep&size=100`,
               props: {
                 label: "productName",
                 value: "productId"
               },
               dicFormatter: (res) => {
-                return res.records;
+                return res.data.records;
               },
             }]
           }, {
             icon: 'el-icon-location',
             label: '位置信息',
             prop: 'group3',
-            column: [{
-                label: '设备用途',
-                prop: 'deviceUsage',
-                type: "select",
-                value: 20,
-                dicData: [{
-                    label: "公共设备",
-                    value: 20
-                  },
-                  {
-                    label: "居家设备",
-                    value: 10
-                  },
-                ],
-                rules: [{
-                  required: true,
-                  message: "设备用途",
-                  trigger: "blur"
-                }]
-              },
+            column: [
               {
-                label: '所属区',
+                label: '所属区域',
                 prop: 'residentialId',
                 type: "select",
                 remote: true,
@@ -329,8 +248,8 @@
                   return res.data.records;
                 },
                 rules: [{
-                  required: true,
-                  message: "所属区",
+                  required: false,
+                  message: "请选择所属区",
                   trigger: "blur"
                 }]
               },
@@ -339,7 +258,6 @@
                 prop: 'buildingId',
                 type: "select",
                 display: true,
-                cascaderItem: ['unitId'],
                 dicUrl: "/api/cyzh-community/building/list?size=500&residentialId={{key}}",
                 props: {
                   label: "name",
@@ -349,35 +267,6 @@
                   return res.data.records;
                 },
               },
-              {
-                label: '所属单元',
-                prop: 'unitId',
-                display: true,
-                type: "select",
-                cascaderItem: ['roomId'],
-                dicUrl: "/api/cyzh-community/unit/list?size=500&buildingId={{key}}",
-                props: {
-                  label: "name",
-                  value: "id"
-                },
-                dicFormatter: (res) => {
-                  return res.data.records;
-                },
-              },
-              {
-                label: '所属房间',
-                prop: 'roomId',
-                type: "select",
-                display: true,
-                dicUrl: "/api/cyzh-community/room/list?size=500&unitId={{key}}",
-                props: {
-                  label: "name",
-                  value: "id"
-                },
-                dicFormatter: (res) => {
-                  return res.data.records;
-                },
-              },
               {
                 label: '',
                 prop: 'mapSelect',
@@ -406,337 +295,150 @@
 
             ]
           }],
-          column: [{
-              label: "设备唯一标识",
-              prop: "deviceId",
-              display: false,
-              hide: true,
-              rules: [{
-                required: true,
-                message: "请输入设备唯一标识",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备名称",
-              prop: "deviceName",
-              search: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入设备名称",
-                trigger: "blur"
-              }]
-            },
-
-            {
-              label: "设备注册平台标识",
-              prop: "isAep",
-              search: true,
-              searchSpan: 6,
-              display: false,
-              type: "select",
-              width: 120,
-              // cascaderItem: ['productId'],
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_registry_label",
-              props: {
-                label: 'dictValue',
-                value: 'dictKey'
-              },
-              // dataType: "number",
-              search: true,
-              searchLabelWidth: 140,
-              // searchSpan: 8,
-
-              rules: [{
-                required: true,
-                message: "请输入设备注册平台标识,1:aep,2:华为,3:厂商",
-                trigger: "blur"
-              }]
-            },
-
-            {
-              label: "操作者",
-              prop: "operator",
-              hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入操作者",
-                trigger: "blur"
-              }]
-            },
-
-            {
-              label: "订阅事件",
-              prop: "autoObserver",
-              type: "select",
-              hide: true,
-              display: false,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=auto_subscribe",
-              props: {
-                label: "dictValue",
-                value: "dictKey"
-              },
-              dataType: "number",
-              rules: [{
-                required: true,
-                message: "请输入0 自动订阅(默认),1 取消自动订阅 (LWM2M 协议选填,其他协议不填)",
-                trigger: "blur"
-              }]
-            },
+          column: [
             {
               label: "设备类型",
               prop: "deviceType",
               type: "select",
-              hide: true,
-              display: false,
-              // search: true,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_type",
-              props: {
-                label: "dictValue",
-                value: "dictKey",
-              },
-              rules: [{
-                required: true,
-                message: "请输入设备类型",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "安装位置",
-              prop: "deviceInstallAddress",
-              search: true,
-              display: false,
-              overHidden: true,
-              rules: [{
-                required: true,
-                message: "请输入安装位置",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备状态",
-              prop: "deviceStatus",
-              type: "select",
-              search: true,
+              searchSpan: 4,
               display: false,
-              dicUrl: "/api/blade-system/dict-biz/dictionary?code=device_status",
+              dicUrl: "/api/blade-system/dict-biz/dictionary?code=iot_device_type",
               props: {
                 label: "dictValue",
                 value: "dictKey"
               },
-              dataType: "number",
-              rules: [{
-                required: true,
-                message: "请输入设备状态",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "电池电量",
-              prop: "battery",
-              slot: true,
-
-              display: false,
               rules: [{
                 required: true,
-                message: "请输入电池电量",
+                message: "请选择设备类型",
                 trigger: "blur"
               }]
             },
             {
-              label: "信号强度",
-              prop: "signalIntensity",
-              slot: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入信号强度",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "厂家名称",
-              prop: "manufacturers",
-              hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入厂家名称",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "厂商编号(附录)",
-              prop: "manufacturersNo",
-              hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入厂商编号(附录)",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "设备型号",
-              prop: "deviceSpecld",
-              hide: true,
+              label: "设备名称",
+              prop: "deviceName",
               display: false,
+              searchSpan: 4,
+              search: true,
+              overHidden:true,
               rules: [{
                 required: true,
-                message: "请输入设备型号",
+                message: "请输入设备名称",
                 trigger: "blur"
               }]
             },
             {
-              label: "IMEI号",
-              hide: true,
-              display: false,
+              label: "IMEI",
               prop: "imei",
-              rules: [{
-                required: true,
-                message: "请输入IMEI号",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "iccid",
-              prop: "iccid",
-              hide: true,
               display: false,
               rules: [{
                 required: true,
-                message: "请输入iccid",
+                message: "请输入IMEI",
                 trigger: "blur"
               }]
             },
             {
-              label: "Mcu软件版本",
-              prop: "mcuEdition",
-              hide: true,
+              label: "设备状态",
+              prop: "deviceStatus",
+              type: "select",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入Mcu软件版本",
-                trigger: "blur"
-              }]
+              searchSpan: 4,
+              search: true,
+              editDisplay: false,
+              addDisplay: false,
+              dicData:[
+                {
+                  label: "已注册",
+                  value: 0
+                },
+                {
+                  label: "已激活",
+                  value: 1
+                },
+                {
+                  label: "已注销",
+                  value: 2
+                }
+              ]
             },
             {
-              label: "NB模组型号",
-              prop: "nbModuleModel",
-              hide: true,
+              label: "在线状态",
+              prop: "deviceNetStatus",
+              type: "select",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入NB模组型号",
-                trigger: "blur"
-              }]
+              searchSpan: 4,
+              search: true,
+              editDisplay: false,
+              addDisplay: false,
+              dicData:[
+                {
+                  label: "在线",
+                  value: 1
+                },
+                {
+                  label: "离线",
+                  value: 2
+                },
+              ]
             },
             {
-              label: "NB模组版本信息",
-              prop: "nbModuleEdition",
-              hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入NB模组版本信息",
-                trigger: "blur"
-              }]
+              label: "所属园区",
+              prop: "agencyName",
+              addDisplay: false,
+              editDisplay: false
             },
             {
-              label: "最后更新时间",
-              prop: "lastUpdateTime",
-              hide: true,
-              display: false,
-              type: "datetime",
-              valueFormat: "yyyy-MM-dd HH:mm:ss",
-              rules: [{
-                required: true,
-                message: "请输入最后更新时间",
-                trigger: "blur"
-              }]
+              label: "所属区域",
+              prop: "residentialName",
+              addDisplay: false,
+              editDisplay: false
             },
             {
-              label: "心跳保护时间",
-              prop: "heartbeatTime",
-              hide: true,
+              label: "经度",
+              prop: "longitude",
               display: false,
-              type: "datetime",
-              valueFormat: "yyyy-MM-dd HH:mm:ss",
-              rules: [{
-                required: true,
-                message: "请输入心跳保护时间",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "无线信号覆盖等级",
-              prop: "wirelessLevel",
               hide: true,
-              display: false,
               rules: [{
-                required: true,
-                message: "请输入无线信号覆盖等级",
+                required: false,
+                message: "请输入经纬度",
                 trigger: "blur"
               }]
             },
             {
-              label: "当前磁场值",
-              prop: "magneticField",
-              hide: true,
+              label: "纬度",
+              prop: "latitude",
               display: false,
-              rules: [{
-                required: true,
-                message: "请输入当前磁场值",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "终端发射功率",
-              prop: "transmittingPower",
               hide: true,
-              display: false,
               rules: [{
-                required: true,
-                message: "请输入终端发射功率",
+                required: false,
+                message: "请输入经纬度",
                 trigger: "blur"
               }]
             },
+
             {
-              label: "终端接收功率",
-              prop: "receivingPower",
-              hide: true,
+              label: "安装位置",
+              prop: "deviceInstallAddress",
               display: false,
               rules: [{
-                required: true,
-                message: "请输入终端接收功率",
+                required: false,
+                message: "请输入安装位置",
                 trigger: "blur"
               }]
             },
             {
-              label: "信噪比",
-              prop: "signalNoiseRatio",
+              label: "最后上线时间",
+              prop: "lastOnlineAt",
               hide: true,
-              display: false,
-              rules: [{
-                required: true,
-                message: "请输入信噪比",
-                trigger: "blur"
-              }]
+              addDisplay: false,
+              editDisplay: false,
             },
             {
-              label: "IMSI",
-              prop: "imsi",
+              label: "最后上线时间",
+              prop: "lastOfflineAt",
               hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入IMSI",
-                trigger: "blur"
-              }]
+              addDisplay: false,
+              editDisplay: false,
             },
-
           ]
         },
         data: []
@@ -744,7 +446,6 @@
     },
     watch: {
       "form.platform"() {
-        // let platformColumn = this.option.group[1].column[0];
         let isAepColumn = this.option.group[1].column[1];
         let productColumn = this.option.group[1].column[2];
         if (this.form.platform == "aep") {
@@ -757,25 +458,6 @@
             isAepColumn.display = false;
             productColumn.display = true
           })
-        } else if (this.form.platform == "scepctwing") {
-          getIotList(1, 10000, {
-            "platform": "scepctwing"
-          }).then(res => {
-            productColumn['dicData'] = res.data.records
-            // if(this.form.productId != ""){
-            productColumn.dicUrl = "/api/cyzh-third/iotaepproduct/list?platform=scepctwing&productName={{key}}"
-            // }else{
-            //   productColumn.dicUrl = "/api/cyzh-third/iotaepproduct/list?platform=scepctwing"
-            //   }
-
-            // platformColumn.cascaderItem = []
-            isAepColumn.display = true;
-            if (this.form.isAep == 1) {
-              productColumn.display = true
-            } else {
-              productColumn.display = false
-            }
-          })
         }
         this.option = Object.assign({}, this.option)
       },
@@ -791,21 +473,6 @@
         this.option = Object.assign({}, this.option)
       },
 
-      "form.deviceUsage"() {
-        console.log(this.form.deviceUsage + "dddd")
-        const buildingColumn = this.option.group[2].column[2];
-        const unitColumn = this.option.group[2].column[3];
-        const roomColumn = this.option.group[2].column[4];
-        if (this.form.deviceUsage === 20) { //公共设备
-          buildingColumn.display = false;
-          unitColumn.display = false;
-          roomColumn.display = false;
-        } else {
-          buildingColumn.display = true;
-          unitColumn.display = true;
-          roomColumn.display = true;
-        }
-      },
       "form.residentialId"() {
         if (this.form.residentialId != '' && this.form.residentialId != undefined) {
           getResidentialDetail(this.form.residentialId).then(res => {
@@ -1012,20 +679,16 @@
       },
       onLoad(page, params = {}) {
         this.loading = true;
-        // params.prefix = "ctwing/smoke3";
-        params.deviceUsage = 20; //公共区域
         deviceListCount(params).then(res => {
-
-
           this.smartDeviceStaticVo = res.data.data;
           this.smartDeviceStaticVo.forEach(staticDevice => {
             if (staticDevice.deviceType == params.deviceType) {
               this.countOption.data[0].count = staticDevice.deviceCount;
-              this.countOption.data[1].count = staticDevice.normalCount;
-              this.countOption.data[2].count = staticDevice.outlineCount;
-              this.countOption.data[3].count = staticDevice.alarmCount;
-              this.countOption.data[4].count = staticDevice.pauseCount;
-              this.countOption.data[5].count = staticDevice.armedCount;
+              this.countOption.data[1].count = staticDevice.onlineCount;
+              this.countOption.data[2].count = staticDevice.alarmCount;
+              this.countOption.data[3].count = staticDevice.activeCount;
+              this.countOption.data[4].count = staticDevice.registerCount;
+              this.countOption.data[5].count = staticDevice.offlineCount;
             }
           })
 

+ 48 - 58
src/views/device/videodevice/wvp/wvpvideodevice.vue

@@ -26,9 +26,9 @@
           <el-button-group>
             <el-button size="mini" :disabled="row.online != 1" type="primary" icon="el-icon-video-camera-solid" @click="handleChannel(row.deviceId)">通 道</el-button>
             <el-button size="mini" icon="el-icon-delete" type="danger" v-if="row.online != 1"  @click="deleteDevice(row.deviceId)">删除</el-button>
+            <el-button size="mini" type="success" @click="bindDevice(row)">绑 定</el-button>
           </el-button-group>
         </template>
-
       </avue-crud>
     </div>
     <basic-container v-if="showDeviceChannelCrud">
@@ -73,43 +73,8 @@
       </avue-crud>
     </basic-container>
     <devicePlayer ref="devicePlayer"></devicePlayer>
-    <!--    小区列表-->
-    <el-dialog :modal-append-to-body="false" append-to-body :visible.sync="bindVisible" title="设备绑定" center width="20%">
-      <div style="text-align: center;">
-        <!-- <el-select v-model="selectValue" filterable placeholder="请选择">
-          <el-option v-for="item in residentialList" :key="item.id" :label="item.name" :value="item.id">
-          </el-option>
-        </el-select>
-        <p style="margin-top: 20px;">
-          <el-button type="primary" icon="el-icon-paperclip" @click="bindDevice">绑定</el-button>
-        </p> -->
-        <avue-form v-model="bindForm" :option="bindOption" @submit="bindDevice">
-
-        </avue-form>
-      </div>
-    </el-dialog>
-
-    <el-dialog :modal-append-to-body="false" append-to-body :visible.sync="bindBatchVisible" title="设备批量绑定" center
-               width="50%">
-      <div style="text-align: center;">
-        <avue-form v-model="bindBatchForm" :option="bindOption" @submit="bindBatchDevice">
-
-        </avue-form>
-      </div>
-    </el-dialog>
-
-    <el-dialog :modal-append-to-body="false" append-to-body :visible.sync="videoVisible" title="视频监控" center width="50%">
-      <div>
-        <div align="center">{{video.name}}</div>
-        <video :id="videoId" controls="true" width="100%" height="100%">
-        </video>
-      </div>
-    </el-dialog>
-    <el-dialog :modal-append-tobody="false" append-to-body :visible.sync="editVisiable" title="编辑" width="60%">
-      <avue-form :option="option" v-model="editForm" @submit="submitVideoclouddevice"></avue-form>
-    </el-dialog>
-    <el-dialog :modal-append-tobody="false" append-to-body :visible.sync="detailVisible" title="查看" width="60%">
-      <avue-form :option="option1" v-model="detailForm" ></avue-form>
+    <el-dialog :modal-append-tobody="false" append-to-body :visible.sync="bindVisible" title="设备绑定" width="60%">
+      <select-dialog-residential :id="form.residentialId" :name="form.residentialName" :callback="selectCallback" v-if="bindVisible"></select-dialog-residential>
     </el-dialog>
 
   </basic-container>
@@ -122,7 +87,8 @@ import {
   getChannelList,
   startPlay,
   stopPlay,
-  deleteDevice
+  deleteDevice,
+  bind
 } from "../../../../api/device/wvpvideodevice.js";
 import {
   mapGetters
@@ -131,11 +97,14 @@ import {
   getAllList
 } from "../../../../api/community/residential.js";
 import devicePlayer from "../../videodevice/devicePlayer";
+import SelectDialogResidential from "../../../../components/select-dialog/select-dialog-residential";
 
 export default {
-  components: {devicePlayer},
+  components: {devicePlayer, SelectDialogResidential},
   data() {
     return {
+      deviceId: null,
+      bindVisible: false,
       stopBtnLoading: false,
       openVideoDialog: false,
       parentChannelId: 0,
@@ -247,6 +216,28 @@ export default {
               trigger: "blur"
             }]
           },
+          {
+            label: "所属区域",
+            prop: "residentialId",
+            display: false,
+            hide:true
+          },
+          {
+            label: "所属园区",
+            prop: "agencyId",
+            display: false,
+            hide:true
+          },
+          {
+            label: "所属园区",
+            prop: "agencyName",
+            display: false,
+          },
+          {
+            label: "所属区域",
+            prop: "residentialName",
+            display: false,
+          }
         ]
       },
       deviceChannelOption: {
@@ -388,7 +379,8 @@ export default {
         editBtn: this.vaildData(this.permission.wvpvideodevice_edit, false),
         playBtn: this.vaildData(this.permission.wvpvideodevice_play, false),
         recordBtn: this.vaildData(this.permission.wvpvideodevice_record, false),
-        stopBtn: this.vaildData(this.permission.wvpvideodevice_stop, false)
+        stopBtn: this.vaildData(this.permission.wvpvideodevice_stop, false),
+        bindBtn: this.vaildData(this.permission.wvpvideodevice_bind, false)
       };
     },
     ids() {
@@ -400,6 +392,20 @@ export default {
     }
   },
   methods: {
+    bindDevice(row){
+      this.bindVisible = true;
+      this.deviceId = row.deviceId;
+    },
+    selectCallback(row){
+      this.form.residentialId = row.id;
+      this.form.agencyId = row.agencyId;
+      this.form.deviceId = this.deviceId;
+      bind(this.deviceId, row.agencyId, row.id).then(() =>{
+
+      });
+      this.bindVisible = false;
+      return;
+    },
     dateFormat(fmt, date) {
       let ret;
       const opt = {
@@ -568,22 +574,6 @@ export default {
         console.log(error);
       });
     },
-    bindDevice(loading,done) {
-      // this.form.residentialId = this.selectValue;
-      //保存
-      updateVideoDevice(this.bindForm).then(() => {
-        this.onLoad(this.page);
-        this.bindVisible = false;
-        this.$message({
-          type: "success",
-          message: "操作成功!"
-        });
-        done();
-      }, error => {
-        loading();
-        console.log(error);
-      });
-    },
     rowSave(row, done, loading) {
       add(row).then(() => {
         this.onLoad(this.page);
@@ -651,7 +641,7 @@ export default {
     },
     beforeOpen(done, type) {
       if (["edit", "view"].includes(type)) {
-        getDetail(this.form.id).then(res => {
+        getDetail(form.id).then(res => {
           this.form = res.data.data;
         });
       }

+ 4 - 5
src/views/enterprise/enterprise.vue

@@ -300,13 +300,12 @@
               }]
             },
             {
-              label: "机构路径",
-              prop: "orgPosition",
+              label: "登录密码",
+              prop: "password",
               hide: true,
-              display: false,
               rules: [{
-                required: true,
-                message: "请输入机构路径",
+                required: false,
+                message: "请输入机登录密码",
                 trigger: "blur"
               }]
             },

+ 23 - 5
src/views/enterprise/staff.vue

@@ -36,7 +36,7 @@
       </template>
 
       <template slot="menu" slot-scope="scope">
-        <el-button type="text" size="small" icon="el-icon-setting">
+        <el-button type="text" size="mini" icon="el-icon-setting">
           <el-dropdown>
             <span class="el-dropdown-link">
               操作<i class="el-icon-arrow-down el-icon--right"></i>
@@ -48,7 +48,9 @@
               </el-dropdown-item>
               <el-dropdown-item style="color: limegreen" divided v-if="!!scope.row.face && scope.row.auditStatus == 1" @click.native="pushUserFaceToDevice(scope.row)" icon="el-icon-sort-down">人脸下发
               </el-dropdown-item>
-              <el-dropdown-item @click.native="setAdmin(scope.row)" icon="el-icon-setting">设为管理员
+              <el-dropdown-item style="color: red" divided v-if="!!scope.row.face && scope.row.auditStatus == 1" @click.native="deleteUserFaceFromDevice(scope.row)" icon="el-icon-sort-up">人脸禁用
+              </el-dropdown-item>
+              <el-dropdown-item divided @click.native="setAdmin(scope.row)" icon="el-icon-setting">设为管理员
               </el-dropdown-item>
               <el-dropdown-item divided icon="el-icon-s-order" @click.native="reviewHandler(scope.row)" :class=" [scope.row.auditStatus === 0 ? '' : 'recheck']">{{scope.row.auditStatus===0?'审核':'重审'}}</el-dropdown-item>
             </el-dropdown-menu>
@@ -65,7 +67,7 @@
     </avue-crud>
 
     <el-dialog :modal-append-to-body="false" title = "员工信息审核" :visible.sync = "reviewVisible" width="60%"
-               :close-on-click-modal="false" >
+               :close-on-click-modal="false" top="1%">
       <review-staff :reviewDetail="reviewDetail" @visibleemit="visibleUpdate"></review-staff>
     </el-dialog>
 
@@ -90,7 +92,7 @@
 </template>
 
 <script>
-  import {getList, getDetail, add, update, remove, pushUserFace, pushUserFaceBatch} from "@/api/enterprise/staff";
+  import {getList, getDetail, add, update, remove, pushUserFace, pushUserFaceBatch, deleteUserFace} from "@/api/enterprise/staff";
   import {mapGetters} from "vuex";
   import {validatedEmail, validatePhone} from "../../util/validator";
   import StaffDetail from "../../components/staff/staffDetail";
@@ -564,6 +566,23 @@
         this.setAdminForm = row;
         this.setAdminVisible = true;
       },
+      deleteUserFaceFromDevice(row){
+        this.$confirm("确定禁用人脸吗?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return deleteUserFace(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
       handleBatchPushUserFace() {
         if (this.selectionList.length === 0) {
           this.$message.warning("请选择至少一条数据");
@@ -597,7 +616,6 @@
             message: "操作成功!"
           });
         })
-
       },
       reviewHandler(row) {
         this.reviewDetail = row;

+ 0 - 0
src/views/estate/article.vue → src/views/estate/dailymng/article.vue


+ 0 - 0
src/views/estate/notice.vue → src/views/estate/dailymng/notice.vue


+ 2 - 2
src/views/estate/repair.vue → src/views/estate/dailymng/repair.vue

@@ -43,8 +43,8 @@
 <script>
   import {getList, getDetail, add, update, remove} from "@/api/estate/repair";
   import {mapGetters} from "vuex";
-  import {validatePhone} from "../../util/validator";
-  import SelectDialogResidential from "../../components/select-dialog/select-dialog-residential";
+  import {validatePhone} from "../../../util/validator";
+  import SelectDialogResidential from "../../../components/select-dialog/select-dialog-residential";
 
   export default {
     components: {SelectDialogResidential},

+ 0 - 617
src/views/estate/guest.vue

@@ -1,617 +0,0 @@
-<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.guest_delete"-->
-<!--                   @click="handleDelete">删 除-->
-<!--        </el-button>-->
-<!--      </template>-->
-      <template slot="checkState" slot-scope="scope">
-        <el-tag v-if="scope.row.checkState===0" type="info">待审核</el-tag>
-        <el-tag v-if="scope.row.checkState===1" type="success">审核通过</el-tag>
-        <el-tag v-if="scope.row.checkState===2" type="danger">审核不通过</el-tag>
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-  import {getList, getDetail, add, update, remove} from "@/api/estate/guest";
-  import {mapGetters} from "vuex";
-
-  export default {
-    data() {
-      return {
-        form: {},
-        query: {},
-        loading: true,
-        page: {
-          pageSize: 10,
-          currentPage: 1,
-          total: 0
-        },
-        selectionList: [],
-        option: {
-          height:'auto',
-          calcHeight: 30,
-          tip: false,
-          searchShow: true,
-          searchMenuSpan: 6,
-          border: true,
-          index: true,
-          addBtn:false,
-          delBtn:false,
-          viewBtn: true,
-          selection: true,
-          dialogClickModal: false,
-          column: [
-            {
-              label: "访客名称",
-              prop: "guestName",
-              disabled: true,
-              search: true,
-              rules: [{
-                required: true,
-                message: "请输入访客名称",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "手机号",
-              prop: "guestTel",
-              disabled: true,
-              rules: [{
-                required: false,
-                message: "请输入手机号",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "性别",
-              prop: "guestSex",
-              type: 'select',
-              dataType:"number",
-              disabled: true,
-              dicData:[
-                {
-                  label:"男",
-                  value:1
-                },{
-                  label:'女',
-                  value:2
-                },{
-                  label: "未定义",
-                  value: 0
-                }
-              ],
-              // dicUrl: "/api/blade-system/dict-biz/dictionary?code=sex",
-              // props: {
-              //   label: "dictValue",
-              //   value: "dictKey"
-              // },
-              rules: [{
-                required: false,
-                message: "请输入性别",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "访问缘由",
-              prop: "guestReason",
-              type: 'textarea',
-              rules: [{
-                required: false,
-                message: "请输入访问缘由",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "社区",
-              prop: "agencyName",
-              editDisplay: false,
-              addDisplay: false,
-              disabled: true,
-            },
-            // {
-            //   label: "所属社区",
-            //   prop: "agencyId",
-            //   search: true,
-            //   searchFilterable: true,
-            //   filterable: true,
-            //   cascaderItem: ['residentialId'],
-            //   type: "select",
-            //   // remote: true,
-            //   dicUrl: "/api/cyzh-community/agency/list?size=100&name={{key}}",
-            //   dicFormatter:(res)=>{
-            //     return res.data.records;//返回字典的层级结构
-            //   },
-            //   props: {
-            //     label: "name",
-            //     value: "id"
-            //   },
-            //   rules: [{
-            //     required: true,
-            //     message: "请输入所属社区id",
-            //     trigger: "blur"
-            //   }],
-            //   viewDisplay: false,
-            //   hide: true
-            // },
-            // {
-            //   label: "所属小区",
-            //   prop: "residentialId",
-            //   type: "select",
-            //   cascaderItem: ['buildingId'],
-            //   dicUrl: "/api/cyzh-community/residential/list?agencyId={{key}}",
-            //   dicFormatter:(res)=>{
-            //     return res.data.records;//返回字典的层级结构
-            //   },
-            //   // dicFlag: false,
-            //   filterable: true,
-            //   props: {
-            //     label: "name",
-            //     value: "id"
-            //   },
-            //   rules: [{
-            //     required: false,
-            //     message: "请输入所属小区id",
-            //     trigger: "blur"
-            //   }],
-            //   hide: true,
-            //   viewDisplay: false
-            // },
-            {
-              label: "小区",
-              prop: "residentialName",
-              editDisplay: false,
-              addDisplay: false,
-              disabled: true,
-              rules: [{
-                required: true,
-                message: "请输入小区名称",
-                trigger: "blur"
-              }]
-            },
-            // {
-            //   label: "所属楼栋",
-            //   prop: "buildingId",
-            //   hide: true,
-            //   viewDisplay: false,
-            //   type: "select",
-            //   cascaderItem: ['unitId'],
-            //   dicUrl: `/api/cyzh-community/building/list?residentialId={{key}}`,
-            //   dicFormatter:(res)=>{
-            //     return res.data.records;//返回字典的层级结构
-            //   },
-            //   // dicFlag: false,
-            //   filterable: true,
-            //   props: {
-            //     label: "name",
-            //     value: "id"
-            //   },
-            //   rules: [{
-            //     required: false,
-            //     message: "请输入楼栋id",
-            //     trigger: "blur"
-            //   }]
-            // },
-            {
-              label: "楼栋",
-              prop: "buildingName",
-              editDisplay: false,
-              addDisplay: false,
-              disabled: true,
-              rules: [{
-                required: true,
-                message: "请输入楼栋名称",
-                trigger: "blur"
-              }]
-            },
-            // {
-            //   label: "所属单元",
-            //   prop: "unitId",
-            //   hide: true,
-            //   viewDisplay: false,
-            //   type: "select",
-            //   cascaderItem: ['floorId'],
-            //   dicUrl: "/api/cyzh-community/unit/list?buildingId={{key}}",
-            //   dicFormatter:(res)=>{
-            //     return res.data.records;//返回字典的层级结构
-            //   },
-            //   // dicFlag: false,
-            //   filterable: true,
-            //   props: {
-            //     label: "name",
-            //     value: "id"
-            //   },
-            //   rules: [{
-            //     required: false,
-            //     message: "请输入所属单元id",
-            //     trigger: "blur"
-            //   }]
-            // },
-            {
-              label: "单元",
-              prop: "unitName",
-              editDisplay: false,
-              addDisplay: false,
-              disabled: true,
-              rules: [{
-                required: true,
-                message: "请输入单元名称",
-                trigger: "blur"
-              }]
-            },
-            // {
-            //   label: "所属楼层",
-            //   prop: "floorId",
-            //   type: "select",
-            //   hide: true,
-            //   viewDisplay: false,
-            //   cascaderItem: ['roomId'],
-            //   dicUrl: "/api/cyzh-community/floor/list?unitId={{key}}",
-            //   dicFormatter:(res)=>{
-            //     return res.data.records;//返回字典的层级结构
-            //   },
-            //   // dicFlag: false,
-            //   filterable: true,
-            //   props: {
-            //     label: "name",
-            //     value: "id"
-            //   },
-            //   rules: [{
-            //     required: false,
-            //     message: "请输入楼层id",
-            //     trigger: "blur"
-            //   }]
-            // },
-            {
-              label: "楼层",
-              prop: "floorName",
-              editDisplay: false,
-              addDisplay: false,
-              disabled: true,
-              rules: [{
-                required: true,
-                message: "请输入楼层名称",
-                trigger: "blur"
-              }]
-            },
-            // {
-            //   label: "所属房间",
-            //   prop: "roomId",
-            //   type: "select",
-            //   hide: true,
-            //   viewDisplay: false,
-            //   dicUrl: "/api/cyzh-community/room/list?floorId={{key}}",
-            //   dicFormatter:(res)=>{
-            //     return res.data.records;//返回字典的层级结构
-            //   },
-            //   // dicFlag: false,
-            //   filterable: true,
-            //   props: {
-            //     label: "name",
-            //     value: "id"
-            //   },
-            //   rules: [{
-            //     required: false,
-            //     message: "请输入所属房间id",
-            //     trigger: "blur"
-            //   }]
-            // },
-            {
-              label: "房间",
-              prop: "roomName",
-              editDisplay: false,
-              addDisplay: false,
-              disabled: true,
-              rules: [{
-                required: true,
-                message: "请输入所属房间名称",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "拜访企业",
-              prop: "enterpriseName",
-              editDisplay: false,
-              addDisplay: false,
-              disabled: true,
-              rules: [{
-                required: true,
-                message: "请输入所属房间名称",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "被访者姓名",
-              prop: "userName",
-              disabled: true,
-              rules: [{
-                required: false,
-                message: "请输入要访问的住户姓名",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "访问的住户的id",
-              prop: "userId",
-              disabled: true,
-              hide: true,
-              display: false,
-              rules: [{
-                required: false,
-                message: "请输入访问的住户的id",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "审核状态",
-              prop: "checkState",
-              slot: true,
-              type:'select',
-              dicData:[
-                {
-                  label:'待审核',
-                  value:0,
-                  color:'red'
-                },{
-                  label:'审核通过',
-                  value:1
-                },{
-                  label:'审核不通过',
-                  value:2
-                }
-              ],
-              rules: [{
-                required: false,
-                message: "请输入审核状态",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "脸部照片",
-              prop: "imageUri",
-              type: "upload",
-              width: 150,
-              disabled: true,
-              listType: 'picture-img',
-              propsHttp: {
-                res: "data",
-                url: "link"
-              },
-              action: "/api/blade-resource/oss/endpoint/put-file",
-              rules: [{
-                required: false,
-                message: "请输入脸部照片",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "访问时间",
-              prop: "interviewTime",
-              type: 'datetime',
-              disabled: true,
-              valueFormat: 'yyyy-MM-dd HH:mm:ss',
-              hide: true,
-              rules: [{
-                required: false,
-                message: "请输入访问时间",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "身份证",
-              prop: "guestIdcard",
-              disabled: true,
-              hide: true,
-              rules: [{
-                required: false,
-                message: "请输入身份证",
-                trigger: "blur"
-              }]
-            },
-            {
-              label: "审核意见",
-              prop: "opinion",
-              hide: true,
-              rules: [{
-                required: false,
-                message: "请输入审核意见",
-                trigger: "blur"
-              }]
-            },
-          ]
-        },
-        data: []
-      };
-    },
-    computed: {
-      ...mapGetters(["permission"]),
-      permissionList() {
-        return {
-          addBtn: this.vaildData(this.permission.guest_add, false),
-          viewBtn: this.vaildData(this.permission.guest_view, false),
-          delBtn: this.vaildData(this.permission.guest_delete, false),
-          editBtn: this.vaildData(this.permission.guest_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){
-        let findObject1 = this.findObject(this.option.column, "agencyName");
-        let findObject2 = this.findObject(this.option.column, "residentialName");
-        let findObject3 = this.findObject(this.option.column, "buildingName");
-        let findObject4 = this.findObject(this.option.column, "unitName");
-        let findObject5 = this.findObject(this.option.column, "floorName");
-        let findObject6 = this.findObject(this.option.column, "roomName");
-        let findObject7 = this.findObject(this.option.column, "enterpriseName");
-        findObject1.label = "拜访社区";
-        findObject2.label = "拜访小区";
-        findObject3.hide = false;findObject3.viewDisplay = true;
-        findObject4.hide = false;findObject4.viewDisplay = true;
-        findObject5.hide = false;findObject5.viewDisplay = true;
-        findObject6.hide = false;findObject6.viewDisplay = true;
-        findObject7.hide = true;
-      }else if (tenantType == 1){
-        let findObject1 = this.findObject(this.option.column, "agencyName");
-        let findObject2 = this.findObject(this.option.column, "residentialName");
-        let findObject3 = this.findObject(this.option.column, "enterpriseName");
-        let findObject4 = this.findObject(this.option.column, "buildingName");
-        let findObject5 = this.findObject(this.option.column, "unitName");
-        let findObject6 = this.findObject(this.option.column, "floorName");
-        let findObject7 = this.findObject(this.option.column, "roomName");
-        findObject1.label = "拜访园区";
-        findObject2.label = "拜访区域";
-        findObject3.hide = false;
-        findObject4.hide = true;findObject4.viewDisplay = false;
-        findObject5.hide = true;findObject5.viewDisplay = false;
-        findObject6.hide = true;findObject6.viewDisplay = false;
-        findObject7.hide = true;findObject7.viewDisplay = false;
-      }
-    },
-    methods: {
-      rowSave(row, done, loading) {
-        add(row).then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: "success",
-            message: "操作成功!"
-          });
-          done();
-        }, error => {
-          loading();
-          window.console.log(error);
-        });
-      },
-      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) {
-        if (["edit", "view"].includes(type)) {
-          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>

+ 459 - 0
src/views/estate/guestmng/guestrecord.vue

@@ -0,0 +1,459 @@
+<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.guestrecord_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+      <template slot="checkState" slot-scope="scope">
+        <el-tag v-if="scope.row.checkState===0" type="info">待审核</el-tag>
+        <el-tag v-if="scope.row.checkState===1" type="success">审核通过</el-tag>
+        <el-tag v-if="scope.row.checkState===2" type="danger">审核不通过</el-tag>
+      </template>
+      <template slot="registerSource" slot-scope="{row}">
+        <el-tag v-if="row.registerSource===1">小程序</el-tag>
+        <el-tag v-if="row.registerSource===2">管理后台</el-tag>
+        <el-tag v-if="row.registerSource===3">访客机</el-tag>
+      </template>
+      <template slot="menu" slot-scope="{row}">
+        <el-button size="mini" type="text" icon="el-icon-setting">
+          <el-dropdown>
+            <span class="el-dropdown-link">
+              更多<i class="el-icon-arrow-down el-icon--right"></i>
+            </span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item style="color: limegreen" type="text" @click.native="pushFace(row)" icon="el-icon-sort-down">人脸下发</el-dropdown-item>
+              <el-dropdown-item style="color: red" type="text" @click.native="deleteFace(row)" icon="el-icon-sort-up">人脸禁用</el-dropdown-item>
+            </el-dropdown-menu>
+
+          </el-dropdown>
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove, pushGuestFace, deleteGuestFace} from "@/api/estate/guestrecord";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          menuWidth: 300,
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          addBtn:true,
+          delBtn:true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "预约开始时间",
+              prop: "beginTime",
+              type: "datetime",
+              width: 130,
+              format: "yyyy-MM-dd HH:mm:ss",
+              valueFormat: "yyyy-MM-dd HH:mm:ss"
+            },
+            {
+              label: "预约结束时间",
+              prop: "endTime",
+              type: "datetime",
+              width: 130,
+              format: "yyyy-MM-dd HH:mm:ss",
+              valueFormat: "yyyy-MM-dd HH:mm:ss"
+            },
+            {
+              label: "登记来源",
+              prop: "registerSource",
+              slot: true,
+              editDisplay: false,
+              addDisplay:false,
+            },
+            {
+              label: "访客姓名",
+              prop: "guestName",
+              search: true,
+              rules: [{
+                required: true,
+                message: "请输入访客名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "访客手机号",
+              prop: "guestTel",
+              labelWidth: 100,
+              rules: [{
+                required: true,
+                message: "请输入访客手机号",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "证件号码",
+              prop: "guestIdcard",
+              hide: true,
+              rules: [{
+                required: false,
+                message: "请输入证件号码",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "拜访园区",
+              prop: "agencyId",
+              cascaderItem: ['enterpriseId'],
+              type: "select",
+              remote: true,
+              hide: true,
+              search: true,
+              viewDisplay: false,
+              dicUrl: "/api/cyzh-community/agency/list",
+              dicFormatter:(res)=>{
+                return res.data.records;//返回字典的层级结构
+              },
+              props: {
+                label: "name",
+                value: "id"
+              },
+              rules: [{
+                required: true,
+                message: "请选择拜访园区",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "拜访企业",
+              prop: "enterpriseId",
+              type: "select",
+              search: true,
+              hide: true,
+              viewDisplay: false,
+              dicUrl: "/api/cyzh-enterprise/enterprise/list?agencyId={{key}}",
+              dicFormatter:(res)=>{
+                return res.data.records;//返回字典的层级结构
+              },
+              // dicFlag: false,
+              filterable: true,
+              props: {
+                label: "enterpriseName",
+                value: "id"
+              },
+              rules: [{
+                required: true,
+                message: "请选择拜访企业",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "拜访园区",
+              prop: "agencyName",
+              editDisplay: false,
+              addDisplay: false,
+            },
+            {
+              label: "拜访企业",
+              prop: "enterpriseName",
+              editDisplay: false,
+              addDisplay: false,
+            },
+            {
+              label: "审核状态",
+              prop: "checkState",
+              slot: true,
+              type:'select',
+              addDisplay: false,
+              dicData:[
+                {
+                  label:'待审核',
+                  value:0,
+                  color:'red'
+                },{
+                  label:'审核通过',
+                  value:1
+                },{
+                  label:'审核不通过',
+                  value:2
+                }
+              ]
+            },
+            {
+              label: "审核意见",
+              prop: "opinion",
+              hide: true,
+              editDisplay: false,
+              addDisplay: false
+            },
+            {
+              label: "访客事由",
+              prop: "guestReason",
+              type: 'textarea',
+              rules: [{
+                required: false,
+                message: "请输入访问缘由",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "访客人脸",
+              prop: "imageUri",
+              type: "upload",
+              width: 150,
+              listType: 'picture-img',
+              propsHttp: {
+                res: "data",
+                url: "link"
+              },
+              action: "/api/blade-resource/oss/endpoint/put-file",
+              rules: [{
+                required: false,
+                message: "请上传访客人脸",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.guestrecord_add, false),
+          viewBtn: this.vaildData(this.permission.guestrecord_view, false),
+          delBtn: this.vaildData(this.permission.guestrecord_delete, false),
+          editBtn: this.vaildData(this.permission.guestrecord_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){
+        let findObject1 = this.findObject(this.option.column, "agencyName");
+        let findObject2 = this.findObject(this.option.column, "residentialName");
+        let findObject3 = this.findObject(this.option.column, "buildingName");
+        let findObject4 = this.findObject(this.option.column, "unitName");
+        let findObject5 = this.findObject(this.option.column, "floorName");
+        let findObject6 = this.findObject(this.option.column, "roomName");
+        let findObject7 = this.findObject(this.option.column, "enterpriseName");
+        findObject1.label = "拜访社区";
+        findObject2.label = "拜访小区";
+        findObject3.hide = false;findObject3.viewDisplay = true;
+        findObject4.hide = false;findObject4.viewDisplay = true;
+        findObject5.hide = false;findObject5.viewDisplay = true;
+        findObject6.hide = false;findObject6.viewDisplay = true;
+        findObject7.hide = true;
+      }else if (tenantType == 1){
+        let findObject1 = this.findObject(this.option.column, "agencyName");
+        let findObject2 = this.findObject(this.option.column, "residentialName");
+        let findObject3 = this.findObject(this.option.column, "enterpriseName");
+        let findObject4 = this.findObject(this.option.column, "buildingName");
+        let findObject5 = this.findObject(this.option.column, "unitName");
+        let findObject6 = this.findObject(this.option.column, "floorName");
+        let findObject7 = this.findObject(this.option.column, "roomName");
+        findObject1.label = "拜访园区";
+        findObject2.label = "拜访区域";
+        findObject3.hide = false;
+        findObject4.hide = true;findObject4.viewDisplay = false;
+        findObject5.hide = true;findObject5.viewDisplay = false;
+        findObject6.hide = true;findObject6.viewDisplay = false;
+        findObject7.hide = true;findObject7.viewDisplay = false;
+      }
+    },
+    methods: {
+      pushFace(row){
+        //下发人脸到测温系统和设备
+        pushGuestFace(row).then(res => {
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+        })
+      },
+      deleteFace(row){
+        this.$confirm("确定禁用人脸吗?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return deleteGuestFace(row);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      rowSave(row, done, loading) {
+        row.agencyName = row.$agencyId;
+        row.enterpriseName = row.$enterpriseId;
+        row.checkState = 1;
+        row.registerSource = 2;
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        row.agencyName = row.$agencyId;
+        row.enterpriseName = row.$enterpriseId;
+        row.registerSource = 2;
+        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) {
+        if (["edit", "view"].includes(type)) {
+          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>

+ 1 - 1
src/views/estate/car.vue → src/views/estate/parkinglotmng/car.vue

@@ -54,7 +54,7 @@
   import {getList, getDetail, add, update, remove} from "@/api/estate/car";
   // import CyPersonFile from "../../components/file/cy-person-file";
   import {mapGetters} from "vuex";
-  import {validateLicense, validatePhone} from "../../util/validator";
+  import {validateLicense, validatePhone} from "../../../util/validator";
   import {getList as getAgencyList} from "@/api/community/agency";
   import {getList as getResidentialList} from "@/api/community/residential";
   // import CyExcelImport from "../../components/excel/cy-excel-import";

+ 1 - 1
src/views/estate/parkinglot.vue → src/views/estate/parkinglotmng/parkinglot.vue

@@ -45,7 +45,7 @@
   import {getList, getDetail, add, update, remove} from "@/api/estate/parkinglot";
   import {mapGetters} from "vuex";
   import editPolygonMap from "@/components/residential/editPolygonMap";
-  import {validatePhone} from "../../util/validator";
+  import {validatePhone} from "../../../util/validator";
   import {getList as getAgencyList} from "@/api/community/agency";
   import {getList as getResidentialList} from "@/api/community/residential";
 

+ 1 - 1
src/views/estate/parkingspace.vue → src/views/estate/parkinglotmng/parkingspace.vue

@@ -38,7 +38,7 @@
 <script>
   import {getList, getDetail, add, update, remove} from "@/api/estate/parkingspace";
   import {mapGetters} from "vuex";
-  import SelectDialogResidential from "../../components/select-dialog/select-dialog-residential";
+  import SelectDialogResidential from "../../../components/select-dialog/select-dialog-residential";
 
   export default {
     components: {SelectDialogResidential},

+ 24 - 32
src/views/estate/accessrecord.vue → src/views/estate/passmng/accessrecord.vue

@@ -32,15 +32,6 @@
                @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.accessrecord_delete"-->
-<!--                   @click="handleDelete">删 除-->
-<!--        </el-button>-->
-<!--      </template>-->
     </avue-crud>
   </basic-container>
 </template>
@@ -82,29 +73,6 @@
             },
           ]
         },
-
-        // residentialColumn: {
-        //   label: "所属小区",
-        //   prop: "residentialId",
-        //   // slot: true,
-        //   type: "select",
-        //   search: true,
-        //   width:150,
-        //   cascaderItem: ["buildingId"],
-        //   // dicUrl: "/grid/estate/getResidentialList",
-        //   // remote: true,
-        //   //回显的时候有问题,如果所选不在前十条内,下拉框只会显示id
-        //   dicUrl: "/api/cyzh-community/residential/list?agencyId={{key}}",
-        //   dicFormatter: (res)=>{
-        //     return res.data.records;
-        //   },
-        //   searchFilterable: true,
-        //   // dicFlag: false,
-        //   props: {
-        //     label: "name",
-        //     value: "id"
-        //   }
-        // },
         enterpriseColumn: {
           label: "所属企业",
           prop: "enterpriseId",
@@ -198,6 +166,30 @@
                 trigger: "blur"
               }]
             },
+            {
+              label: "用户类型",
+              prop: "userType",
+              type: "select",
+              editDisplay: false,
+              addDisplay: false,
+              dicData:[
+                {
+                  label: "企业员工",
+                  value: 2
+                },
+                {
+                  label: "服务人员",
+                  value: 3
+                },
+                {
+                  label: "访客",
+                  value: 4
+                },
+                {
+                  label: "管理员",
+                  value: 5
+                }]
+            },
             {
               label: "所属园区",
               prop: "agencyName",

+ 0 - 0
src/views/estate/carenterrecord.vue → src/views/estate/passmng/carenterrecord.vue


+ 0 - 0
src/views/estate/caroutrecord.vue → src/views/estate/passmng/caroutrecord.vue