소스 검색

优化修复

tianyabing 2 년 전
부모
커밋
56b47c11d9
40개의 변경된 파일998개의 추가작업 그리고 219개의 파일을 삭제
  1. 11 0
      package-lock.json
  2. 1 0
      package.json
  3. 7 1
      src/api/system/apiLogin.js
  4. 6 0
      src/api/work/apiWorkFloor.js
  5. 0 4
      src/api/work/apiWorkMeeting.js
  6. 9 2
      src/components/business/space/space.vue
  7. 1 1
      src/components/dashboard/portrait/coldPortrait.vue
  8. 1 1
      src/components/dashboard/portrait/restaurantPortrait.vue
  9. 1 1
      src/components/dashboard/portrait/supermarketPortrait.vue
  10. 11 3
      src/components/doubleCarbon/PV/charts/carbonPvEmissionChart.vue
  11. 11 3
      src/components/doubleCarbon/car/charts/carbonCarEmissionChart.vue
  12. 11 3
      src/components/doubleCarbon/overview/charts/carbonEmissionChart.vue
  13. 11 3
      src/components/doubleCarbon/print/charts/carbonPrintEmissionChart.vue
  14. 24 0
      src/components/home/HomeLeft.vue
  15. 1 1
      src/components/home/NavigationPage.vue
  16. 2 2
      src/components/life/parking/components/lifeParkDetailTable.vue
  17. 2 2
      src/components/life/restaurant/components/LifeRestPayChart.vue
  18. 4 2
      src/components/notice/notice.vue
  19. 95 1
      src/components/scene/access/sceneAccessBehaviour.vue
  20. 37 19
      src/components/scene/access/sceneAccessGuestManage.vue
  21. 45 25
      src/components/scene/access/sceneAccessManage.vue
  22. 43 26
      src/components/scene/access/sceneAccessParkManage.vue
  23. 80 16
      src/components/scene/energy/sceneEnergyAircondition/airconditioningCard.vue
  24. 88 16
      src/components/scene/energy/sceneEnergyAircondition/sceneWaterCard.vue
  25. 78 16
      src/components/scene/energy/sceneEnergyAircondition/scenelightCard.vue
  26. 18 5
      src/components/scene/meeting/chart/meetingPersonDistributeChart.vue
  27. 19 6
      src/components/scene/meeting/chart/meetingTimeDistributeChart.vue
  28. 23 1
      src/components/scene/meeting/config/meetingRoomDetails.vue
  29. 1 1
      src/components/scene/meeting/config/meetingRoomItem.vue
  30. 31 6
      src/components/scene/meeting/config/meetingRooms.vue
  31. 3 2
      src/components/security/alarm/map/imageMap.vue
  32. 28 2
      src/components/security/alarm/securityAlarmMap.vue
  33. 3 3
      src/components/security/camera/hkwsCamera.vue
  34. 1 0
      src/components/security/common/securityDeviceSelect.vue
  35. 6 6
      src/components/security/person/components/securityPersonExistChart.vue
  36. 92 0
      src/components/work/common/iocThreeFbx.vue
  37. 7 2
      src/components/work/meeting/workMeeting.vue
  38. 23 7
      src/components/work/overview/component/workRoomDistribute.vue
  39. 61 9
      src/components/work/overview/workOverview.vue
  40. 102 21
      src/views/LoginView.vue

+ 11 - 0
package-lock.json

@@ -19,6 +19,7 @@
         "pinia": "^2.0.16",
         "pinia-plugin-persistedstate": "^3.1.0",
         "qs": "^6.11.0",
+        "three": "^0.151.2",
         "vue": "^2.7.14",
         "vue-router": "^3.5.4"
       },
@@ -5602,6 +5603,11 @@
       "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
     },
+    "node_modules/three": {
+      "version": "0.151.2",
+      "resolved": "https://registry.npmmirror.com/three/-/three-0.151.2.tgz",
+      "integrity": "sha512-tGaLRP2H6++tj2JumHD25slhFAx0C619rl6G6Utjq7JTrDGJwDxpu+J2XpnYIUMfEmhNvIFDQJfp79JtKmNBWw=="
+    },
     "node_modules/tinycolor2": {
       "version": "1.6.0",
       "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz",
@@ -10825,6 +10831,11 @@
       "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
     },
+    "three": {
+      "version": "0.151.2",
+      "resolved": "https://registry.npmmirror.com/three/-/three-0.151.2.tgz",
+      "integrity": "sha512-tGaLRP2H6++tj2JumHD25slhFAx0C619rl6G6Utjq7JTrDGJwDxpu+J2XpnYIUMfEmhNvIFDQJfp79JtKmNBWw=="
+    },
     "tinycolor2": {
       "version": "1.6.0",
       "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz",

+ 1 - 0
package.json

@@ -19,6 +19,7 @@
     "pinia": "^2.0.16",
     "pinia-plugin-persistedstate": "^3.1.0",
     "qs": "^6.11.0",
+    "three": "^0.151.2",
     "vue": "^2.7.14",
     "vue-router": "^3.5.4"
   },

+ 7 - 1
src/api/system/apiLogin.js

@@ -4,6 +4,12 @@ const login = (param) => {
   return Request.post('/system_user/login', param);
 }
 
+const phonelogin = (param) => {
+    return Request.post('/system_user/phonelogin', param);
+}
+
+
 export default {
-    login
+    login,
+    phonelogin,
 }

+ 6 - 0
src/api/work/apiWorkFloor.js

@@ -10,7 +10,13 @@ const getAccessPersonnel = (timeRange) => {
     return Request.post('/floor/getAccessPersonnel', timeRange)
 }
 
+const getFloorData = (params) => {
+    delete params.floorId
+    return Request.post('/floor/getFloorList', params)
+}
+
 export default {
     getCoreData,
     getAccessPersonnel,
+    getFloorData,
 }

+ 0 - 4
src/api/work/apiWorkMeeting.js

@@ -14,10 +14,6 @@ const getMeetingRecords = (timeRange) => {
     return Request.post('/meeting/getConferenceRoomInfo', timeRange)
 }
 
-const x = () => {
-    return Request.post('/meeting/getConferenceRoomTreeInfo')
-}
-
 export default {
     getCoreData,
     getMeetingCostTrend,

+ 9 - 2
src/components/business/space/space.vue

@@ -10,8 +10,8 @@
       <a-col :span="18">
         <div class="left ioc-card-content">
           <card :title="'空间分析'">
-            <div style="padding: 8px">
-              <img :src="requireImg('business/联通img.png')" width="100%">
+            <div style="padding: 8px;" class="space-image">
+              <!--<img :src="requireImg('business/联通img.png')" width="100%">-->
             </div>
           </card>
         </div>
@@ -155,6 +155,13 @@ export default {
 
 
 <style lang="less" scoped>
+.space-image {
+  background-image: url("@/assets/images/business/联通img.png");
+  background-position: 50% 50%;
+  background-repeat: no-repeat;
+  height: 550px;
+  background-size: 100% auto;
+}
 .left {
   margin-right: 6px;
 }

+ 1 - 1
src/components/dashboard/portrait/coldPortrait.vue

@@ -15,7 +15,7 @@ export default {
         },
         {
           type: 0,
-          title: '今日用冷趋',
+          title: '今日用冷趋',
           num: 0,
           historyDesc: '环比',
           showTrendIcon: true,

+ 1 - 1
src/components/dashboard/portrait/restaurantPortrait.vue

@@ -36,7 +36,7 @@ export default {
         },
         {
           type: 1,
-          title: '第三方结算方式 费用(元)',
+          title: '第三方结算费用(元)',
           content: '0'
         },
         {

+ 1 - 1
src/components/dashboard/portrait/supermarketPortrait.vue

@@ -35,7 +35,7 @@ export default {
         },
         {
           type: 1,
-          title: '第三方结算方式 费用(元)',
+          title: '第三方结算费用(元)',
           content: '0'
         },
         {

+ 11 - 3
src/components/doubleCarbon/PV/charts/carbonPvEmissionChart.vue

@@ -14,7 +14,15 @@ export default {
             '广分',
             '上分',
             '成分',
-          ]
+          ],
+          selected: {
+            '中迅': false,
+            '北京规划院': true,
+            '郑分': false,
+            '广分': false,
+            '上分': false,
+            '成分': false,
+          }
         },
         grid: {
           left: '0%', //默认10%
@@ -77,7 +85,7 @@ export default {
             symbolSize: 6,
             lineStyle: {
               color: "#FDB65B",
-              width: 4,
+              width: 1,
             },
             itemStyle: {
               color: "#FDB65B"
@@ -94,7 +102,7 @@ export default {
             showSymbol:false,
             lineStyle: {
               color: "#62CC97",
-              width: 1,
+              width: 3,
             },
             itemStyle: {
               color: "#62CC97"

+ 11 - 3
src/components/doubleCarbon/car/charts/carbonCarEmissionChart.vue

@@ -13,7 +13,15 @@ export default {
             '广分',
             '上分',
             '成分',
-          ]
+          ],
+          selected: {
+            '中迅': false,
+            '北京规划院': true,
+            '郑分': false,
+            '广分': false,
+            '上分': false,
+            '成分': false,
+          }
         },
         grid: {
           left: '0%', //默认10%
@@ -76,7 +84,7 @@ export default {
             symbolSize: 6,
             lineStyle: {
               color: "#FDB65B",
-              width: 4,
+              width: 1,
             },
             itemStyle: {
               color: "#FDB65B"
@@ -93,7 +101,7 @@ export default {
             showSymbol:false,
             lineStyle: {
               color: "#62CC97",
-              width: 1,
+              width: 3,
             },
             itemStyle: {
               color: "#62CC97"

+ 11 - 3
src/components/doubleCarbon/overview/charts/carbonEmissionChart.vue

@@ -14,7 +14,15 @@ export default {
             '广分',
             '上分',
             '成分',
-          ]
+          ],
+          selected: {
+            '中迅': false,
+            '北京规划院': true,
+            '郑分': false,
+            '广分': false,
+            '上分': false,
+            '成分': false,
+          }
         },
         grid: {
           left: '0%', //默认10%
@@ -77,7 +85,7 @@ export default {
             symbolSize: 6,
             lineStyle: {
               color: "#FDB65B",
-              width: 4,
+              width: 1,
             },
             itemStyle: {
               color: "#FDB65B"
@@ -94,7 +102,7 @@ export default {
             showSymbol:false,
             lineStyle: {
               color: "#62CC97",
-              width: 1,
+              width: 3,
             },
             itemStyle: {
               color: "#62CC97"

+ 11 - 3
src/components/doubleCarbon/print/charts/carbonPrintEmissionChart.vue

@@ -14,7 +14,15 @@ export default {
             '广分',
             '上分',
             '成分',
-          ]
+          ],
+          selected: {
+            '中迅': false,
+            '北京规划院': true,
+            '郑分': false,
+            '广分': false,
+            '上分': false,
+            '成分': false,
+          }
         },
         grid: {
           left: '0%', //默认10%
@@ -77,7 +85,7 @@ export default {
             symbolSize: 6,
             lineStyle: {
               color: "#FDB65B",
-              width: 4,
+              width: 1,
             },
             itemStyle: {
               color: "#FDB65B"
@@ -94,7 +102,7 @@ export default {
             showSymbol:false,
             lineStyle: {
               color: "#62CC97",
-              width: 1,
+              width: 3,
             },
             itemStyle: {
               color: "#62CC97"

+ 24 - 0
src/components/home/HomeLeft.vue

@@ -30,6 +30,30 @@
           </span>
           智能看板
         </a-menu-item>
+        <a-menu-item @click="handleClickMenuItem('/life')">
+          <span class="anticon" style="vertical-align: middle">
+            <a-avatar :size="20" :src="requireImg('function/智享生活.png')" />
+          </span>
+          智享生活
+        </a-menu-item>
+        <a-menu-item @click="handleClickMenuItem('/work')">
+          <span class="anticon" style="vertical-align: middle">
+            <a-avatar :size="20" :src="requireImg('function/智慧办公.png')" />
+          </span>
+          智慧办公
+        </a-menu-item>
+        <a-menu-item @click="handleClickMenuItem('/security')">
+          <span class="anticon" style="vertical-align: middle">
+            <a-avatar :size="20" :src="requireImg('function/智慧安防.png')" />
+          </span>
+          智慧安防
+        </a-menu-item>
+        <a-menu-item @click="handleClickMenuItem('/scene')">
+          <span class="anticon" style="vertical-align: middle">
+            <a-avatar :size="20" :src="requireImg('function/智慧场景.png')" />
+          </span>
+          智慧场景
+        </a-menu-item>
       </a-menu-item-group>
 
     </a-menu>

+ 1 - 1
src/components/home/NavigationPage.vue

@@ -62,7 +62,7 @@ export default {
     vertical-align: top;
     width: 150px;
     height: 200px;
-    margin: 30px 2% 30px 6%;
+    margin: 30px 15px 30px 3%;
     .menu-title {
       margin-left: 20px;
       margin-top: 10px;

+ 2 - 2
src/components/life/parking/components/lifeParkDetailTable.vue

@@ -40,8 +40,8 @@ export default {
         },
         {
           title: "停车时间",
-          key: "prkingDuration",
-          dataIndex: "prkingDuration",
+          key: "prkingDurationLong",
+          dataIndex: "prkingDurationLong",
           width: 60,
           align: 'center'
         },

+ 2 - 2
src/components/life/restaurant/components/LifeRestPayChart.vue

@@ -20,7 +20,7 @@ export default {
         },
         series: [
           {
-            name: 'jine ',
+            name: '金额',
             type: 'pie',
             radius: ['40%', '70%'],
             center: ['50%','40%'],
@@ -62,7 +62,7 @@ export default {
       this.$store.loadingStore().loadingWithApi(this.getData())
     },
     getData() {
-      return apiLifeRestaurant.getProfitAnalysis(this.queryData).then(res=>{
+      return apiLifeRestaurant.getPaymentAnalysis(this.queryData).then(res=>{
         this.option.series[0].data = res;
         this.chart.setOption(this.option)
       })

+ 4 - 2
src/components/notice/notice.vue

@@ -7,7 +7,8 @@
         <a-menu :default-selected-keys="['unReadNotice']" theme="dark" mode="inline" style="height: 100%" @click="handleClick">
           <a-menu-item-group key="message">
             <template slot="title">
-              <span style="color: #f0f2f5">通知</span>
+              <span style="color: white"><a-icon type="notification" /></span>
+              <span style="color: #f0f2f5;padding-left: 12px">通知</span>
             </template>
             <a-menu-item key="unReadNotice">
               未读通知
@@ -21,7 +22,8 @@
           </a-menu-item-group>
           <a-menu-item-group key="feedback">
             <template slot="title">
-              <span style="color: #f0f2f5">用户反馈</span>
+              <span style="color: white"><a-icon type="sound" /></span>
+              <span style="color: #f0f2f5;padding-left: 12px">用户反馈</span>
             </template>
             <a-menu-item key="unReadFeedback">
               未读反馈

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

@@ -1,5 +1,94 @@
 <template>
+  <div class="sceneAccessBehaviour">
+    <div class="sceneAccessBehaviour-top">
+      <!--<a-avatar-->
+      <!--    shape="square"-->
+      <!--    size="large"-->
+      <!--    style="vertical-align: top;background-color: #2ba8e4"-->
+      <!--&gt;-->
+      <!--  U-->
+      <!--</a-avatar>-->
 
+      <a-descriptions :column="3" style="display: inline-block;vertical-align: top">
+        <a-descriptions-item >
+          <template #label>
+            <span class="descriptions-item-label">姓名</span>
+          </template>
+          胡小雪
+        </a-descriptions-item>
+        <a-descriptions-item >
+          <template #label>
+            <span class="descriptions-item-label">类别</span>
+          </template>
+          访客
+        </a-descriptions-item>
+        <a-descriptions-item >
+          <template #label>
+            <span class="descriptions-item-label">所属公司</span>
+          </template>
+          深圳寰宇天下
+        </a-descriptions-item>
+        <a-descriptions-item >
+          <template #label>
+            <span class="descriptions-item-label">预约时间</span>
+          </template>
+          2023/03/26 09:00:00
+        </a-descriptions-item>
+        <a-descriptions-item >
+          <template #label>
+            <span class="descriptions-item-label">身份证号</span>
+          </template>
+          332987644829328765
+        </a-descriptions-item>
+
+      </a-descriptions>
+
+    </div>
+    <div class="sceneAccessBehaviour-content">
+      <a-timeline mode="alternate">
+        <a-timeline-item>
+          <div>2023年 03 月 23 日  09:05:45</div>
+          <div>进入停车场</div>
+        </a-timeline-item>
+        <a-timeline-item color="green">
+          <div>2023年 03 月 23 日  09:11:21</div>
+          <div>进入公司大楼正门</div>
+        </a-timeline-item>
+        <a-timeline-item>
+          <a-icon slot="dot" type="clock-circle-o" style="font-size: 16px;" />
+          <div>2023年 03 月 23 日  11:30:06</div>
+          <div>进入21层餐厅</div>
+        </a-timeline-item>
+        <a-timeline-item color="green">
+          <div>2023年 03 月 23 日  11:36:52</div>
+          <div>餐厅消费26.5元</div>
+        </a-timeline-item>
+        <a-timeline-item>
+          <a-icon slot="dot" type="clock-circle-o" style="font-size: 16px;" />
+          <div>2023年 03 月 23 日  15:14:33</div>
+          <div>无人超市刷脸支付消费36元,共计5件商品</div>
+        </a-timeline-item>
+        <a-timeline-item color="green">
+          <div>2023年 03 月 23 日  16:22:24</div>
+          <div>进入8层802会议室</div>
+        </a-timeline-item>
+        <a-timeline-item>
+          <a-icon slot="dot" type="clock-circle-o" style="font-size: 16px;" />
+          <div>2023年 03 月 23 日  17:39:02</div>
+          <div>出大楼正门</div>
+        </a-timeline-item>
+        <a-timeline-item >
+          <div>2023年 03 月 23 日  17:48:18</div>
+          <div>进入停车场B1</div>
+        </a-timeline-item>
+        <a-timeline-item color="red">
+          <div>2023年 03 月 23 日  18:02:26</div>
+          <div>出停车场B1</div>
+        </a-timeline-item>
+
+      </a-timeline>
+    </div>
+  </div>
 </template>
 
 <script>
@@ -7,5 +96,10 @@ export default {}
 </script>
 
 <style lang="less" scoped>
-
+.sceneAccessBehaviour-content {
+  height: 400px;
+  overflow-y: auto;
+  margin-top: 20px;
+  padding-top: 10px;
+}
 </style>

+ 37 - 19
src/components/scene/access/sceneAccessGuestManage.vue

@@ -9,17 +9,17 @@
           <a-form-model-item label="受访人" style="margin-left: 45px">
             <a-input style="width: 250px" v-model="queryData.name" placeholder="请输入姓名/手机号"/>
           </a-form-model-item>
-          <div style="height: 20px"></div>
-          <a-form-model-item label="访问事由" style="margin-left: 15px">
-            <a-select v-model="queryData.objective" style="width: 250px">
-              <a-select-option v-for="(item,index) in objectiveOptions" :key="index" :value="item.value">
+          <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>
-          <a-form-model-item label="公司" style="">
-            <a-select v-model="queryData.company" style="width: 150px">
-              <a-select-option v-for="(item,index) in companyOptions" :key="index" :value="item.value">
+          <div style="height: 20px"></div>
+          <a-form-model-item label="访问事由" style="margin-left: 15px">
+            <a-select v-model="queryData.objective" style="width: 250px">
+              <a-select-option v-for="(item,index) in objectiveOptions" :key="index" :value="item.value">
                 {{ item.label }}
               </a-select-option>
             </a-select>
@@ -29,25 +29,36 @@
     </div>
 
     <div class="accessManage-body">
-      <a-table :columns="tableColumns" :data-source="tableData" :pagination="false"
+      <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-table>
 
-      <div style="width: 100%;text-align: right;margin-top: 15px;">
-        <a-pagination ref="pagination"
-                      :showQuickJumper="true"
-                      :show-size-changer="true"
-                      :show-total="showTotal"
-                      v-model="currentPage"
-                      :default-current="1"
-                      :total="500"
-                      @showSizeChange="onShowSizeChange"
-        />
-      </div>
+      <!--<div style="width: 100%;text-align: right;margin-top: 15px;">-->
+      <!--  <a-pagination ref="pagination"-->
+      <!--                :showQuickJumper="true"-->
+      <!--                :show-size-changer="true"-->
+      <!--                :show-total="showTotal"-->
+      <!--                v-model="currentPage"-->
+      <!--                :default-current="1"-->
+      <!--                :total="500"-->
+      <!--                @showSizeChange="onShowSizeChange"-->
+      <!--  />-->
+      <!--</div>-->
     </div>
+
+    <a-modal
+        title="行为感知"
+        v-if="showBehaviour"
+        :visible="showBehaviour"
+        width="65%"
+        @cancel="hideBehaviour"
+        :footer="null"
+    >
+      <SceneAccessBehaviour />
+    </a-modal>
   </div>
 </template>
 
@@ -59,6 +70,7 @@ export default {
   },
   data() {
     return {
+      showBehaviour: false,
       currentPage: 1,
       queryData: {
         objective: '1',
@@ -380,6 +392,12 @@ export default {
       });
       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);

+ 45 - 25
src/components/scene/access/sceneAccessManage.vue

@@ -16,8 +16,7 @@
               placeholder="请输入设备名称"
             />
           </a-form-model-item>
-          <div style="height: 20px"></div>
-          <a-form-model-item label="人员类型" style="margin-left: 15px">
+          <a-form-model-item label="人员类型" >
             <a-select v-model="queryData.people" style="width: 250px">
               <a-select-option
                 v-for="(item, index) in peopleOptions"
@@ -27,7 +26,8 @@
               </a-select-option>
             </a-select>
           </a-form-model-item>
-          <a-form-model-item label="通行方向">
+          <div style="height: 20px"></div>
+          <a-form-model-item label="通行方向" style="margin-left: 15px">
             <a-select v-model="queryData.direction" style="width: 250px">
               <a-select-option
                 v-for="(item, index) in directionOptions"
@@ -38,7 +38,7 @@
             </a-select>
           </a-form-model-item>
           <a-form-model-item label="部门" style="margin-left: 30px">
-            <a-select v-model="queryData.dept" style="width: 150px">
+            <a-select v-model="queryData.dept" style="width: 250px">
               <a-select-option value="0">全部</a-select-option>
               <a-select-option
                 v-for="(item, index) in deptOptions"
@@ -56,37 +56,51 @@
       <a-table
         :columns="tableColumns"
         :data-source="tableData"
-        :pagination="false"
+        :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">
-        <a-pagination
-          ref="pagination"
-          :showQuickJumper="true"
-          :show-size-changer="true"
-          :show-total="showTotal"
-          v-model="currentPage"
-          :default-current="1"
-          :total="total"
-          @showSizeChange="onShowSizeChange"
-        />
-      </div>
+      <!--<div style="width: 100%; text-align: right; margin-top: 15px">-->
+      <!--  <a-pagination-->
+      <!--    ref="pagination"-->
+      <!--    :showQuickJumper="true"-->
+      <!--    :show-size-changer="true"-->
+      <!--    :show-total="showTotal"-->
+      <!--    v-model="currentPage"-->
+      <!--    :default-current="1"-->
+      <!--    :total="total"-->
+      <!--    @showSizeChange="onShowSizeChange"-->
+      <!--  />-->
+      <!--</div>-->
     </div>
+    <a-modal
+        title="行为感知"
+        v-if="showBehaviour"
+        :visible="showBehaviour"
+        width="65%"
+        @cancel="hideBehaviour"
+        :footer="null"
+    >
+      <SceneAccessBehaviour />
+    </a-modal>
+
   </div>
 </template>
 
 <script>
 import Query from "@/components/common/query.vue";
+import SceneAccessBehaviour from "@/components/scene/access/sceneAccessBehaviour.vue";
 
 export default {
   components: {
     Query,
+    SceneAccessBehaviour,
   },
   data() {
     return {
+      showBehaviour: false,
       total: 21,
       currentPage: 1,
       queryData: {
@@ -190,13 +204,13 @@ export default {
           key: "direction",
           align: "center",
         },
-        //{
-        //  title: '行为感知',
-        //  key: 'operation',
-        //  fixed: 'right',
-        //  width: 100,
-        //  scopedSlots: {customRender: 'action'},
-        //},
+        {
+          title: '行为感知',
+          key: 'operation',
+          fixed: 'right',
+          width: 100,
+          scopedSlots: {customRender: 'action'},
+        },
       ],
       originalData: [
         {
@@ -451,6 +465,12 @@ export default {
       });
       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);

+ 43 - 26
src/components/scene/access/sceneAccessParkManage.vue

@@ -4,24 +4,27 @@
       <Query :show="['time']" :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.guestName" placeholder="请输入车牌号"/>
+            <a-input style="width: 200px" v-model="queryData.guestName" placeholder="请输入车牌号"/>
           </a-form-model-item>
           
           <a-form-model-item label="订单状态" style="margin-left: 15px">
-            <a-select v-model="queryData.status" style="width: 250px">
+            <a-select v-model="queryData.status" style="width: 150px">
               <a-select-option v-for="(item,index) in statusOptions" :key="index" :value="item.value">
                 {{ item.label }}
               </a-select-option>
             </a-select>
           </a-form-model-item>
-          <div style="height: 20px"></div>
           <a-form-model-item label="支付方式" style="margin-left: 15px">
-            <a-select v-model="queryData.method" style="width: 250px">
+            <a-select v-model="queryData.method" style="width: 150px">
               <a-select-option v-for="(item,index) in methodOptions" :key="index" :value="item.value">
                 {{ item.label }}
               </a-select-option>
             </a-select>
           </a-form-model-item>
+          <!--<div style="height: 20px"></div>-->
+          <!--<a-form-model-item>-->
+          <!--  <div> </div>-->
+          <!--</a-form-model-item>-->
         </template>
       </Query>
     </div>
@@ -29,24 +32,24 @@
 
     <div class="accessManage-body">
 
-      <a-table :columns="tableColumns" :data-source="tableData" :pagination="false"
+      <a-table :columns="tableColumns" :data-source="tableData" :pagination="true"
                :scroll="{ y: tableContainerHeight }" bordered>
         <a-button slot="action" slot-scope="text" type="link" @click="()=>{showDetail=true}">
           查看
         </a-button>
       </a-table>
 
-      <div style="width: 100%;text-align: right;margin-top: 15px;">
-        <a-pagination ref="pagination"
-                      :showQuickJumper="true"
-                      :show-size-changer="true"
-                      :show-total="showTotal"
-                      v-model="currentPage"
-                      :default-current="1"
-                      :total="500"
-                      @showSizeChange="onShowSizeChange"
-        />
-      </div>
+      <!--<div style="width: 100%;text-align: right;margin-top: 15px;">-->
+      <!--  <a-pagination ref="pagination"-->
+      <!--                :showQuickJumper="true"-->
+      <!--                :show-size-changer="true"-->
+      <!--                :show-total="showTotal"-->
+      <!--                v-model="currentPage"-->
+      <!--                :default-current="1"-->
+      <!--                :total="500"-->
+      <!--                @showSizeChange="onShowSizeChange"-->
+      <!--  />-->
+      <!--</div>-->
     </div>
 
 
@@ -62,52 +65,62 @@
           <template #label>
             <span class="descriptions-item-label">车牌号</span>
           </template>
+
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">所属人员</span>
           </template>
+          沪B53467
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">固定车位</span>
           </template>
+          B101
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">停车时长</span>
           </template>
+          2h
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">停车费用</span>
           </template>
+          30元
         </a-descriptions-item>
 
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">实收金额</span>
           </template>
+          30元
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">订单状态</span>
           </template>
+          已支付
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">支付方式</span>
           </template>
+          微信
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">入场时间</span>
           </template>
+          2023/03/20 09:36:52
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">出场时间</span>
           </template>
+          2023/03/20 11:15:36
         </a-descriptions-item>
 
       </a-descriptions>
@@ -120,33 +133,37 @@
           <template #label>
             <span class="descriptions-item-label">入场通道</span>
           </template>
+          B1
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">出场通道</span>
           </template>
+          B2
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">入场收费员</span>
           </template>
+          张雪
         </a-descriptions-item>
         <a-descriptions-item >
           <template #label>
             <span class="descriptions-item-label">出场收费员</span>
           </template>
+          李佳佳
         </a-descriptions-item>
-        <a-descriptions-item >
-          <template #label>
-            <span class="descriptions-item-label">入场照片</span>
-          </template>
-        </a-descriptions-item>
+        <!--<a-descriptions-item >-->
+        <!--  <template #label>-->
+        <!--    <span class="descriptions-item-label">入场照片</span>-->
+        <!--  </template>-->
+        <!--</a-descriptions-item>-->
 
-        <a-descriptions-item >
-          <template #label>
-            <span class="descriptions-item-label">出场照片</span>
-          </template>
-        </a-descriptions-item>
+        <!--<a-descriptions-item >-->
+        <!--  <template #label>-->
+        <!--    <span class="descriptions-item-label">出场照片</span>-->
+        <!--  </template>-->
+        <!--</a-descriptions-item>-->
 
       </a-descriptions>
     </a-modal>

+ 80 - 16
src/components/scene/energy/sceneEnergyAircondition/airconditioningCard.vue

@@ -50,8 +50,22 @@
 
       <div style="display: inline-block;width: 50%;text-align: left">
         <a-space>
-          <a-button style="font-size: 12px" size="small" @click="allPowerOff"><a-icon type="poweroff" />全开</a-button>
-          <a-button style="font-size: 12px" size="small" @click="allPowerOn"><a-icon type="poweroff" />全关</a-button>
+          <a-popconfirm
+              title="确定要执行吗?"
+              ok-text="是"
+              cancel-text="否"
+              @confirm="allPowerOff"
+          >
+            <a-button style="font-size: 12px" size="small" ><a-icon type="poweroff" />全开</a-button>
+          </a-popconfirm>
+          <a-popconfirm
+              title="确定要执行吗?"
+              ok-text="是"
+              cancel-text="否"
+              @confirm="allPowerOn"
+          >
+            <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-space>
       </div>
@@ -522,6 +536,44 @@ export default {
             }
           ]
         },
+        {
+          label: '8F',
+          value: '8',
+          devices: [
+            {
+              id: '8101-1',
+              mode: 'hot',
+              tm: '26',
+              wind: '一级',
+              online: true
+            },{
+              id: '8101-2',
+              mode: 'hot',
+              tm: '26',
+              wind: '一级',
+              online: true
+            }
+          ]
+        },
+        {
+          label: '9F',
+          value: '9',
+          devices: [
+            {
+              id: '9101-1',
+              mode: 'hot',
+              tm: '26',
+              wind: '一级',
+              online: true
+            },{
+              id: '9101-2',
+              mode: 'hot',
+              tm: '26',
+              wind: '一级',
+              online: true
+            }
+          ]
+        },
       ]
     }
   },
@@ -581,22 +633,34 @@ export default {
       this.showCard = !this.showCard;
     },
     allPowerOn() {
-      this.floors.forEach(item=>{
-        if (item.devices) {
-          item.devices.forEach(i=>{
-            i.online = false
-          })
-        }
-      })
+      let app = this;
+      this.$store.loadingStore().open()
+      setTimeout(function () {
+        app.floors.forEach(item=>{
+          if (item.devices) {
+            item.devices.forEach(i=>{
+              i.online = false
+            })
+          }
+        })
+        app.$store.loadingStore().close()
+        app.$message.success('执行成功')
+      },2000)
     },
     allPowerOff() {
-      this.floors.forEach(item=>{
-        if (item.devices) {
-          item.devices.forEach(i=>{
-            i.online = true
-          })
-        }
-      })
+      let app = this;
+      this.$store.loadingStore().open()
+      setTimeout(function () {
+        app.floors.forEach(item=>{
+          if (item.devices) {
+            item.devices.forEach(i=>{
+              i.online = true
+            })
+          }
+        })
+        app.$store.loadingStore().close()
+        app.$message.success('执行成功')
+      },2000)
     }
   }
 }

+ 88 - 16
src/components/scene/energy/sceneEnergyAircondition/sceneWaterCard.vue

@@ -31,8 +31,22 @@
 
       <div style="display: inline-block;width: 50%;text-align: left">
         <a-space>
-          <a-button style="font-size: 12px" size="small" @click="allPowerOff"><a-icon type="poweroff" />全开</a-button>
-          <a-button style="font-size: 12px" size="small" @click="allPowerOn"><a-icon type="poweroff" />全关</a-button>
+          <a-popconfirm
+              title="确定要执行吗?"
+              ok-text="是"
+              cancel-text="否"
+              @confirm="allPowerOff"
+          >
+            <a-button style="font-size: 12px" size="small" ><a-icon type="poweroff" />全开</a-button>
+          </a-popconfirm>
+          <a-popconfirm
+              title="确定要执行吗?"
+              ok-text="是"
+              cancel-text="否"
+              @confirm="allPowerOff"
+          >
+            <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-space>
       </div>
@@ -449,6 +463,52 @@ export default {
             }
           ]
         },
+        {
+          label: '8F',
+          value: '8',
+          devices: [
+            {
+              id: '8101-1',
+              name: '饮水机',
+              sensor: '无',
+              waterNum: '700',
+              tm: '100',
+              status: '2',
+              online: true
+            },{
+              id: '8101-2',
+              name: '饮水机',
+              sensor: '无',
+              waterNum: '700',
+              tm: '100',
+              status: '2',
+              online: true
+            }
+          ]
+        },
+        {
+          label: '9F',
+          value: '9',
+          devices: [
+            {
+              id: '9101-1',
+              name: '饮水机',
+              sensor: '无',
+              waterNum: '700',
+              tm: '100',
+              status: '2',
+              online: true
+            },{
+              id: '9101-2',
+              name: '饮水机',
+              sensor: '无',
+              waterNum: '700',
+              tm: '100',
+              status: '2',
+              online: true
+            }
+          ]
+        },
       ]
     }
   },
@@ -500,22 +560,34 @@ export default {
       this.showCard = !this.showCard;
     },
     allPowerOn() {
-      this.floors.forEach(item=>{
-        if (item.devices) {
-          item.devices.forEach(i=>{
-            i.online = false
-          })
-        }
-      })
+      let app = this;
+      this.$store.loadingStore().open()
+      setTimeout(function () {
+        app.floors.forEach(item=>{
+          if (item.devices) {
+            item.devices.forEach(i=>{
+              i.online = false
+            })
+          }
+        })
+        app.$store.loadingStore().close()
+        app.$message.success('执行成功')
+      },2000)
     },
     allPowerOff() {
-      this.floors.forEach(item=>{
-        if (item.devices) {
-          item.devices.forEach(i=>{
-            i.online = true
-          })
-        }
-      })
+      let app = this;
+      this.$store.loadingStore().open()
+      setTimeout(function () {
+        app.floors.forEach(item=>{
+          if (item.devices) {
+            item.devices.forEach(i=>{
+              i.online = true
+            })
+          }
+        })
+        app.$store.loadingStore().close()
+        app.$message.success('执行成功')
+      },2000)
     }
   }
 }

+ 78 - 16
src/components/scene/energy/sceneEnergyAircondition/scenelightCard.vue

@@ -31,8 +31,24 @@
 
       <div style="display: inline-block;width: 50%;text-align: left">
         <a-space>
-          <a-button style="font-size: 12px" size="small" @click="allPowerOff"><a-icon type="poweroff" />全开</a-button>
-          <a-button style="font-size: 12px" size="small" @click="allPowerOn"><a-icon type="poweroff" />全关</a-button>
+          <a-popconfirm
+              title="确定要执行吗?"
+              ok-text="是"
+              cancel-text="否"
+              @confirm="allPowerOff"
+          >
+            <a-button style="font-size: 12px" size="small" ><a-icon type="poweroff" />全开</a-button>
+          </a-popconfirm>
+          <a-popconfirm
+              title="确定要执行吗?"
+              ok-text="是"
+              cancel-text="否"
+              @confirm="allPowerOff"
+          >
+            <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-space>
       </div>
@@ -453,6 +469,40 @@ export default {
             }
           ]
         },
+        {
+          label: '8F',
+          value: '8',
+          devices: [
+            {
+              id: '8101-1',
+              name: '环形灯',
+              sensor: '无',
+              online: true
+            },{
+              id: '8101-2',
+              name: '环形灯',
+              sensor: '无',
+              online: true
+            }
+          ]
+        },
+        {
+          label: '9F',
+          value: '9',
+          devices: [
+            {
+              id: '9101-1',
+              name: '环形灯',
+              sensor: '无',
+              online: true
+            },{
+              id: '9101-2',
+              name: '环形灯',
+              sensor: '无',
+              online: true
+            }
+          ]
+        },
       ]
     }
   },
@@ -504,22 +554,34 @@ export default {
       this.showCard = !this.showCard;
     },
     allPowerOn() {
-      this.floors.forEach(item=>{
-        if (item.devices) {
-          item.devices.forEach(i=>{
-            i.online = false
-          })
-        }
-      })
+      let app = this;
+      this.$store.loadingStore().open()
+      setTimeout(function () {
+        app.floors.forEach(item=>{
+          if (item.devices) {
+            item.devices.forEach(i=>{
+              i.online = false
+            })
+          }
+        })
+        app.$store.loadingStore().close()
+        app.$message.success('执行成功')
+      },2000)
     },
     allPowerOff() {
-      this.floors.forEach(item=>{
-        if (item.devices) {
-          item.devices.forEach(i=>{
-            i.online = true
-          })
-        }
-      })
+      let app = this;
+      this.$store.loadingStore().open()
+      setTimeout(function () {
+        app.floors.forEach(item=>{
+          if (item.devices) {
+            item.devices.forEach(i=>{
+              i.online = true
+            })
+          }
+        })
+        app.$store.loadingStore().close()
+        app.$message.success('执行成功')
+      },2000)
     }
   }
 }

+ 18 - 5
src/components/scene/meeting/chart/meetingPersonDistributeChart.vue

@@ -35,10 +35,21 @@ export default {
             radius: ['40%', '70%'],
             //avoidLabelOverlap: false,
             label: {
-              show: false,
-              formatter: params => {
-                let name = params.name;
-                return name
+              normal: {
+                show: true,
+                position: "outside",
+                align: "left",
+                /* padding: [-5, -40, 30, -10],  */
+                /* padding: [-50, -55, 0, -10],  */
+                padding: [0, -65],
+                formatter: "{b}\n\n{c}", //模板变量有 {a}、{b}、{c}、{d},分别表示系列名,数据名,数据值,百分比。{d}数据会根据value值计算百分比
+                textStyle: {
+                  align: "left",
+                  baseline: "middle",
+                  fontFamily: "PingFang SC",
+                  fontSize: 14,
+                  // color: "#FFF",
+                },
               },
             },
             emphasis: {
@@ -49,7 +60,9 @@ export default {
               }
             },
             labelLine: {
-              show: false
+              show: true,
+              length: 20,
+              length2: 60,
             },
             data: [
               { value: 104, name: '4人' },

+ 19 - 6
src/components/scene/meeting/chart/meetingTimeDistributeChart.vue

@@ -35,21 +35,34 @@ export default {
             radius: ['40%', '70%'],
             //avoidLabelOverlap: false,
             label: {
-              show: false,
-              formatter: params => {
-                let name = params.name;
-                return params.name
+              normal: {
+                show: true,
+                position: "outside",
+                align: "left",
+                /* padding: [-5, -40, 30, -10],  */
+                /* padding: [-50, -55, 0, -10],  */
+                padding: [0, -65],
+                formatter: "{b}\n\n{c}", //模板变量有 {a}、{b}、{c}、{d},分别表示系列名,数据名,数据值,百分比。{d}数据会根据value值计算百分比
+                textStyle: {
+                  align: "left",
+                  baseline: "middle",
+                  fontFamily: "PingFang SC",
+                  fontSize: 14,
+                  // color: "#FFF",
+                },
               },
             },
             emphasis: {
               label: {
-                show: false,
+                show: true,
                 fontSize: 40,
                 fontWeight: 'bold'
               }
             },
             labelLine: {
-              show: false
+              show: true,
+              length: 20,
+              length2: 60,
             },
             data: [
               { value: 104, name: '30分钟' },

+ 23 - 1
src/components/scene/meeting/config/meetingRoomDetails.vue

@@ -52,7 +52,29 @@
 export default {
   data() {
     return {
-      tableData: [],
+      tableData: [
+        {
+          name: '李思佳',
+          workNum: '335689',
+          dept: '业务一部',
+          company: '北京电信规划院',
+          faceStatus: '已采集'
+        },
+        {
+          name: '王峰',
+          workNum: '369152',
+          dept: '业务一部',
+          company: '北京电信规划院',
+          faceStatus: '已采集'
+        },
+        {
+          name: '张小蝶',
+          workNum: '548952',
+          dept: '业务一部',
+          company: '北京电信规划院',
+          faceStatus: '已采集'
+        },
+      ],
       columns: [
         {
           title: '姓名',

+ 1 - 1
src/components/scene/meeting/config/meetingRoomItem.vue

@@ -10,7 +10,7 @@
       <a-col :span="16">
         <div class="meetingRoomItem-devices">
           <div class="meetingRoomItem-device" :style="{backgroundColor: color.light}" v-for="device in obj.devices" :key="device.id">
-
+            <span class="anticon" style="color: white;font-size: 16px;padding: 2px"><a-icon style="color: white" :type="device.icon" /></span>
           </div>
         </div>
       </a-col>

+ 31 - 6
src/components/scene/meeting/config/meetingRooms.vue

@@ -29,7 +29,7 @@
             </a-divider>
           </div>
           <a-row :gutter="12">
-            <a-col :span="6"  v-for="room in floor.rooms" :key="room.id">
+            <a-col :lg="{span: 6}" :sm="{span: 6}" :xxl="{span: 4}"  v-for="room in floor.rooms" :key="room.id">
               <MeetingRoomItem :obj="room" />
             </a-col>
           </a-row>
@@ -89,7 +89,7 @@ export default {
               status: '1',
               time: 8,
               devices: [
-                {},{},{},{},{},{},{},{}
+                {icon: 'audio'},{icon: 'camera'},{icon: 'api'},{icon: 'control'},{icon: 'notification'},{icon: 'unlock'},{icon: 'safety-certificate'},
               ]
             },{
               id: 2,
@@ -98,7 +98,7 @@ export default {
               status: '1',
               time: 8,
               devices: [
-                {},{},{},{},{},{},{},{}
+                {icon: 'audio'},{icon: 'camera'},{icon: 'api'},{icon: 'control'},{icon: 'notification'},{icon: 'unlock'},{icon: 'safety-certificate'},
               ]
             },{
               id: 3,
@@ -107,7 +107,7 @@ export default {
               status: '2',
               time: 8,
               devices: [
-                {},{},{},{},{},{},{},{}
+                {icon: 'audio'},{icon: 'camera'},{icon: 'api'},{icon: 'control'},{icon: 'notification'},{icon: 'unlock'},{icon: 'safety-certificate'},
               ]
             },{
               id: 4,
@@ -116,7 +116,7 @@ export default {
               status: '3',
               time: 8,
               devices: [
-                {},{},{},{},{},{},{},{}
+                {icon: 'audio'},{icon: 'camera'},{icon: 'api'},{icon: 'control'},{icon: 'notification'},{icon: 'unlock'},{icon: 'safety-certificate'},
               ]
             }
           ]
@@ -131,7 +131,32 @@ export default {
               status: '1',
               time: 8,
               devices: [
-                {},{},{},{},{},{},{},{}
+                {icon: 'audio'},{icon: 'camera'},{icon: 'api'},{icon: 'control'},{icon: 'notification'},{icon: 'unlock'},{icon: 'safety-certificate'},
+              ]
+            },
+            {
+              id: 1,
+              name: '402会议室',
+              timeRange: ['9:00', '10:00'],
+              status: '1',
+              time: 8,
+              devices: [
+                {icon: 'audio'},{icon: 'camera'},{icon: 'api'},{icon: 'control'},{icon: 'notification'},{icon: 'unlock'},{icon: 'safety-certificate'},
+              ]
+            }
+          ]
+        },
+        {
+          floor: '5F',
+          rooms: [
+            {
+              id: 1,
+              name: '501会议室',
+              timeRange: ['9:00', '10:00'],
+              status: '1',
+              time: 8,
+              devices: [
+                {icon: 'audio'},{icon: 'camera'},{icon: 'api'},{icon: 'control'},{icon: 'notification'},{icon: 'unlock'},{icon: 'safety-certificate'},
               ]
             }
           ]

+ 3 - 2
src/components/security/alarm/map/imageMap.vue

@@ -3,7 +3,7 @@
     <img style="border-radius: 12px" :src="requireImg(src)"  width="100%">
 
     <template v-for="(item, index) in markers">
-      <div style="cursor: pointer" @click="viewCamera">
+      <div style="cursor: pointer" @click="showCamera(item.code)">
         <IconCamera :key="index"
                     :color="item.status==1?'#1890ff':item.status==2?'#ff4d4f':'#a2a4a2'"
                     style="position: absolute;cursor: pointer"
@@ -29,7 +29,8 @@ export default {
   },
   props: {
     markers: Array,
-    src: String
+    src: String,
+    showCamera: Function
   },
   mounted() {
   },

+ 28 - 2
src/components/security/alarm/securityAlarmMap.vue

@@ -46,9 +46,23 @@
       </div>
 
       <div class="securityAlarmMap-map">
-        <ImageMap :markers="devicePositions" :src="areaSrc" ></ImageMap>
+        <ImageMap :show-camera="handleCameraVisible" :markers="devicePositions" :src="areaSrc" ></ImageMap>
       </div>
     </Card>
+
+    <a-modal
+        title="实时预览"
+        v-if="showcamera"
+        :visible="showcamera"
+        width="800px"
+        @cancel="()=>{this.showcamera=false}"
+        :footer="null"
+    >
+      <div style="height: 450px">
+        <hkwsCamera />
+      </div>
+    </a-modal>
+
   </div>
 </template>
 
@@ -56,6 +70,7 @@
 import Card from "@/components/common/card.vue";
 import IconCamera from "@/assets/svg/IconCamera.vue";
 import ImageMap from "@/components/security/alarm/map/imageMap.vue";
+import hkwsCamera from "@/components/security/camera/hkwsCamera.vue";
 
 export default {
   data() {
@@ -63,6 +78,7 @@ export default {
       alarmNum: 0,
       floor: '1',
       areaSrc: 'security/area_1F.png',
+      showcamera: false,
       deviceNum: {
         online: 7,
         unline: 2,
@@ -73,6 +89,7 @@ export default {
           status: 1,
           left: 348,
           top: 27,
+          code: '123456'
         },{
           status: 1,
           left: 373,
@@ -117,10 +134,19 @@ export default {
     Card,
     IconCamera,
     ImageMap,
+    hkwsCamera,
   },
   mounted() {
   },
-  methods: {}
+  methods: {
+    handleCameraVisible(code) {
+      if (code && code!='') {
+        this.showcamera = true;
+      } else {
+        this.$message.warning('暂未获取到视频流')
+      }
+    }
+  }
 }
 </script>
 

+ 3 - 3
src/components/security/camera/hkwsCamera.vue

@@ -10,7 +10,7 @@ export default {
     return {
       jkInfo: {
         nameId: "playWnd1", // nameId 具有唯一性,否则无效,如果有多个,一定不能重复
-        cameraIndexCode: "4d43345c64744929b68e6a76678d60b1",  // 监控点编号
+        cameraIndexCode: "549136751cbd49798d3ee9368f9aae89",  // 监控点编号
       }
     }
   },
@@ -27,10 +27,10 @@ export default {
         layout: "1x1",
         enableHTTPS: 1,
         encryptedFields: 'secret',
-        showToolbar: 0,
+        showToolbar: 1,
         showSmart: 0,
         buttonIDs: "",
-        toolBarButtonIDs: "4098",
+        toolBarButtonIDs: "4098,4097",
       }
     }
   },

+ 1 - 0
src/components/security/common/securityDeviceSelect.vue

@@ -6,6 +6,7 @@
       <a-tree
           :expanded-keys="expandedKeys"
           :auto-expand-parent="true"
+          :selected-keys="['1-0']"
           :tree-data="treeData"
           :show-icon="true"
           @expand="onExpand"

+ 6 - 6
src/components/security/person/components/securityPersonExistChart.vue

@@ -65,19 +65,19 @@ export default {
             smooth: true,
             showSymbol:false,
             lineStyle: {
-              color: "#FF7C1F",
+              color: "#62CC97",
               width: 1,
             },
             itemStyle: {
-              color: '#FF7C1F'
+              color: '#62CC97'
             },
             areaStyle: {
               color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                 offset: 0,
-                color: '#FFD7AC' // 0% 处的颜色
-              }, {
-                offset: 1,
-                color: '#ffffff' // 100% 处的颜色
+                color: '#B0E5CB' // 0% 处的颜色
+              },{
+                offset: 0.8,
+                color: 'rgb(255,255,255,0.1)'
               }], false),
             },
             emphasis: {

+ 92 - 0
src/components/work/common/iocThreeFbx.vue

@@ -0,0 +1,92 @@
+<template>
+  <div id="ioc-model"></div>
+</template>
+<script>
+import * as THREE from "three";
+import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
+import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader";
+export default {
+  data() {
+    return {
+      camera: null,
+      scene: null,
+      renderer: null,
+      controls: null,
+      modelPath: "/ioc-models/21.fbx"
+    };
+  },
+  methods: {
+    init() {
+      let self = this;
+
+      let container = document.getElementById("ioc-model");
+      let mouse = new THREE.Vector2();
+      self.camera = new THREE.PerspectiveCamera(
+          45,
+          container.clientWidth / container.clientHeight,
+          0.01,
+          2000
+      );
+      self.camera.position.set(100, 200, 300);
+      self.scene = new THREE.Scene();
+      // ground
+      var mesh = new THREE.Mesh(
+          new THREE.PlaneBufferGeometry(2000, 2000),
+          new THREE.MeshPhongMaterial({ color: 0x999999, depthWrite: false })
+      );
+      mesh.rotation.x = -Math.PI / 2;
+      mesh.receiveShadow = true;
+      self.scene.add(mesh);
+
+      var grid = new THREE.GridHelper(2000, 20, 0x000000, 0x000000);
+      grid.material.opacity = 0.2;
+      grid.material.transparent = true;
+      self.scene.add(grid);
+
+      self.renderer = new THREE.WebGLRenderer({
+        antialias: true,
+        alpha: true,
+        precision: "highp"
+      });
+      self.renderer.setSize(container.clientWidth, container.clientHeight);
+      container.appendChild(self.renderer.domElement)
+
+      self.controls = new OrbitControls(self.camera, self.renderer.domElement);
+      self.controls.target.set(0, 100, 0);
+      self.controls.update();
+      var light = new THREE.HemisphereLight(0xffffff, 0x444444);
+      light.position.set(0, 200, 0);
+      self. scene.add(light);
+
+      light = new THREE.DirectionalLight(0xffffff);
+      light.position.set(0, 200, 100);
+      light.castShadow = true;
+      light.shadow.camera.top = 180;
+      light.shadow.camera.bottom = -100;
+      light.shadow.camera.left = -120;
+      light.shadow.camera.right = 120;
+      self.scene.add(light);
+      let fbxLoader = new FBXLoader();
+      fbxLoader.load(self.modelPath, function(object) {
+        self.scene.add(object);
+      });
+    },
+    animate() {
+      requestAnimationFrame(this.animate);
+      this.renderer.clear();
+      this.renderer.render(this.scene, this.camera);
+      this.renderer.clearDepth();
+    }
+  },
+  mounted() {
+    this.init();
+    this.animate();
+  }
+};
+</script>
+<style lang="less" scoped>
+#ioc-model {
+  height: 100%;
+  width: 100%;
+}
+</style>

+ 7 - 2
src/components/work/meeting/workMeeting.vue

@@ -44,7 +44,7 @@
                   </div>
                 </a-col>
                 <a-col :span="19">
-                  <timeline
+                  <timeline v-if="showMeetingLine"
                     v-for="(value, key, index) in meetingInfo"
                     :key="index"
                     :select="currCheckMeeting"
@@ -174,6 +174,7 @@ export default {
   data() {
     let timeRange = this.$util.dateUtil.getNearlyMonthRange();
     return {
+      showMeetingLine: false,
       timeArr: [
         {
           id: 0,
@@ -355,6 +356,7 @@ export default {
       );
     },
     getMeetingRecordData() {
+      this.showMeetingLine = false;
       let params = {};
       Object.assign(params, this.queryData);
       params.timeRange = this.$util.dateUtil.getCurrWeekRange();
@@ -370,7 +372,10 @@ export default {
           let obj = app.$moment(arr[i].startTime).format('yyyy/MM/DD')
           resultObj[obj].push(arr[i])
         }
-        this.meetingInfo = resultObj
+        this.meetingInfo = resultObj;
+        this.showMeetingLine = true;
+      }).catch(err=>{
+        this.showMeetingLine = true;
       })
 
     },

+ 23 - 7
src/components/work/overview/component/workRoomDistribute.vue

@@ -16,11 +16,11 @@
         <a-col  v-for="(floor, index) in roomList" :key="floor.floor" :sm="{span: 8}" :lg="{span: 6}" :xxl="{span: 4}">
           <div class="workRoomDistribute-list-item" >
             <div class="floor-floor"> 【{{ floor.floor }}层】 </div>
-            <div class="floor-area">
-              <div class="example-circle" :style="{backgroundColor: colors.leader}"></div>
-              <div class="example-desc">领导办公室</div>
-              <span class="floor-area-num">{{ floor.leader }}m²</span>
-            </div>
+            <!--<div class="floor-area">-->
+            <!--  <div class="example-circle" :style="{backgroundColor: colors.leader}"></div>-->
+            <!--  <div class="example-desc">领导办公室</div>-->
+            <!--  <span class="floor-area-num">{{ floor.leader }}m²</span>-->
+            <!--</div>-->
             <div class="floor-area">
               <div class="example-circle" :style="{backgroundColor: colors.meeting}"></div>
               <div class="example-desc">会议室</div>
@@ -29,12 +29,12 @@
             <div class="floor-area">
               <div class="example-circle" :style="{backgroundColor: colors.work}"></div>
               <div class="example-desc">工作区</div>
-              <span class="floor-area-num">{{ floor.leader }}m²</span>
+              <span class="floor-area-num">{{ floor.work }}m²</span>
             </div>
             <div class="floor-area">
               <div class="example-circle" :style="{backgroundColor: colors.print}"></div>
               <div class="example-desc">打印区</div>
-              <span class="floor-area-num">{{ floor.leader }}m²</span>
+              <span class="floor-area-num">{{ floor.print }}m²</span>
             </div>
           </div>
         </a-col>
@@ -46,6 +46,8 @@
 </template>
 
 <script>
+import ApiWorkFloor from "@/api/work/apiWorkFloor";
+
 export default {
   data() {
     return {
@@ -143,6 +145,20 @@ export default {
         print: '#ddff99',
       }
     }
+  },
+  props: {
+    queryData: Object
+  },
+  mounted() {
+    this.getData();
+  },
+  methods: {
+    getData() {
+      ApiWorkFloor.getFloorData(this.queryData).then(res=>{
+
+        this.roomList = res;
+      })
+    }
   }
 }
 </script>

+ 61 - 9
src/components/work/overview/workOverview.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="workOverview">
     <div class="page-query-core">
-      <query :show="['company','floor']" :query-data.sync="queryData" :reset="reset" :search="search"></query>
+      <query :show="['company','floor']" :floor-options="floorData" :query-data.sync="queryData" :reset="reset" :search="search"></query>
       <card :title="'核心指标'">
         <CoreData :data-list="coreData"></CoreData>
       </card>
@@ -13,7 +13,11 @@
           <div class="workOverview-room ioc-card-content">
             <card :title="'房间分布'">
               <div class="fjfbt" style="overflow-y: auto">
-                <WorkRoomDistribute/>
+                <WorkRoomDistribute v-if="showFloorData" :query-data="queryData" />
+                <div style="height: 670px;text-align: center"  v-else>
+                  <!--<iocThreeFbx  />-->
+                  <img :src="requireImg('security/area_1F.png')" style="border-radius: 12px" height="100%"/>
+                </div>
               </div>
             </card>
           </div>
@@ -25,7 +29,7 @@
                 <div style="color: #333333;display: inline-block;">当日门禁进出人员</div>
               </template>
               <template #title-extra>
-                <div class="total">400<span>人</span></div>
+                <div class="total">{{ listData.length }}<span>人</span></div>
               </template>
               <div class="workOverview-door-list">
                 <a-table :rowKey=" (record, index) => index"
@@ -48,21 +52,63 @@ import query from "@/components/common/query.vue";
 import card from "@/components/common/card.vue";
 import WorkRoomDistribute from "@/components/work/overview/component/workRoomDistribute.vue";
 import apiWorkFloor from "@/api/work/apiWorkFloor";
+import iocThreeFbx from "@/components/work/common/iocThreeFbx.vue";
+import {requireImg} from "@/utils/requireImg";
 
 export default {
   components: {
     query,
     card,
     WorkRoomDistribute,
+    iocThreeFbx,
   },
   data() {
     let timeRange = this.$util.dateUtil.getNearlyMonthRange()
     return {
+      showFloorData: true,
       queryData: {
         companyId: '0',
-        floorId: '1',
+        floorId: '-99',
         timeRange: timeRange
       },
+      floorData: [
+        {
+          value: '-99',
+          label: "全部"
+        },
+        {
+          value: -3,
+          label: "B3"
+        },
+        {
+          value: -2,
+          label: "B2"
+        },
+        {
+          value: -1,
+          label: "B1"
+        },
+        {
+          value: '1',
+          label: "1F"
+        },
+        {
+          value: 7,
+          label: "7F"
+        },
+        {
+          value: 8,
+          label: "8F"
+        },
+        {
+          value: 9,
+          label: "9F"
+        },
+        {
+          value: 21,
+          label: "21F"
+        }
+      ],
       columns: [
         //{title: "序号", dataIndex: "index", key: "1", width: 48},
         {title: "姓名", dataIndex: "name", key: "2", width: 70},
@@ -92,11 +138,11 @@ export default {
           title: "会议室面积(m²)",
           content: 0,
         },
-        {
-          type: 1,
-          title: "领导办公室面积(m²)",
-          content: 0,
-        },
+        //{
+        //  type: 1,
+        //  title: "领导办公室面积(m²)",
+        //  content: 0,
+        //},
         {
           type: 1,
           title: "其他区域面积(m²)",
@@ -109,6 +155,7 @@ export default {
     this.init();
   },
   methods: {
+    requireImg,
     init() {
       this.$util.asyncPromise(
           this.getCoreData(),
@@ -119,6 +166,11 @@ export default {
 
     },
     search() {
+      if (this.queryData.floorId != '-99') {
+        this.showFloorData = false
+      } else {
+        this.showFloorData = true
+      }
       this.$util.asyncPromise(
           this.getCoreData(),
           this.getDoorEnterPerson()

+ 102 - 21
src/views/LoginView.vue

@@ -6,7 +6,10 @@ export default {
   data() {
     return {
       userData,
+      activeTab: '1',
       loginLoading: false,
+      sendCodeLoading: false,
+      countdown: 0,
       form: {
         code: '',
         username: '',
@@ -15,6 +18,27 @@ export default {
       phoneForm: {
         code: '',
         phone: '',
+      },
+      formRules: {
+        username: [
+          { required: true, message: '请输入用户名', trigger: 'change' },
+          { required: true, message: '请输入用户名', trigger: 'blur' },
+        ],
+        password: [
+          { required: true, message: '请输入密码', trigger: 'change' },
+          { required: true, message: '请输入密码', trigger: 'blur' },
+          { min: 6, message: '密码至少6位', trigger: 'blur' },
+        ],
+      },
+      phoneFormRules: {
+        phone: [
+          { required: true, message: '请输入手机号', trigger: 'blur' },
+          { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' },
+        ],
+        code: [
+          { required: true, message: '请输入手机验证码', trigger: 'blur' },
+          { len: 6, message: '请正确输入6位验证码', trigger: 'blur' },
+        ],
       }
     }
   },
@@ -22,15 +46,56 @@ export default {
   },
   mounted() {
     this.GVerify = new GVerify("verify-code")
+    clearInterval(this.countdownInterval);
   },
   methods: {
     callback(key) {
-      //console.log(key);
+      this.activeTab = key;
+      if (key == '1') {
+        this.$nextTick(()=>{
+          this.GVerify = new GVerify("verify-code")
+        })
+      }
     },
     onChange(val) {
       console.log(val)
     },
     handleSubmit() {
+      if (this.activeTab == '2') {
+        this.$refs.phoneForm.validate(valid=>{
+          if (valid) {
+            this.phoneLogin();
+          }
+        })
+      } else {
+        this.$refs.form.validate(valid=>{
+          if (valid) {
+            this.login();
+          }
+        })
+      }
+    },
+    sendCode() {
+      clearInterval(this.countdownInterval);
+      let app = this;
+      this.$refs.phoneForm.validateField('phone', valid=>{
+        if (!valid) {
+          app.$message.success('发送成功')
+          app.sendCodeLoading = true;
+          app.countdown = 30;
+
+          app.countdownInterval = setInterval(function() {
+            app.countdown = app.countdown-1;
+            if (app.countdown === 0) {
+              clearInterval(app.countdownInterval);
+              app.sendCodeLoading = false;
+            }
+          }, 1000);
+        }
+      });
+
+    },
+    login() {
       let app = this;
       app.loginLoading = true;
       let valid = this.GVerify.validate(this.form.code)
@@ -49,6 +114,19 @@ export default {
         this.GVerify.refresh();
         app.loginLoading = false;
       }
+    },
+    phoneLogin() {
+      let app = this;
+      app.loginLoading = true;
+      apiLogin.phonelogin(this.phoneForm).then(res=>{
+        app.loginLoading = false;
+        app.$store.userStore().setToken(res.token);
+        app.$store.userStore().setUserInfo(res.userInfo);
+        app.$message.success("登录成功")
+        app.$router.push("/")
+      }).catch(err=>{
+        app.loginLoading = false;
+      })
     }
   },
 }
@@ -60,31 +138,31 @@ export default {
     <div class="loginDiv">
       <a-tabs default-active-key="1" @change="callback">
         <a-tab-pane key="1" tab="账户登录">
-          <div class="loginForm">
-            <a-form :form="form">
-              <a-form-item>
+          <div v-if="activeTab=='1'" class="loginForm">
+            <a-form-model ref="form" :model="form" :rules="formRules" >
+              <a-form-model-item prop="username">
                 <a-input v-model="form.username" style="height: 40px;letter-spacing: 1px" placeholder="账户/邮件账户" @keyup.enter.native="handleSubmit">
                   <a-icon slot="prefix" type="user" style="font-size: 16px;height: 25px;color: #a8a8a8;"/>
                 </a-input>
-              </a-form-item>
-              <a-form-item>
+              </a-form-model-item>
+              <a-form-model-item prop="password">
                 <a-input-password v-model="form.password" style="height: 40px;letter-spacing: 1px" placeholder="密码" @keyup.enter.native="handleSubmit">
                   <a-icon slot="prefix" type="lock" style="font-size: 16px;height: 23px;color: #a8a8a8"/>
                 </a-input-password>
-              </a-form-item>
-              <a-form-item>
+              </a-form-model-item>
+              <a-form-model-item>
                 <a-input v-model="form.code" placeholder="请输入验证码" :maxLength="4" @keyup.enter.native="handleSubmit"
                          style="width: 200px;height: 32px;display: inline-block;vertical-align: middle;letter-spacing: 2px"/>
                 <div id="verify-code" title="点击更换"></div>
-              </a-form-item>
-              <a-form-item>
+              </a-form-model-item>
+              <a-form-model-item>
                 <div style="height: 20px"></div>
                 <a-button type="primary" @click="handleSubmit" :loading="loginLoading"
                           style="width: 100%;height: 32px;font-size: 17px;letter-spacing: 5px">
                   登录
                 </a-button>
-              </a-form-item>
-            </a-form>
+              </a-form-model-item>
+            </a-form-model>
             <div class="form-bottom">
               <a-checkbox @change="onChange" style="float: left;margin-top: 5px">
                 记住密码
@@ -94,9 +172,9 @@ export default {
           </div>
         </a-tab-pane>
         <a-tab-pane key="2" tab="手机登录" force-render>
-          <div class="loginForm">
-            <a-form :form="phoneForm">
-              <a-form-item>
+          <div v-if="activeTab=='2'" class="loginForm">
+            <a-form-model ref="phoneForm" :model="phoneForm" :rules="phoneFormRules">
+              <a-form-model-item has-feedback prop="phone">
                 <a-input v-model="phoneForm.phone" style="height: 40px;" placeholder="手机号">
                   <template #prefix>
                     <span class="anticon" style="font-size: 16px;height: 25px;color: #a8a8a8;">
@@ -104,12 +182,15 @@ export default {
                     </span>
                   </template>
                 </a-input>
-              </a-form-item>
-              <a-form-item>
+              </a-form-model-item>
+              <a-form-model-item prop="code">
                 <a-input v-model="phoneForm.code" placeholder="请输入验证码"
-                         style="width: 240px;height: 32px;display: inline-block;vertical-align: middle"/>
-                <a-button style="width: 100px">发送验证码</a-button>
-              </a-form-item>
+                         style="width: 200px;height: 32px;display: inline-block;vertical-align: middle"/>
+                <a-button style="width: 140px" @click="sendCode" :disabled="sendCodeLoading">
+                  <span v-if="!sendCodeLoading">发送验证码</span>
+                  <span v-if="sendCodeLoading">{{ countdown }}s 后重新发送</span>
+                </a-button>
+              </a-form-model-item>
               <a-form-item>
                 <div style="height: 20px"></div>
                 <a-button type="primary" @click="handleSubmit"
@@ -117,7 +198,7 @@ export default {
                   登录
                 </a-button>
               </a-form-item>
-            </a-form>
+            </a-form-model>
           </div>
         </a-tab-pane>
       </a-tabs>