瀏覽代碼

行为感知及其他优化

tianyabing 2 年之前
父節點
當前提交
b83a495f8e
共有 29 個文件被更改,包括 1289 次插入198 次删除
  1. 30 0
      src/api/scene/meeting/apiSceneMeeting.js
  2. 3 0
      src/components/dashboard/more/space/DataSituation.vue
  3. 1 1
      src/components/life/healthyHome/components/lifeHealthyHomeChart.vue
  4. 14 7
      src/components/life/parking/components/lifeParkDetailTable.vue
  5. 9 9
      src/components/life/parking/components/lifeParkTopTable.vue
  6. 2 1
      src/components/life/parking/lifeParking.vue
  7. 1 0
      src/components/life/restaurant/lifeRestaurant.vue
  8. 5 1
      src/components/report/data/reportDataRestaurant.vue
  9. 164 0
      src/components/report/data/tables/reportDataTable.vue
  10. 152 5
      src/components/report/table/reportTableCustom.vue
  11. 476 0
      src/components/scene/access/sceneAccessAction.vue
  12. 1 1
      src/components/scene/access/sceneAccessBehaviour.vue
  13. 8 10
      src/components/scene/access/sceneAccessGuestManage.vue
  14. 141 0
      src/components/scene/access/xingweiganzhi/SceneSecurityPersonSelect.vue
  15. 3 3
      src/components/scene/energy/common/deviceCardAir.vue
  16. 22 12
      src/components/scene/energy/sceneEnergyAircondition/airconditioningCard.vue
  17. 21 11
      src/components/scene/energy/sceneEnergyAircondition/sceneWaterCard.vue
  18. 21 11
      src/components/scene/energy/sceneEnergyAircondition/scenelightCard.vue
  19. 33 17
      src/components/scene/meeting/chart/meetingNumCharts.vue
  20. 30 15
      src/components/scene/meeting/chart/meetingPersonCharts.vue
  21. 30 16
      src/components/scene/meeting/chart/meetingPersonDistributeChart.vue
  22. 30 15
      src/components/scene/meeting/chart/meetingTimeCharts.vue
  23. 30 16
      src/components/scene/meeting/chart/meetingTimeDistributeChart.vue
  24. 3 3
      src/components/scene/meeting/sceneMeetingOverview.vue
  25. 20 12
      src/components/security/alarm/securityAlarmMap.vue
  26. 12 2
      src/components/security/common/securityDeviceSelect.vue
  27. 6 26
      src/data/json/menuList.json
  28. 4 4
      src/router/index.js
  29. 17 0
      src/utils/dataUtil.js

+ 30 - 0
src/api/scene/meeting/apiSceneMeeting.js

@@ -10,7 +10,37 @@ const getMeetingTotal = (params) => {
     return Request.post('/meetingroom/getMeetingTotal', params)
 }
 
+// 获取会议次数
+const getMeetingTimes = (params) => {
+    return Request.post('/meetingroom/getMeetingTimes', params)
+}
+
+// 获取会议人数
+const getMeetingPersons = (params) => {
+    return Request.post('/meetingroom/getMeetingPersons', params)
+}
+
+// 获取会议时长
+const getMeetingMinutes = (params) => {
+    return Request.post('/meetingroom/getMeetingMinutes', params)
+}
+
+// 获取会议人数分布
+const getMeetingCakePerson = (params) => {
+    return Request.post('/meetingroom/getMeetingCakePerson', params)
+}
+
+// 获取会议时长分布
+const getMeetingCakeMinutes = (params) => {
+    return Request.post('/meetingroom/getMeetingCakeMinutes', params)
+}
+
 export default {
     getMeetingRoomList,
     getMeetingTotal,
+    getMeetingTimes,
+    getMeetingPersons,
+    getMeetingMinutes,
+    getMeetingCakePerson,
+    getMeetingCakeMinutes,
 }

+ 3 - 0
src/components/dashboard/more/space/DataSituation.vue

@@ -93,6 +93,9 @@ export default {
       setTimeout(()=>{
         app.initChart(this.percent)
       },50)
+      setTimeout(()=>{
+        app.initChart(this.percent)
+      },300)
     })
 
   },

+ 1 - 1
src/components/life/healthyHome/components/lifeHealthyHomeChart.vue

@@ -76,7 +76,7 @@ export default {
             name: '体检人数',
             data: [],
             type: 'bar',
-            barWidth: '15%',
+            barWidth: this.$constant.ECHARTS_BAR_WIDTH,
             backgroundStyle: {
               color: 'rgba(180, 180, 180, 0.2)'
             },

+ 14 - 7
src/components/life/parking/components/lifeParkDetailTable.vue

@@ -11,6 +11,12 @@
     :customRow="customRow"
   >
     <a slot="name" slot-scope="text">{{ text }}</a>
+    <template #position="text, record">
+      <span v-if="text=='地下三层'">B3-</span>
+      <span v-if="text=='地下二层'">B2-</span>
+      <span v-if="text=='地下一层'">B1-</span>
+      <span>{{ record.parkingNumbers }}</span>
+    </template>
   </a-table>
 </template>
 
@@ -26,23 +32,24 @@ export default {
           title: "车位",
           dataIndex: "position",
           key: "position",
+          scopedSlots: { customRender: 'position' },
         },
         {
           title: "拥有者",
           dataIndex: "people",
           key: "people",
-          width: 80
-        },
-        {
-          title: "单位",
-          dataIndex: "company",
-          key: "company",
+          //width: 80
         },
+        //{
+        //  title: "单位",
+        //  dataIndex: "company",
+        //  key: "company",
+        //},
         {
           title: "停车时间",
           key: "prkingDurationLong",
           dataIndex: "prkingDurationLong",
-          width: 60,
+          //width: 60,
           align: 'center'
         },
       ],

+ 9 - 9
src/components/life/parking/components/lifeParkTopTable.vue

@@ -11,6 +11,12 @@
     :customRow="customRow"
   >
     <a slot="name" slot-scope="text">{{ text }}</a>
+    <template #position="text, record">
+      <span v-if="text=='地下三层'">B3-</span>
+      <span v-if="text=='地下二层'">B2-</span>
+      <span v-if="text=='地下一层'">B1-</span>
+      <span>{{ record.parkingNumbers }}</span>
+    </template>
   </a-table>
 </template>
 
@@ -26,6 +32,8 @@ export default {
           title: "车位",
           dataIndex: "position",
           key: "position",
+          width: 100,
+          scopedSlots: { customRender: 'position' },
         },
         {
           title: "单位",
@@ -33,17 +41,9 @@ export default {
           key: "company",
         },
         {
-          title: "占用最长时间",
+          title: "空置时间",
           key: "prkingDurationLong",
           dataIndex: "prkingDurationLong",
-          width: 80,
-          align: 'center'
-        },
-        {
-          title: "占用最短时间",
-          key: "prkingDurationBreak",
-          dataIndex: "prkingDurationBreak",
-          width: 80,
           align: 'center'
         },
       ],

+ 2 - 1
src/components/life/parking/lifeParking.vue

@@ -40,8 +40,9 @@ export default {
           historyNum: 0
         },
         {
-          title: '建议回收车位(个)',
+          title: '车位使用率',
           num: 0,
+          unit: "%",
           historyDesc: '同比',
           historyNum: 0
         },

+ 1 - 0
src/components/life/restaurant/lifeRestaurant.vue

@@ -27,6 +27,7 @@ export default {
           title: '当天就餐人数预测',
           num: 0,
           isHighLight: true,
+          historyDesc: '同比',
         },
         {
           title: '当天累计就餐人数(人)',

+ 5 - 1
src/components/report/data/reportDataRestaurant.vue

@@ -13,6 +13,7 @@
             <a-button type="link" size="small" >打印</a-button>
           </div>
         </template>
+        <reportDataTable />
       </Card>
     </div>
   </div>
@@ -21,10 +22,13 @@
 <script>
 import ReportQuery from "@/components/report/common/reportQuery.vue";
 import Card from "@/components/common/card.vue";
+import reportDataTable from "@/components/report/data/tables/reportDataTable.vue";
+
 export default {
   components: {
     Card,
-    ReportQuery
+    ReportQuery,
+    reportDataTable
   },
   data() {
     return {}

+ 164 - 0
src/components/report/data/tables/reportDataTable.vue

@@ -0,0 +1,164 @@
+<template>
+  <div class="reportDataTable">
+    <a-table
+        :rowKey=" (record, index) => index"
+        :columns="columns"
+        :data-source="data"
+        bordered
+        :pagination="false"
+    >
+
+    </a-table>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    data: Array,
+    timeRange: String
+  },
+  watch: {
+    timeRange: function (val) {
+      this.columns[0].children[3].title = val;
+    }
+  },
+  data() {
+    return {
+      columns: [
+        {
+          title: '告警时段统计单表(单位:次)',
+          dataIndex: 'building',
+          key: 'building',
+          children: [
+            {
+              title: '建筑',
+              dataIndex: 'building',
+              key: 'building',
+              customRender: (value, row, index) => {
+                let obj = {
+                  children: value,
+                  attrs: {
+                  }
+                }
+                if (index===0) {
+                  obj.attrs.rowSpan = 8
+                } else {
+                  obj.attrs.rowSpan = 0
+                }
+                return obj;
+              },
+            },{
+              title: '统计维度',
+              dataIndex: 'tjwd',
+              key: 'tjwd',
+              customRender: (value, row, index) => {
+                let obj = {
+                  children: value,
+                  attrs: {
+                  }
+                }
+                if (index<2) {
+                  obj.attrs.colSpan = 1
+                } else if (index===3) {
+                  obj.attrs.rowSpan = 5
+                } else if (index>3){
+                  obj.attrs.colSpan = 0
+                }
+                return obj;
+              },
+            },{
+              title: '事件对象',
+              dataIndex: 'eventObj',
+              key: 'eventObj',
+            },{
+              title: '2023/3/19-2023/4/19',
+              dataIndex: 'dateRange',
+              key: 'dateRange',
+              children: [
+                {
+                  title: '欠压',
+                  dataIndex: 'undervoltage',
+                  key: 'undervoltage',
+                  //align: 'center',
+                  //customRender: (value, row, index) => {
+                  //  let obj = {
+                  //    children: value,
+                  //    attrs: {
+                  //    }
+                  //  }
+                  //  if (index===0) {
+                  //    obj.attrs.colSpan = 9
+                  //  } else {
+                  //    obj.attrs.colSpan = 0
+                  //  }
+                  //  return obj;
+                  //},
+                },{
+                  title: '过压',
+                  dataIndex: 'overvoltage',
+                  key: 'overvoltage',
+                },{
+                  title: '过流',
+                  dataIndex: 'overcurrent',
+                  key: 'overcurrent',
+                },{
+                  title: '过载',
+                  dataIndex: 'overload',
+                  key: 'overload',
+                },{
+                  title: '过温',
+                  dataIndex: 'overtm',
+                  key: 'overtm',
+                },{
+                  title: '低温',
+                  dataIndex: 'undertm',
+                  key: 'undertm',
+                },{
+                  title: '短路',
+                  dataIndex: 'shortcircuit',
+                  key: 'shortcircuit',
+                },{
+                  title: '断电',
+                  dataIndex: 'breakele',
+                  key: 'breakele',
+                },{
+                  title: '离线',
+                  dataIndex: 'underline',
+                  key: 'underline',
+                },
+              ]
+            },
+            {
+              title: '处理情况',
+              dataIndex: 'situation',
+              key: 'situation',
+              children: [
+                {
+                  title: '已处理',
+                  dataIndex: 'processed',
+                  key: 'processed',
+                },{
+                  title: '未处理',
+                  dataIndex: 'unprocessed',
+                  key: 'unprocessed',
+                },
+              ]
+            },
+          ]
+        },
+      ],
+    }
+  },
+  mounted() {
+    this.columns[0].children[3].title = this.timeRange;
+  },
+  methods: {
+
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 152 - 5
src/components/report/table/reportTableCustom.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="reportTable-custom">
     <div class="report-query">
-      <ReportQuery />
+      <Query :show="['time']" :query-data.sync="queryData" :search="search" />
     </div>
 
     <div class="report-table-view">
@@ -13,26 +13,173 @@
             <a-button type="link" size="small" >打印</a-button>
           </div>
         </template>
+        <reportDataTable :data="tableData" :time-range="timeRange" />
       </Card>
     </div>
   </div>
 </template>
 
 <script>
-import ReportQuery from "@/components/report/common/reportQuery.vue";
+import Query from "@/components/common/query.vue";
 import Card from "@/components/common/card.vue";
+import reportDataTable from "@/components/report/data/tables/reportDataTable.vue";
+
 export default {
   components: {
     Card,
-    ReportQuery
+    Query,
+    reportDataTable,
   },
   data() {
-    return {}
+    let timeRange = this.$util.dateUtil.getNearlyMonthRange();
+    return {
+      timeRange: '',
+      queryData: {
+        timeRange: timeRange
+      },
+      oriTableData: [],
+      tableData: [
+        {
+          building: '主语国际',
+          tjwd: '事项总计',
+          undervoltage: 0,
+        },{
+          tjwd: '分项总计',
+          undervoltage: 0,
+          overvoltage: 0,
+          overcurrent: 0,
+          overload: 0,
+          overtm: 0,
+          undertm: 0,
+          shortcircuit: 0,
+          breakele: 0,
+          underline: 0,
+        },{
+          tjwd: '1层',
+          eventObj: '1F 插座动力',
+          undervoltage: 0,
+          overvoltage: 0,
+          overcurrent: 0,
+          overload: 0,
+          overtm: 0,
+          undertm: 0,
+          shortcircuit: 0,
+          breakele: 0,
+          underline: 0,
+        },{
+          tjwd: '规划院',
+          eventObj: '7F 一般照明',
+          undervoltage: 0,
+          overvoltage: 0,
+          overcurrent: 0,
+          overload: 0,
+          overtm: 0,
+          undertm: 0,
+          shortcircuit: 0,
+          breakele: 0,
+          underline: 0,
+        },{
+          eventObj: '8F 插座动力',
+          undervoltage: 0,
+          overvoltage: 0,
+          overcurrent: 0,
+          overload: 0,
+          overtm: 0,
+          undertm: 0,
+          shortcircuit: 0,
+          breakele: 0,
+          underline: 0,
+        },{
+          eventObj: '8F 应急照明',
+          undervoltage: 0,
+          overvoltage: 0,
+          overcurrent: 0,
+          overload: 0,
+          overtm: 0,
+          undertm: 0,
+          shortcircuit: 0,
+          breakele: 0,
+          underline: 0,
+        },{
+          eventObj: '8F 一般照明',
+          undervoltage: 0,
+          overvoltage: 0,
+          overcurrent: 0,
+          overload: 0,
+          overtm: 0,
+          undertm: 0,
+          shortcircuit: 0,
+          breakele: 0,
+          underline: 0,
+        },{
+          eventObj: '9F 一般照明',
+          undervoltage: 0,
+          overvoltage: 0,
+          overcurrent: 0,
+          overload: 0,
+          overtm: 0,
+          undertm: 0,
+          shortcircuit: 0,
+          breakele: 0,
+          underline: 0,
+        },
+      ],
+    }
   },
   mounted() {
+    this.oriTableData = JSON.parse(JSON.stringify(this.tableData));
+    this.search();
   },
   methods: {
-
+    getRandom(m,n) {
+      let val = Math.random()*(m-n)+n
+      return Math.ceil(val);
+    },
+    search() {
+      let value = this.queryData.timeRange.startDate+' ~ '+this.queryData.timeRange.endDate
+      this.timeRange = value;
+      this.tableData = JSON.parse(JSON.stringify(this.oriTableData))
+      for (let i = 0; i < 4; i++) {
+        let index = this.getRandom(2,7);
+        let obj = this.tableData[index];
+        let i = 0;
+        let keyIndex = this.getRandom(0,9);
+        for (const key in obj) {
+          let num = this.getRandom(0,5);
+          if (key == 'eventObj') {
+            continue;
+          } else if (keyIndex == i) {
+            obj[key] = num;
+          }
+          i++;
+        }
+      }
+      // 计算总数
+      let obj = {
+        tjwd: '分项总计',
+        undervoltage: 0,
+        overvoltage: 0,
+        overcurrent: 0,
+        overload: 0,
+        overtm: 0,
+        undertm: 0,
+        shortcircuit: 0,
+        breakele: 0,
+        underline: 0,
+      }
+      for (let i = 2; i < 8; i++) {
+        obj.undervoltage += this.tableData[i].undervoltage;
+        obj.overvoltage += this.tableData[i].overvoltage;
+        obj.overcurrent += this.tableData[i].overcurrent;
+        obj.overload += this.tableData[i].overload;
+        obj.overtm += this.tableData[i].overtm;
+        obj.undertm += this.tableData[i].undertm;
+        obj.shortcircuit += this.tableData[i].shortcircuit;
+        obj.breakele += this.tableData[i].breakele;
+        obj.underline += this.tableData[i].underline;
+      }
+      this.tableData[1] = obj;
+    }
   }
 }
 </script>

+ 476 - 0
src/components/scene/access/sceneAccessAction.vue

@@ -0,0 +1,476 @@
+<template>
+  <div class="accessManage ">
+    <div class="page-query-core" style="padding: 30px 15px">
+      <Query :show="[]" :query-data.sync="queryData" :search="search">
+        <template #extraItem>
+          <a-form-model-item label="人员姓名" style="margin-left: 45px">
+            <a-input style="width: 250px" v-model="queryData.name" placeholder="请输入姓名"/>
+          </a-form-model-item>
+          <a-form-model-item label="手机号" style="margin-left: 45px">
+            <a-input style="width: 250px" v-model="queryData.phone" placeholder="请输入手机号"/>
+          </a-form-model-item>
+          <a-form-model-item label="所属公司" style="">
+            <a-select v-model="queryData.company" style="width: 250px">
+              <a-select-option v-for="(item,index) in companyOptions" :key="index" :value="item.value">
+                {{ item.label }}
+              </a-select-option>
+            </a-select>
+          </a-form-model-item>
+        </template>
+      </Query>
+    </div>
+
+    <div class="accessManage-body">
+      <a-row style="height: 100%">
+        <a-col :span="4" style="height: 100%">
+          <SceneSecurityPersonSelect :left-title="'名单'" :tree-data="treeData" :new-person-list="newPersonList"></SceneSecurityPersonSelect>
+        </a-col>
+        <a-col :span="20">
+          <a-table :columns="tableColumns" :data-source="tableData" :pagination="true"
+                   :scroll="{ y: tableContainerHeight }" bordered>
+            <template #action="text, record">
+              <a-button type="link" @click="showPeopleBehaviour"> 行为感知 </a-button>
+              <a-button type="link" @click="view(record)"> 查看 </a-button>
+              <a-button type="link" @click="del(record)"> 删除 </a-button>
+            </template>
+
+          </a-table>
+        </a-col>
+      </a-row>
+
+    </div>
+
+    <a-modal
+        title="行为感知"
+        v-if="showBehaviour"
+        :visible="showBehaviour"
+        width="65%"
+        @cancel="hideBehaviour"
+        :footer="null"
+    >
+      <SceneAccessBehaviour />
+    </a-modal>
+
+    <a-modal
+        title="新建名单"
+        v-if="newPersonListVisible"
+        :visible="newPersonListVisible"
+        width="400px"
+        @cancel="hideNewPersonList"
+        @ok="addNewPersonList"
+    >
+      <a-input v-model="personListName" placeholder="请输入名单名称" />
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import Query from "@/components/common/query.vue";
+import SceneSecurityPersonSelect from "@/components/scene/access/xingweiganzhi/SceneSecurityPersonSelect.vue";
+
+export default {
+  components: {
+    Query,
+    SceneSecurityPersonSelect,
+  },
+  data() {
+    return {
+      treeData: [
+        {
+          title: '重点名单',
+          key: '重点名单'
+        }
+      ],
+      personListName: '',
+      showBehaviour: false,
+      newPersonListVisible: false,
+      currentPage: 1,
+      queryData: {
+        objective: '1',
+        company: '0'
+      },
+      objectiveMap:new Map(),
+      objectiveOptions: [
+        {
+          label: '全部',
+          value: '0'
+        },
+        {
+          label: '开会',
+          value: '1'
+        },
+        {
+          label: '交流',
+          value: '2'
+        },
+      ],
+      companyMap:new Map(),
+      companyOptions: [
+        {
+          label: '全部',
+          value: '0'
+        },{
+          label: '北京电信规划院',
+          value: '1'
+        },
+      ],
+      tableContainerHeight: 500,
+      tableColumns: [
+        {
+          title: '序号',
+          dataIndex: 'index',
+          key: 'index',
+          align: "center",
+          width: 80,
+          customRender: (text, record, index) => `${index + 1}`
+        },
+        {
+          title: '姓名',
+          dataIndex: 'visitor',
+          width: 150,
+          key: 'visitor',
+        },
+        {
+          title: '手机号',
+          dataIndex: 'visitor_phone',
+          key: 'visitor_phone',
+          width: 250,
+        },
+        {
+          title: '所属公司',
+          dataIndex: 'department',
+          key: 'department',
+        },
+        {
+          title: '人脸信息',
+          dataIndex: 'faceInfo',
+          key: 'faceInfo',
+        },
+        {
+          title: '操作',
+          key: 'operation',
+          scopedSlots: {customRender: 'action'},
+        },
+
+      ],
+      tableData:[],
+      originalData: [
+        {
+          key: '1',
+          visitor: "潘夏彤",
+          visitor_phone: "13038678756",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B3",
+          interviewee: "胡八一", interviewee_phone: "15643567892",
+          directionStatus: "进",
+        },
+        {
+          key: '2',
+          visitor: "庞慧",
+          visitor_phone: "13038678756",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入1F",
+          interviewee: "胡八一",
+          interviewee_phone: "15643567892",
+          directionStatus: "进",
+        },
+        {
+          key: '3',
+          visitor: "李天泽",
+          visitor_phone: "13038678756",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "张永军", interviewee_phone: "15643563892",
+          directionStatus: "进",
+        },
+        {
+          key: '4',
+          visitor: "张雪",
+          visitor_phone: "1589453012",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "胡八一", interviewee_phone: "15643567892",directionStatus: "进",
+        },
+        {
+          key: '5',
+          visitor: "王峰",
+          visitor_phone: "15638295684",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "胡八一", interviewee_phone: "15643563892",directionStatus: "进",
+        },
+        {
+          key: '6',
+          visitor: "张玉",
+          visitor_phone: "17856982569",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "胡八一", interviewee_phone: "15643563892",directionStatus: "进",
+        },
+        {
+          key: '7',
+          visitor: "李天泽",
+          visitor_phone: "13032678754",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "交流",
+          direction: "进入B2",
+          interviewee: "刘一鸣", interviewee_phone: "15943563892",directionStatus: "进",
+        },
+        {
+          key: '8',
+          visitor: "李天泽",
+          visitor_phone: "13032678754",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "交流",
+          direction: "进入B2",
+          interviewee: "刘一鸣", interviewee_phone: "15943563892",directionStatus: "进",
+        },
+        {
+          key: '9',
+          visitor: "李天泽",
+          visitor_phone: "13032678754",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "交流",
+          direction: "进入B2",
+          interviewee: "胡八一", interviewee_phone: "15943563892",directionStatus: "进",
+        },
+        {
+          key: '10',
+          visitor: "李天泽",
+          visitor_phone: "12232678754",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "交流",
+          direction: "进入B2",
+          interviewee: "胡八一", interviewee_phone: "15943563892",directionStatus: "进",
+        },
+        {
+          key: '11',
+          visitor: "李天泽",
+          visitor_phone: "12232678754",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "交流",
+          direction: "出去B2",
+          interviewee: "胡八一", interviewee_phone: "15943563892",directionStatus: "出",
+        },
+        {
+          key: '12',
+          visitor: "李天泽",
+          visitor_phone: "12232678759",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "交流",
+          direction: "出去B2",
+          interviewee: "刘一鸣", interviewee_phone: "15943463892",directionStatus: "出",
+        },
+        {
+          key: '13',
+          visitor: "李天泽",
+          visitor_phone: "15513548219",
+          department: "北京电信规划院",
+          time: "2023-03-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "刘一鸣", interviewee_phone: "15943563892",directionStatus: "进",
+        },
+        {
+          key: '14',
+          visitor: "李天泽",
+          visitor_phone: "15513548214",
+          department: "北京电信规划院",
+          time: "2023-03-20 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "刘一鸣", interviewee_phone: "15943563892",directionStatus: "进",
+        },
+        {
+          key: '15',
+          visitor: "李天泽",
+          visitor_phone: "15511548219",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "刘一鸣", interviewee_phone: "15943563892",directionStatus: "进",
+        },
+        {
+          key: '16',
+          visitor: "李天泽",
+          visitor_phone: "15513548219",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "刘一鸣", interviewee_phone: "15943563892",directionStatus: "进",
+        },
+        {
+          key: '17',
+          visitor: "李天泽",
+          visitor_phone: "15513548219",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "刘一鸣", interviewee_phone: "13943563892",directionStatus: "进",
+        },
+        {
+          key: '18',
+          visitor: "李天泽",
+          visitor_phone: "15513548219",
+          department: "北京电信规划院",
+          time: "2023-03-10 12:00:00",
+          reason: "开会",
+          direction: "出去B1",
+          interviewee: "刘一鸣", interviewee_phone: "15943563892",directionStatus: "出",
+        },
+        {
+          key: '19',
+          visitor: "李天泽",
+          visitor_phone: "15513548219",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "出去B2",
+          interviewee: "钱多多", interviewee_phone: "15942563898",directionStatus: "出",
+        },
+        {
+          key: '20',
+          visitor: "李天泽",
+          visitor_phone: "15913548219",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "钱多多", interviewee_phone: "15942563898",directionStatus: "进",
+        },
+        {
+          key: '21',
+          visitor: "李天泽",
+          visitor_phone: "15913548219",
+          department: "北京电信规划院",
+          time: "2022-08-26 12:00:00",
+          reason: "开会",
+          direction: "进入B2",
+          interviewee: "钱多多", interviewee_phone: "15942563898",directionStatus: "进",
+        },
+      ]
+    }
+  },
+  mounted() {
+    this.initData()
+  },
+  methods: {
+    initData(){
+      this.objectiveOptions.forEach((v) => {
+        this.objectiveMap.set(v.value, v.label);
+      });
+      this.companyOptions.forEach((v) => {
+        this.companyMap.set(v.value, v.label);
+      });
+      this.tableData = this.originalData;
+    },
+    showPeopleBehaviour() {
+      this.showBehaviour = true;
+    },
+    hideBehaviour() {
+      this.showBehaviour = false;
+    },
+    showTotal(total, range) {
+      let pageSize = range[1]-range[0]+1;
+      let pages = Math.ceil(total/pageSize);
+      return '共'+total+'条数据,第 '+this.currentPage+'/'+pages+' 页';
+    },
+    onShowSizeChange(val) {
+
+    },
+    newPersonList() {
+      this.newPersonListVisible = true;
+    },
+    hideNewPersonList() {
+      this.newPersonListVisible = false;
+    },
+    addNewPersonList() {
+      this.treeData.push({
+        title: this.personListName,
+        key: this.personListName,
+      });
+      this.personListName = '';
+      this.newPersonListVisible = false;
+    },
+    search(){
+      // this.$util.asyncPromise(this.getGuestData());
+      this.getGuestData()
+    },
+    getGuestData(){
+      let nameRegex = new RegExp(this.queryData.name)
+      let phoneRegex = new RegExp(this.queryData.phone)
+      this.tableData = this.originalData.filter((item) => {
+        if (
+            this.queryData.name &&
+            this.queryData.name != "" &&
+            !nameRegex.test(item.visitor)
+        ) {
+          return false;
+        }
+        if (
+            this.queryData.phone &&
+            this.queryData.phone != "" &&
+            !phoneRegex.test(item.interviewee)
+        ) {
+          return false;
+        }
+        if (
+            this.queryData.company &&
+            this.queryData.company != "0" &&
+            !(
+                this.companyMap.get(this.queryData.company) ===
+                item.department
+            )
+        ) {
+          return false;
+        }
+
+        return true;
+      });
+
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.accessManage {
+  width: 100%;
+  height: 100%;
+
+  .ant-form-inline .ant-form-item {
+    margin-right: 60px;
+
+  }
+
+  .accessManage-body {
+    background: white;
+    border-radius: 4px;
+    margin-top: 12px;
+    padding: 15px;
+    height: 650px;
+  }
+
+}
+</style>

+ 1 - 1
src/components/scene/access/sceneAccessBehaviour.vue

@@ -38,7 +38,7 @@
           <template #label>
             <span class="descriptions-item-label">身份证号</span>
           </template>
-          332987644829328765
+          332987********8765
         </a-descriptions-item>
 
       </a-descriptions>

+ 8 - 10
src/components/scene/access/sceneAccessGuestManage.vue

@@ -31,9 +31,7 @@
     <div class="accessManage-body">
       <a-table :columns="tableColumns" :data-source="tableData" :pagination="true"
                :scroll="{ y: tableContainerHeight }" bordered>
-        <a-button slot="action" slot-scope="text" type="link">
-          查看
-        </a-button>
+        <a-button slot="action" slot-scope="text" type="link" @click="showPeopleBehaviour"> 查看 </a-button>
       </a-table>
 
       <!--<div style="width: 100%;text-align: right;margin-top: 15px;">-->
@@ -151,13 +149,13 @@ export default {
           dataIndex: 'direction',
           key: 'direction',
         },
-        //{
-        //  title: '行为感知',
-        //  key: 'operation',
-        //  fixed: 'right',
-        //  width: 100,
-        //  scopedSlots: {customRender: 'action'},
-        //},
+        {
+          title: '行为感知',
+          key: 'operation',
+          fixed: 'right',
+          width: 100,
+          scopedSlots: {customRender: 'action'},
+        },
 
       ],
       tableData:[],

+ 141 - 0
src/components/scene/access/xingweiganzhi/SceneSecurityPersonSelect.vue

@@ -0,0 +1,141 @@
+<template>
+  <div class="securityDeviceSelect" style="width: 100%;height: 100%">
+    <div class="securityDeviceSelect-title">{{ title }}</div>
+    <div style="height: 90%;padding-bottom: 15px;">
+      <a-input-search style="margin-bottom: 8px" placeholder="请输入关键字" @change="onChange"/>
+      <a-tree style="height: 100%;overflow-y: auto"
+              :expanded-keys="expandedKeys"
+              :auto-expand-parent="true"
+              :selected-keys="['1-0']"
+              :tree-data="treeData"
+              :show-icon="true"
+              @expand="onExpand"
+              @select="onSelect"
+      >
+        <template #camera>
+          <span class="anticon"><i-icon-park-outline-camera-two/></span>
+        </template>
+        <template #water>
+          <span class="anticon"><i-icon-park-outline-control/></span>
+        </template>
+
+        <template #title="{ title }">
+                  <span v-if="title.indexOf(searchValue) > -1">
+                    {{ title.substr(0, title.indexOf(searchValue)) }}
+                    <span style="color: #f50">{{ searchValue }}</span>
+                    {{ title.substr(title.indexOf(searchValue) + searchValue.length) }}
+                  </span>
+          <span v-else>{{ title }}</span>
+        </template>
+      </a-tree>
+      <a-button style="position: absolute;bottom: 0;width: 80%" type="primary" @click="newPersonList">新建名单</a-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import Card from "@/components/common/card.vue";
+
+export default {
+  props: {
+    treeData: Array,
+    callback: Function,
+    leftTitle: String,
+    newPersonList: Function,
+  },
+  data() {
+    return {
+      title: '设备点位',
+      expandedKeys: ['1'],
+      oriData: [],
+      searchValue: '',
+      showNewPersonList: false,
+    }
+  },
+  components: {
+    Card
+  },
+  created() {
+    this.generateList(this.treeData)
+  },
+  mounted() {
+    if (this.leftTitle && this.leftTitle!='') {
+      this.title = this.leftTitle
+    }
+    if (this.leftTitle=='名单') {
+      this.title = ''
+    }
+  },
+  methods: {
+    onExpand(expandedKeys) {
+      this.expandedKeys = expandedKeys;
+      this.autoExpandParent = false;
+    },
+    onSelect(val) {
+      if (val.length>0) {
+        this.callback(val[0])
+      }
+    },
+    generateList(data) {
+      for (let i = 0; i < data.length; i++) {
+        const node = data[i];
+        const key = node.key;
+        this.oriData.push({key, title: key});
+        if (node.children) {
+          this.generateList(node.children);
+        }
+      }
+    },
+    getParentKey(key, tree) {
+      let parentKey;
+      for (let i = 0; i < tree.length; i++) {
+        const node = tree[i];
+        if (node.children) {
+          if (node.children.some(item => item.key === key)) {
+            parentKey = node.key;
+          } else if (this.getParentKey(key, node.children)) {
+            parentKey = this.getParentKey(key, node.children);
+          }
+        }
+      }
+      return parentKey;
+    },
+    onChange(e) {
+      const value = e.target.value;
+      const expandedKeys = this.oriData
+          .map(item => {
+            if (item.title.indexOf(value) > -1) {
+              return this.getParentKey(item.key, this.treeData);
+            }
+            return null;
+          })
+          .filter((item, i, self) => item && self.indexOf(item) === i);
+      Object.assign(this, {
+        expandedKeys,
+        searchValue: value,
+        autoExpandParent: true,
+      });
+    },
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.securityDeviceSelect {
+  width: 100%;
+  height: 100%;
+  background-color: #fafafa;
+  padding: 15px;
+  border-radius: 6px;
+
+  .securityDeviceSelect-title {
+    color: #666666;
+    font-size: 16px;
+    margin: 8px 0;
+  }
+
+  /deep/ .ant-tree-switcher-noop {
+    display: none;
+  }
+}
+</style>

+ 3 - 3
src/components/scene/energy/common/deviceCardAir.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="deviceCardAir" :style="{backgroundColor: color}">
+  <div class="deviceCardAir" :style="{backgroundColor: color}" @click="click">
 
     <div class="deviceCardAir-top">
       <span>#{{ item.id }}</span>
@@ -40,7 +40,8 @@ export default {
   },
   props: {
     item: Object,
-    toggle: Function
+    toggle: Function,
+    click: Function,
   },
   watch: {
     "item.online": function (val) {
@@ -63,7 +64,6 @@ export default {
     }
   },
   methods: {
-
   }
 }
 </script>

+ 22 - 12
src/components/scene/energy/sceneEnergyAircondition/airconditioningCard.vue

@@ -66,7 +66,7 @@
           >
             <a-button style="font-size: 12px" size="small" ><a-icon type="poweroff" />全关</a-button>
           </a-popconfirm>
-          <a-button type="primary" size="small" style="font-size: 12px" v-show="!showCard" @click="()=>{this.showBatchCL=true}">批量执行策略</a-button>
+          <a-button type="primary" size="small" style="font-size: 12px" @click="()=>{this.showBatchCL=true}">批量执行策略</a-button>
         </a-space>
       </div>
 
@@ -105,14 +105,14 @@
         <div class="deviceFloorIndex">
           <a-input-search placeholder="请输入楼层"></a-input-search>
           <a-anchor :getContainer="getContainer" :target-offset="100"  style="margin-top: 12px" @change="floorChange">
-            <template v-for="item in floors" >
+            <template v-for="(item,index) in floors" >
               <a-anchor-link :href="'#'+item.label" :key="item.value" >
                 <template #title>
-                  <!--<span style="display: inline-block;padding-left: 5px; width: 20px;height: 40px;overflow: hidden">-->
-                  <!--  <div style="position: absolute;top: 15px;left: -2px;width: 4px;height: 4px;border-radius: 2px;background-color: #2EA8E6"></div>-->
-                  <!--  <div style="width: 18px;height: 18px;border-bottom: 1px dashed #2EA8E6;" ></div>-->
-                  <!--  <div style="width: 18px;height: 18px;border-left: 1px dashed #2EA8E6" ></div>-->
-                  <!--</span>-->
+                  <span style="display: inline-block;margin-left: 25px; width: 30px;overflow: hidden;vertical-align: middle" >
+                    <div style="width: 30px;height: 20px;border-bottom: 1px dashed #2EA8E6;" :style="index!==0?{borderLeft: '1px dashed #2EA8E6'}:{}" ></div>
+                    <div style="width: 30px;height: 20px;border-left: 1px dashed #2EA8E6" :style="index===floors.length-1?{}:{borderLeft: '1px dashed #2EA8E6'}" ></div>
+                    <div style="position: absolute;top: 18.5px;left:23px;padding-left: 2px;width: 5px;height: 5px;border-radius: 2.5px;background-color: #2EA8E6"></div>
+                  </span>
                   {{ item.label }}
                 </template>
               </a-anchor-link>
@@ -129,7 +129,7 @@
               <div style="padding: 0 15px">
                 <a-row :gutter="[30,12]">
                   <a-col v-for="device in item.devices" :key="device.id" :span="6">
-                    <DeviceCardAir :item="device" :toggle="toggleOnline"  />
+                    <DeviceCardAir :click="handleCardClick"  :item="device" :toggle="toggleOnline"  />
                   </a-col>
                 </a-row>
               </div>
@@ -177,7 +177,7 @@
       </div>
     </div>
 
-    <a-modal title="批量执行策略" v-if="showBatchCL" v-model="showBatchCL" width="500" height="300" centered style="max-height: 300px;overflow-y: auto" @ok="handleOk">
+    <a-modal title="策略配置" v-if="showBatchCL" v-model="showBatchCL" width="500" height="300" centered style="max-height: 300px;overflow-y: auto" @ok="handleOk">
       <a-form-model :form="formData" :label-col="{span:6}" :wrapperCol="{span:16}" style="overflow-y: auto;height: 450px">
 
         <a-form-item label="选择策略:" class="formItem" >
@@ -591,6 +591,10 @@ export default {
       this.showBatchCL = false;
       this.$message.success('设置成功')
     },
+    handleCardClick() {
+      this.showBatchCL = true;
+      this.formData = {}
+    },
     search() {
       let objarr = JSON.parse(JSON.stringify(this.oriFloors));
       let app = this
@@ -684,7 +688,7 @@ export default {
     padding: 15px 8px;
     .airContainer-left {
       background-color: #fafafa;
-      width: 20%;
+      width: 15%;
       height: 100%;
       display: inline-block;
       vertical-align: top;
@@ -693,15 +697,21 @@ export default {
     }
     .airContainer-right {
       display: inline-block;
-      width: 80%;
+      width: 85%;
       height: 100%;
       vertical-align: top;
       padding: 12px 20px;
       overflow-y: auto;
     }
     .ant-anchor-link {
-      line-height: 45px;
+      line-height: 40px;
       font-size: 16px;
+      padding: 0;
+      padding-left: 20%;
+      letter-spacing: 5px;
+    }
+    /deep/ .ant-anchor-ink {
+      display: none !important;
     }
     .ant-anchor-link-active {
       background-color: #e0effa;

+ 21 - 11
src/components/scene/energy/sceneEnergyAircondition/sceneWaterCard.vue

@@ -47,7 +47,7 @@
           >
             <a-button style="font-size: 12px" size="small" @click="allPowerOn"><a-icon type="poweroff" />全关</a-button>
           </a-popconfirm>
-          <a-button type="primary" size="small" style="font-size: 12px" v-show="!showCard" @click="()=>{this.showBatchCL=true}">批量执行策略</a-button>
+          <a-button type="primary" size="small" style="font-size: 12px" @click="()=>{this.showBatchCL=true}">批量执行策略</a-button>
         </a-space>
       </div>
 
@@ -89,11 +89,11 @@
             <template v-for="item in floors" >
               <a-anchor-link :href="'#'+item.label" :key="item.value" >
                 <template #title>
-                  <!--<span style="display: inline-block;padding-left: 5px; width: 20px;height: 40px;overflow: hidden">-->
-                  <!--  <div style="position: absolute;top: 15px;left: -2px;width: 4px;height: 4px;border-radius: 2px;background-color: #2EA8E6"></div>-->
-                  <!--  <div style="width: 18px;height: 18px;border-bottom: 1px dashed #2EA8E6;" ></div>-->
-                  <!--  <div style="width: 18px;height: 18px;border-left: 1px dashed #2EA8E6" ></div>-->
-                  <!--</span>-->
+                  <span style="display: inline-block;margin-left: 25px; width: 30px;overflow: hidden;vertical-align: middle" >
+                    <div style="width: 30px;height: 20px;border-bottom: 1px dashed #2EA8E6;" :style="index!==0?{borderLeft: '1px dashed #2EA8E6'}:{}" ></div>
+                    <div style="width: 30px;height: 20px;border-left: 1px dashed #2EA8E6" :style="index===floors.length-1?{}:{borderLeft: '1px dashed #2EA8E6'}" ></div>
+                    <div style="position: absolute;top: 18.5px;left:23px;padding-left: 2px;width: 5px;height: 5px;border-radius: 2.5px;background-color: #2EA8E6"></div>
+                  </span>
                   {{ item.label }}
                 </template>
               </a-anchor-link>
@@ -110,7 +110,7 @@
               <div style="padding: 0 15px">
                 <a-row :gutter="[30,12]">
                   <a-col v-for="device in item.devices" :key="device.id" :span="6">
-                    <deviceCardWater :item="device" :toggle="toggleOnline"  />
+                    <deviceCardWater :click="handleCardClick" :item="device" :toggle="toggleOnline"  />
                   </a-col>
                 </a-row>
               </div>
@@ -158,7 +158,7 @@
       </div>
     </div>
 
-    <a-modal title="批量执行策略" v-if="showBatchCL" v-model="showBatchCL" width="500" height="300" centered style="max-height: 300px;overflow-y: auto" @ok="handleOk">
+    <a-modal title="策略配置" v-if="showBatchCL" v-model="showBatchCL" width="500" height="300" centered style="max-height: 300px;overflow-y: auto" @ok="handleOk">
       <a-form-model :form="formData" :label-col="{span:6}" :wrapperCol="{span:16}" style="overflow-y: auto;height: 450px">
 
         <a-form-item label="选择策略:" class="formItem" >
@@ -526,6 +526,10 @@ export default {
       this.showBatchCL = false;
       this.$message.success('设置成功')
     },
+    handleCardClick() {
+      this.showBatchCL = true;
+      this.formData = {}
+    },
     search() {
       let objarr = JSON.parse(JSON.stringify(this.oriFloors));
       let app = this
@@ -611,7 +615,7 @@ export default {
     padding: 15px 8px;
     .airContainer-left {
       background-color: #fafafa;
-      width: 20%;
+      width: 15%;
       height: 100%;
       display: inline-block;
       vertical-align: top;
@@ -620,15 +624,21 @@ export default {
     }
     .airContainer-right {
       display: inline-block;
-      width: 80%;
+      width: 85%;
       height: 100%;
       vertical-align: top;
       padding: 12px 20px;
       overflow-y: auto;
     }
     .ant-anchor-link {
-      line-height: 45px;
+      line-height: 40px;
       font-size: 16px;
+      padding: 0;
+      padding-left: 20%;
+      letter-spacing: 5px;
+    }
+    /deep/ .ant-anchor-ink {
+      display: none !important;
     }
     .ant-anchor-link-active {
       background-color: #e0effa;

+ 21 - 11
src/components/scene/energy/sceneEnergyAircondition/scenelightCard.vue

@@ -49,7 +49,7 @@
           </a-popconfirm>
 
 
-          <a-button type="primary" size="small" style="font-size: 12px" v-show="!showCard" @click="()=>{this.showBatchCL=true}">批量执行策略</a-button>
+          <a-button type="primary" size="small" style="font-size: 12px"  @click="()=>{this.showBatchCL=true}">批量执行策略</a-button>
         </a-space>
       </div>
 
@@ -91,11 +91,11 @@
             <template v-for="item in floors" >
               <a-anchor-link :href="'#'+item.label" :key="item.value" >
                 <template #title>
-                  <!--<span style="display: inline-block;padding-left: 5px; width: 20px;height: 40px;overflow: hidden">-->
-                  <!--  <div style="position: absolute;top: 15px;left: -2px;width: 4px;height: 4px;border-radius: 2px;background-color: #2EA8E6"></div>-->
-                  <!--  <div style="width: 18px;height: 18px;border-bottom: 1px dashed #2EA8E6;" ></div>-->
-                  <!--  <div style="width: 18px;height: 18px;border-left: 1px dashed #2EA8E6" ></div>-->
-                  <!--</span>-->
+                  <span style="display: inline-block;margin-left: 25px; width: 30px;overflow: hidden;vertical-align: middle" >
+                    <div style="width: 30px;height: 20px;border-bottom: 1px dashed #2EA8E6;" :style="index!==0?{borderLeft: '1px dashed #2EA8E6'}:{}" ></div>
+                    <div style="width: 30px;height: 20px;border-left: 1px dashed #2EA8E6" :style="index===floors.length-1?{}:{borderLeft: '1px dashed #2EA8E6'}" ></div>
+                    <div style="position: absolute;top: 18.5px;left:23px;padding-left: 2px;width: 5px;height: 5px;border-radius: 2.5px;background-color: #2EA8E6"></div>
+                  </span>
                   {{ item.label }}
                 </template>
               </a-anchor-link>
@@ -112,7 +112,7 @@
               <div style="padding: 0 15px">
                 <a-row :gutter="[30,12]">
                   <a-col v-for="device in item.devices" :key="device.id" :span="6">
-                    <deviceCardLight :item="device" :toggle="toggleOnline"  />
+                    <deviceCardLight :click="handleCardClick" :item="device" :toggle="toggleOnline"  />
                   </a-col>
                 </a-row>
               </div>
@@ -160,7 +160,7 @@
       </div>
     </div>
 
-    <a-modal title="批量执行策略" v-if="showBatchCL" v-model="showBatchCL" width="500" height="300" centered style="max-height: 300px;overflow-y: auto" @ok="handleOk">
+    <a-modal title="策略配置" v-if="showBatchCL" v-model="showBatchCL" width="500" height="300" centered style="max-height: 300px;overflow-y: auto" @ok="handleOk">
       <a-form-model :form="formData" :label-col="{span:6}" :wrapperCol="{span:16}" style="overflow-y: auto;height: 450px">
 
         <a-form-item label="选择策略:" class="formItem" >
@@ -520,6 +520,10 @@ export default {
       this.showBatchCL = false;
       this.$message.success('设置成功')
     },
+    handleCardClick() {
+      this.showBatchCL = true;
+      this.formData = {}
+    },
     search() {
       let objarr = JSON.parse(JSON.stringify(this.oriFloors));
       let app = this
@@ -605,7 +609,7 @@ export default {
     padding: 15px 8px;
     .airContainer-left {
       background-color: #fafafa;
-      width: 20%;
+      width: 15%;
       height: 100%;
       display: inline-block;
       vertical-align: top;
@@ -614,15 +618,21 @@ export default {
     }
     .airContainer-right {
       display: inline-block;
-      width: 80%;
+      width: 85%;
       height: 100%;
       vertical-align: top;
       padding: 12px 20px;
       overflow-y: auto;
     }
     .ant-anchor-link {
-      line-height: 45px;
+      line-height: 40px;
       font-size: 16px;
+      padding: 0;
+      padding-left: 20%;
+      letter-spacing: 5px;
+    }
+    /deep/ .ant-anchor-ink {
+      display: none !important;
     }
     .ant-anchor-link-active {
       background-color: #e0effa;

+ 33 - 17
src/components/scene/meeting/chart/meetingNumCharts.vue

@@ -3,22 +3,13 @@
 </template>
 
 <script>
+import apiSceneMeeting from "@/api/scene/meeting/apiSceneMeeting";
+import apiLifeSupermarket from "@/api/life/apiLifeSupermarket";
+
 export default {
   data() {
     return {
-    }
-  },
-  props: {
-    height: Number,
-    queryData: Object
-  },
-  mounted() {
-    this.init()
-  },
-  methods: {
-    init() {
-      let chart = this.$echarts.init(this.$refs.myChart);
-      let options = {
+      option: {
         color: ['#80B2FF','#FFDF80'],
         grid: {
           left: '2%', //默认10%
@@ -30,7 +21,7 @@ export default {
         },
         xAxis: {
           type: 'category',
-          data: ['2月1日', '2月2日', '2月3日', '2月4日', '2月5日', '2月6日', '2月7日', '2月8日', '2月9日', '2月10日', '2月11日', '2月12日', '2月13日', '2月14日', '2月15日', '2月16日', '2月17日', '2月18日', '2月19日', '2月20日', '2月21日', '2月22日', '2月23日', '2月24日', '2月25日', '2月26日', '2月27日', '2月28日']
+          data: []
         },
         yAxis: [
           {
@@ -61,7 +52,7 @@ export default {
         },
         series: [
           {
-            data: [80, 128, 115, 73, 118, 128, 88, 147, 106, 123, 68, 78, 79, 135, 84, 120, 106, 98, 67, 137, 147, 64, 86, 117, 117, 122, 106, 75],
+            data: [],
             type: 'bar',
             stack: 'A',
             backgroundStyle: {
@@ -69,8 +60,33 @@ export default {
             }
           }
         ]
-      };
-      chart.setOption(options);
+      }
+    }
+  },
+  props: {
+    height: Number,
+    queryData: Object
+  },
+  mounted() {
+    this.init()
+  },
+  methods: {
+    init() {
+      let chart = this.$echarts.init(this.$refs.myChart)
+      this.chart = chart;
+      this.$util.chartsResize(this.chart);
+      chart.setOption(this.option)
+      this.$store.loadingStore().loadingWithApi(this.getData())
+    },
+    getData() {
+      this.loading = true;
+      return apiSceneMeeting.getMeetingTimes(this.queryData.timeRange).then(res=>{
+        let data = this.$util.dataUtil.covertDataToEcharts(res, ['times'])
+        this.$util.dataUtil.refreshEchartsData(this.chart, this.option, data)
+        this.loading = false;
+      }).catch(err=>{
+        this.loading = false;
+      })
     }
   }
 }

+ 30 - 15
src/components/scene/meeting/chart/meetingPersonCharts.vue

@@ -3,22 +3,12 @@
 </template>
 
 <script>
+import apiSceneMeeting from "@/api/scene/meeting/apiSceneMeeting";
+
 export default {
   data() {
     return {
-    }
-  },
-  props: {
-    height: Number,
-    queryData: Object
-  },
-  mounted() {
-    this.init()
-  },
-  methods: {
-    init() {
-      let chart = this.$echarts.init(this.$refs.myChart);
-      let options = {
+      option: {
         color: ['#80B2FF','#FFDF80'],
         grid: {
           left: '2%', //默认10%
@@ -69,8 +59,33 @@ export default {
             }
           }
         ]
-      };
-      chart.setOption(options);
+      }
+    }
+  },
+  props: {
+    height: Number,
+    queryData: Object
+  },
+  mounted() {
+    this.init()
+  },
+  methods: {
+    init() {
+      let chart = this.$echarts.init(this.$refs.myChart)
+      this.chart = chart;
+      this.$util.chartsResize(this.chart);
+      chart.setOption(this.option)
+      this.$store.loadingStore().loadingWithApi(this.getData())
+    },
+    getData() {
+      this.loading = true;
+      return apiSceneMeeting.getMeetingPersons(this.queryData.timeRange).then(res=>{
+        let data = this.$util.dataUtil.covertDataToEcharts(res, ['person'])
+        this.$util.dataUtil.refreshEchartsData(this.chart, this.option, data)
+        this.loading = false;
+      }).catch(err=>{
+        this.loading = false;
+      })
     }
   }
 }

+ 30 - 16
src/components/scene/meeting/chart/meetingPersonDistributeChart.vue

@@ -3,23 +3,12 @@
 </template>
 
 <script>
+import apiSceneMeeting from "@/api/scene/meeting/apiSceneMeeting";
+
 export default {
   data() {
     return {
-
-    }
-  },
-  props: {
-    height: Number,
-    queryData: Object
-  },
-  mounted() {
-    this.initChart()
-  },
-  methods: {
-    initChart() {
-      let chart = this.$echarts.init(this.$refs.myChart)
-      let option = {
+      option: {
         tooltip: {
           trigger: 'item'
         },
@@ -73,8 +62,33 @@ export default {
             ]
           }
         ]
-      };
-      chart.setOption(option);
+      }
+    }
+  },
+  props: {
+    height: Number,
+    queryData: Object
+  },
+  mounted() {
+    this.init()
+  },
+  methods: {
+    init() {
+      let chart = this.$echarts.init(this.$refs.myChart)
+      this.chart = chart;
+      this.$util.chartsResize(this.chart);
+      chart.setOption(this.option)
+      this.$store.loadingStore().loadingWithApi(this.getData())
+    },
+    getData() {
+      this.loading = true;
+      return apiSceneMeeting.getMeetingCakePerson(this.queryData.timeRange).then(res=>{
+        let data = this.$util.dataUtil.covertDataToEcharts(res, ['person'])
+        this.$util.dataUtil.refreshEchartsData(this.chart, this.option, data)
+        this.loading = false;
+      }).catch(err=>{
+        this.loading = false;
+      })
     }
   }
 }

+ 30 - 15
src/components/scene/meeting/chart/meetingTimeCharts.vue

@@ -3,22 +3,12 @@
 </template>
 
 <script>
+import apiSceneMeeting from "@/api/scene/meeting/apiSceneMeeting";
+
 export default {
   data() {
     return {
-    }
-  },
-  props: {
-    height: Number,
-    queryData: Object
-  },
-  mounted() {
-    this.init()
-  },
-  methods: {
-    init() {
-      let chart = this.$echarts.init(this.$refs.myChart);
-      let options = {
+      option: {
         color: ['#80B2FF','#FFDF80'],
         grid: {
           left: '2%', //默认10%
@@ -70,8 +60,33 @@ export default {
             }
           }
         ]
-      };
-      chart.setOption(options);
+      },
+    }
+  },
+  props: {
+    height: Number,
+    queryData: Object
+  },
+  mounted() {
+    this.init()
+  },
+  methods: {
+    init() {
+      let chart = this.$echarts.init(this.$refs.myChart)
+      this.chart = chart;
+      this.$util.chartsResize(this.chart);
+      chart.setOption(this.option)
+      this.$store.loadingStore().loadingWithApi(this.getData())
+    },
+    getData() {
+      this.loading = true;
+      return apiSceneMeeting.getMeetingMinutes(this.queryData.timeRange).then(res=>{
+        let data = this.$util.dataUtil.covertDataToEcharts(res, ['times'])
+        this.$util.dataUtil.refreshEchartsData(this.chart, this.option, data)
+        this.loading = false;
+      }).catch(err=>{
+        this.loading = false;
+      })
     }
   }
 }

+ 30 - 16
src/components/scene/meeting/chart/meetingTimeDistributeChart.vue

@@ -3,23 +3,12 @@
 </template>
 
 <script>
+import apiSceneMeeting from "@/api/scene/meeting/apiSceneMeeting";
+
 export default {
   data() {
     return {
-
-    }
-  },
-  props: {
-    height: Number,
-    queryData: Object
-  },
-  mounted() {
-    this.initChart()
-  },
-  methods: {
-    initChart() {
-      let chart = this.$echarts.init(this.$refs.myChart)
-      let option = {
+      option:  {
         tooltip: {
           trigger: 'item'
         },
@@ -75,8 +64,33 @@ export default {
             ]
           }
         ]
-      };
-      chart.setOption(option);
+      },
+    }
+  },
+  props: {
+    height: Number,
+    queryData: Object
+  },
+  mounted() {
+    this.init()
+  },
+  methods: {
+    init() {
+      let chart = this.$echarts.init(this.$refs.myChart)
+      this.chart = chart;
+      this.$util.chartsResize(this.chart);
+      chart.setOption(this.option)
+      this.$store.loadingStore().loadingWithApi(this.getData())
+    },
+    getData() {
+      this.loading = true;
+      return apiSceneMeeting.getMeetingCakeMinutes(this.queryData.timeRange).then(res=>{
+        let data = this.$util.dataUtil.covertDataToEcharts(res, ['times'])
+        this.$util.dataUtil.refreshEchartsData(this.chart, this.option, data)
+        this.loading = false;
+      }).catch(err=>{
+        this.loading = false;
+      })
     }
   }
 }

+ 3 - 3
src/components/scene/meeting/sceneMeetingOverview.vue

@@ -31,13 +31,13 @@
     <div class="meeting-overview-summary">
       <a-tabs default-active-key="1" >
         <a-tab-pane key="1" tab="会议总次数">
-          <MeetingTimesCharts :height="300"></MeetingTimesCharts>
+          <MeetingTimesCharts :query-data="queryData" :height="300"></MeetingTimesCharts>
         </a-tab-pane>
         <a-tab-pane key="2" tab="会议总人次" force-render>
-          <MeetingPersonCharts :height="300"></MeetingPersonCharts>
+          <MeetingPersonCharts :query-data="queryData" :height="300"></MeetingPersonCharts>
         </a-tab-pane>
         <a-tab-pane key="3" tab="会议总时长">
-          <MeetingTimeCharts :height="300"></MeetingTimeCharts>
+          <MeetingTimeCharts :query-data="queryData" :height="300"></MeetingTimeCharts>
         </a-tab-pane>
       </a-tabs>
     </div>

+ 20 - 12
src/components/security/alarm/securityAlarmMap.vue

@@ -81,22 +81,21 @@ export default {
       areaSrc: 'security/area_1F.png',
       showcamera: false,
       deviceNum: {
-        online: 7,
-        unline: 2,
-        alarm: 1,
+        online: 1,
+        unline: 10,
+        alarm: 0,
       },
       devicePositions: [
         {
-          status: 1,
+          status: 0,
           left: 348,
           top: 27,
-          code: 'a518fd68a2dc42e0ae50f9aacc0c261c'
         },{
-          status: 1,
+          status: 0,
           left: 373,
           top: 27,
         },{
-          status: 1,
+          status: 0,
           left: 230,
           top: 76,
         },{
@@ -104,7 +103,7 @@ export default {
           left: 260,
           top: 76,
         },{
-          status: 1,
+          status: 0,
           left: 300,
           top: 100,
         },{
@@ -112,21 +111,30 @@ export default {
           left: 325,
           top: 100,
         },{
-          status: 1,
+          status: 0,
           left: 300,
           top: 130,
         },{
-          status: 1,
+          status: 0,
           left: 325,
           top: 130,
         },{
-          status: 1,
+          status: 0,
           left: 430,
           top: 155,
         },{
-          status: 1,
+          status: 0,
           left: 180,
           top: 350
+        },{
+          status: 0,
+          left: 180,
+          top: 350,
+        },{
+          status: 1,
+          left: 200,
+          top: 230,
+          code: 'a518fd68a2dc42e0ae50f9aacc0c261c'
         }
       ]
     }

+ 12 - 2
src/components/security/common/securityDeviceSelect.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="securityDeviceSelect" style="width: 100%;height: 100%">
-    <div class="securityDeviceSelect-title">设备点位</div>
+    <div class="securityDeviceSelect-title">{{ title }}</div>
     <div style="height: 90%;padding-bottom: 15px;">
       <a-input-search style="margin-bottom: 8px" placeholder="请输入关键字" @change="onChange"/>
       <a-tree style="height: 100%;overflow-y: auto"
@@ -38,10 +38,12 @@ import Card from "@/components/common/card.vue";
 export default {
   props: {
     treeData: Array,
-    callback: Function
+    callback: Function,
+    leftTitle: String
   },
   data() {
     return {
+      title: '设备点位',
       expandedKeys: ['1'],
       oriData: [],
       searchValue: '',
@@ -53,6 +55,14 @@ export default {
   created() {
     this.generateList(this.treeData)
   },
+  mounted() {
+    if (this.leftTitle && this.leftTitle!='') {
+      this.title = this.leftTitle
+    }
+    if (this.leftTitle=='名单') {
+      this.title = ''
+    }
+  },
   methods: {
     onExpand(expandedKeys) {
       this.expandedKeys = expandedKeys;

+ 6 - 26
src/data/json/menuList.json

@@ -214,6 +214,11 @@
             "name": "停车管理",
             "router": "/scene/access/park",
             "icon": ""
+          },
+          {
+            "name": "行为感知",
+            "router": "/scene/access/action",
+            "icon": ""
           }
         ]
       }
@@ -230,34 +235,9 @@
         "icon": "报表.png",
         "children": [
           {
-            "name": "定制化消费报表",
+            "name": "能源报警报表",
             "router": "/report/table/custom",
             "icon": ""
-          },
-          {
-            "name": "智享生活报表",
-            "router": "/report/table/life",
-            "icon": ""
-          },
-          {
-            "name": "智慧办公报表",
-            "router": "/report/table/work",
-            "icon": ""
-          },
-          {
-            "name": "数智双碳报表",
-            "router": "/report/table/carbon",
-            "icon": ""
-          },
-          {
-            "name": "智慧运营报表",
-            "router": "/report/table/operation",
-            "icon": ""
-          },
-          {
-            "name": "智慧安防报表",
-            "router": "/report/table/security",
-            "icon": ""
           }
         ]
       },

+ 4 - 4
src/router/index.js

@@ -173,7 +173,7 @@ const router = new VueRouter({
                 {
                   path: '/report/table/custom',
                   name: 'reportTableCustom',
-                  meta: {breadcrumb: '定制化消费报表'},
+                  meta: {breadcrumb: '能源报警报表'},
                   component: () => import('@/components/report/table/reportTableCustom.vue')
                 },
                 {
@@ -361,10 +361,10 @@ const router = new VueRouter({
                   component: () => import('@/components/scene/access/sceneAccessParkManage.vue'),
                 },
                 {
-                  path: '/scene/access/behaviour',
-                  name: 'sceneAccessBehaviour',
+                  path: '/scene/access/action',
+                  name: 'sceneAccessAction',
                   meta: {breadcrumb: '行为感知'},
-                  component: () => import('@/components/scene/access/sceneAccessBehaviour.vue'),
+                  component: () => import('@/components/scene/access/sceneAccessAction.vue'),
                 }
               ]
             },

+ 17 - 0
src/utils/dataUtil.js

@@ -35,7 +35,17 @@ const refreshEchartsData = (instance, option, data) => {
     }
     option.color = constant.echartsColors;
     let stackMap = new Map();
+    let barNum = {};
     for (let i = 0; i < option.series.length; i++) {
+        if (option.series[i].type=='bar') {
+            let stack1 = option.series[i].stack;
+            if (stack1) {
+                barNum[stack1] = i;
+            } else {
+                barNum['index'+i] = i
+            }
+
+        }
         option.series[i].data = arr[i];
         option.series[i].smooth = true;
         option.series[i].showSymbol = false;
@@ -61,6 +71,12 @@ const refreshEchartsData = (instance, option, data) => {
             }
         }
     }
+    for (const barNumKey in barNum) {
+        option.series[barNum[barNumKey]].itemStyle = {
+            barBorderRadius: [5, 5, 0, 0]
+        };
+    }
+
     stackMap = dealStackInterval(stackMap);
     stackMap.forEach((value, key, map) => {
         let index = key.split("---")[1];
@@ -167,6 +183,7 @@ const circleChartConfig = (option) => {
             show: true
         }
     }
+    option.color = constant.echartsColors;
     Object.assign(option.series[0].labelLine, labelLine)
     return option;
 }