From 9bfd32ac0781b51d2b8479b91a9754f18060fcb9 Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期四, 14 十一月 2024 17:48:50 +0800
Subject: [PATCH] ll

---
 screen/src/assets/images/LogisticsCenter/map_car_lixian@2x.png   |    0 
 screen/src/api/index.js                                          |   12 +
 screen/src/utils/request.js                                      |    7 
 screen/src/views/LogisticsEfficiency.vue                         |  166 ++++++++++++++--
 screen/vite.config.js                                            |    4 
 screen/src/assets/images/LogisticsCenter/car_lixian@2x.png       |    0 
 screen/src/assets/images/LogisticsCenter/map_car_zaitu@2x.png    |    0 
 screen/src/assets/images/LogisticsCenter/car_kongxian@2x.png     |    0 
 screen/src/views/SecurityControl.vue                             |  375 +++++++++++++++++++++++--------------
 screen/src/assets/images/LogisticsCenter/car_zaitu@2x.png        |    0 
 screen/src/assets/images/LogisticsCenter/map_car_kongxian@2x.png |    0 
 screen/src/views/TaskEfficiency.vue                              |    4 
 12 files changed, 390 insertions(+), 178 deletions(-)

diff --git a/screen/src/api/index.js b/screen/src/api/index.js
index 9a19320..ee208df 100644
--- a/screen/src/api/index.js
+++ b/screen/src/api/index.js
@@ -113,17 +113,25 @@
 export const getVisitRetentionData = (data) => {
   return request('visitsAdmin/cloudService/board/api/security/visitRetentionData', data)
 }
+// 瀹夐槻绠℃帶澶у睆 璁垮婊炵暀鎯呭喌
+export const visitSecurityData = (data) => {
+  return request('visitsAdmin/cloudService/board/api/security/visitSecurityData', data)
+}
 // 瀹夐槻绠℃帶澶у睆 璁垮鍒嗘瀽
 export const afgetVisitData = (data) => {
   return request('visitsAdmin/cloudService/board/api/security/getVisitData', data)
 }
 // 瀹夐槻绠℃帶澶у睆 鍖哄煙闆嗗悎
 export const afregionList = (data) => {
-  return request('visitsAdmin/cloudService/board/api/security/regionList', data)
+  return request('visitsAdmin/cloudService/board/api/security/regionList', data, "POST")
 }
 // 瀹夐槻绠℃帶澶у睆 鏍戝瀷鍖哄煙闆嗗悎
 export const afregionTreea = (data) => {
-  return request('visitsAdmin/cloudService/board/api/security/regionList', data)
+  return request('visitsAdmin/cloudService/board/api/security/regionList', data, "POST")
+}
+// 瀹夐槻绠℃帶澶у睆 鏍规嵁code鑾峰彇鍦板潃
+export const afgetCarmeraPreviemUrl = (data) => {
+  return request('visitsAdmin/cloudService/board/api/security/getCarmeraPreviemUrl', data)
 }
 // 瀹夐槻绠℃帶澶у睆 鍛婅
 export const afwarningEventData = (data) => {
diff --git a/screen/src/assets/images/LogisticsCenter/car_kongxian@2x.png b/screen/src/assets/images/LogisticsCenter/car_kongxian@2x.png
new file mode 100644
index 0000000..4b88ea3
--- /dev/null
+++ b/screen/src/assets/images/LogisticsCenter/car_kongxian@2x.png
Binary files differ
diff --git a/screen/src/assets/images/LogisticsCenter/car_lixian@2x.png b/screen/src/assets/images/LogisticsCenter/car_lixian@2x.png
new file mode 100644
index 0000000..bc75d5f
--- /dev/null
+++ b/screen/src/assets/images/LogisticsCenter/car_lixian@2x.png
Binary files differ
diff --git a/screen/src/assets/images/LogisticsCenter/car_zaitu@2x.png b/screen/src/assets/images/LogisticsCenter/car_zaitu@2x.png
new file mode 100644
index 0000000..4640d4b
--- /dev/null
+++ b/screen/src/assets/images/LogisticsCenter/car_zaitu@2x.png
Binary files differ
diff --git a/screen/src/assets/images/LogisticsCenter/map_car_kongxian@2x.png b/screen/src/assets/images/LogisticsCenter/map_car_kongxian@2x.png
new file mode 100644
index 0000000..38bff78
--- /dev/null
+++ b/screen/src/assets/images/LogisticsCenter/map_car_kongxian@2x.png
Binary files differ
diff --git a/screen/src/assets/images/LogisticsCenter/map_car_lixian@2x.png b/screen/src/assets/images/LogisticsCenter/map_car_lixian@2x.png
new file mode 100644
index 0000000..42ffa31
--- /dev/null
+++ b/screen/src/assets/images/LogisticsCenter/map_car_lixian@2x.png
Binary files differ
diff --git a/screen/src/assets/images/LogisticsCenter/map_car_zaitu@2x.png b/screen/src/assets/images/LogisticsCenter/map_car_zaitu@2x.png
new file mode 100644
index 0000000..7efde5a
--- /dev/null
+++ b/screen/src/assets/images/LogisticsCenter/map_car_zaitu@2x.png
Binary files differ
diff --git a/screen/src/utils/request.js b/screen/src/utils/request.js
index 490faed..a20accf 100644
--- a/screen/src/utils/request.js
+++ b/screen/src/utils/request.js
@@ -18,11 +18,12 @@
 
 export default instance
 
-export const request = (url, data) => {
+export const request = (url, data, method = 'GET') => {
   return instance({
     url: url,
-    method: 'GET',
-    params: { ...data }
+    method: method || 'GET',
+    params: method == 'GET' ? { ...data } : null,
+    data: method == 'POST' ? { ...data } : null
   })
 }
 
diff --git a/screen/src/views/LogisticsEfficiency.vue b/screen/src/views/LogisticsEfficiency.vue
index a04ca3b..1d043b5 100644
--- a/screen/src/views/LogisticsEfficiency.vue
+++ b/screen/src/views/LogisticsEfficiency.vue
@@ -89,14 +89,19 @@
                   <span class="item addr">鏀惰揣鍗曚綅</span>
                   <span class="item time">浠诲姟寮�濮嬫椂闂�</span>
                 </div>
-                <div class="line" v-for="item in dataList3">
-                  <span class="item flag"><span :class="{ flag_bg: item.type == 1 || item.type == 3 }">{{ item.type == 1
-                    || item.type == 3 ? '鍑�' : '鍏�' }}</span></span>
-                  <span class="item order">{{ item.billCode || item.contractNum }}</span>
-                  <span class="item id_card">{{ item.carCodeFront }}</span>
-                  <span class="item status">{{ statusMap[item.status].label }}</span>
-                  <span class="item addr">{{ item.repertotyAddress }}</span>
-                  <span class="item time" v-if="item.confirmTaskDate">{{ item.confirmTaskDate.slice(5, 16) }}</span>
+                <div class="one-swiper list_temp">
+                  <div class="swiper-wrapper">
+                    <div class="line swiper-slide one-swiper-slide" v-for="item in dataList3">
+                      <span class="item flag"><span :class="{ flag_bg: item.type == 1 || item.type == 3 }">{{ item.type
+                        == 1
+                        || item.type == 3 ? '鍑�' : '鍏�' }}</span></span>
+                      <span class="item order">{{ item.billCode || item.contractNum }}</span>
+                      <span class="item id_card">{{ item.carCodeFront }}</span>
+                      <span class="item status">{{ statusMap[item.status].label }}</span>
+                      <span class="item addr">{{ item.repertotyAddress }}</span>
+                      <span class="item time" v-if="item.confirmTaskDate">{{ item.confirmTaskDate.slice(5, 16) }}</span>
+                    </div>
+                  </div>
                 </div>
               </div>
             </div>
@@ -223,10 +228,12 @@
                 <Percent v-if="data1.stockTotal && data1.stockMax"
                   :rate="((data1.stockTotal / data1.stockMax) * 100).toFixed(0)" />
               </div>
-              <div class="list">
-                <div class="item" v-for="item in dataList6">
-                  <div class="la">{{ item.name }}</div>
-                  <div class="val">{{ item.num }}涓囨敮</div>
+              <div class="list two-swiper">
+                <div class="swiper-wrapper">
+                  <div class="item two-swiper-slide swiper-slide" v-for="item in dataList6">
+                    <div class="la">{{ item.name }}</div>
+                    <div class="val">{{ item.num }}涓囨敮</div>
+                  </div>
                 </div>
               </div>
             </div>
@@ -300,6 +307,9 @@
 import dayjs from 'dayjs'
 import * as echarts from 'echarts'
 import ahJSON from '@/assets/anhui.json'
+import icKongxian from '@/assets/images/LogisticsCenter/map_car_kongxian@2x.png'
+import icLixian from '@/assets/images/LogisticsCenter/map_car_lixian@2x.png'
+import icZaitu from '@/assets/images/LogisticsCenter/map_car_zaitu@2x.png'
 import {
   wlcenterData,
   wljobData,
@@ -308,6 +318,8 @@
   wltotalInList,
   wltransportMeasure,
 } from '@/api'
+import 'swiper/css/swiper.min.css'
+import Swiper from 'swiper'
 
 const colors = ['#FEAF01', '#01ABFE', '#51F9E4']
 const weekMap = ['鏄熸湡鏃�', '鏄熸湡涓�', '鏄熸湡浜�', '鏄熸湡涓�', '鏄熸湡鍥�', '鏄熸湡浜�', '鏄熸湡鍏�',]
@@ -524,6 +536,66 @@
 const initMap = () => {
   var myChart = echarts.init(echartMap.value)
   echarts.registerMap('js', ahJSON)
+  var scatterData = [
+    {
+      name: '骞煎効鍥�',
+      num: 15,
+      color: ['#1984ff', '#184b8d'],
+      img: icKongxian,
+      data: [
+        { name: '鑵惧啿甯�', value: [117.25, 31.49] },
+      ],
+    },
+    {
+      name: '灏忓',
+      num: 11,
+      color: ['#f16c08', '#7f3710'],
+      img: icLixian,
+      data: [
+        { name: '鑵惧啿甯�', value: [118.5, 31.08] },
+      ],
+    }
+  ]
+  let serData = []
+  scatterData.forEach((item) => {
+    serData.push({
+      name: `${item.name}`,
+      type: 'effectScatter',
+      coordinateSystem: 'geo',
+      effectType: 'ripple',
+      showEffectOn: 'render',
+      // 鏁g偣鏍峰紡
+      rippleEffect: {
+        period: 1,
+        scale: 1,
+        brushType: 'fill'
+      },
+      // 鏁g偣澶у皬 鑷畾涔夋暎鐐瑰浘鐗�
+      // symbol: `image://${item.img}`,
+      symbol: `image://${item.img}`,
+      label: {
+        show: true,
+        formatter: '{b|{b}}',
+        position: 'top',
+        distance: -1,
+        rich: {
+          b: {
+            color: "#fff",
+            fontSize: 14,
+            height: 30,
+            // width: 200,
+            padding: 5,
+          },
+        }
+      },
+      symbolSize: [24, 30],
+      hoverAnimation: true,
+
+      zlevel: 99,
+      data: item.data,
+    })
+  }
+  )
   var center = {
     '鍚堣偉甯�': [117.25, 31.83],
     '婊佸窞甯�': [118.32, 32.3],
@@ -570,7 +642,6 @@
         color: '#ffffff'
       }
     },
-
     tooltip: {
       trigger: 'item',
       formatter: function (params) {
@@ -668,18 +739,19 @@
         },
         itemStyle: {
           normal: {
-            borderColor: '#2980b9',
+            borderColor: '#428598',
             borderWidth: 1,
             areaColor: '#1d3b60'
           },
           emphasis: {
             areaColor: '#FA8C16',
-            borderWidth: 0,
-            color: 'green'
+            borderWidth: 1,
+            color: '#428598'
           }
         },
         data: data
-      }
+      },
+      ...serData,
     ]
   }
 
@@ -736,6 +808,7 @@
   wlplatformJobList().then(res => {
     const result = res.data
     dataList3.value = result
+    loopFn1()
   })
 }
 const data4 = ref({})
@@ -770,6 +843,33 @@
   wlstockList().then(res => {
     const result = res.data
     dataList6.value = result
+    loopFn2()
+  })
+}
+
+const autoplayFlag = (list = [], leng = 4, time = 2000) => {
+  if (list.length > leng) {
+    return { delay: time, disableOnInteraction: false }
+  } else {
+    return false
+  }
+}
+const loopFn1 = () => {
+  var newSwiper1 = new Swiper('.one-swiper', {
+    initialSlide: 0,
+    direction: 'vertical', //绔栫洿鏂瑰悜
+    slidesPerView: 7,
+    autoplay: autoplayFlag(dataList3.value, 7, 2000),
+    observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiperiper
+  })
+}
+const loopFn2 = () => {
+  var newSwiper1 = new Swiper('.two-swiper', {
+    initialSlide: 0,
+    direction: 'vertical', //绔栫洿鏂瑰悜
+    slidesPerView: 7,
+    autoplay: autoplayFlag(dataList6.value, 7, 2000),
+    observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiperiper
   })
 }
 onMounted(() => {
@@ -789,6 +889,10 @@
 <style lang="scss" scoped>
 div {
   box-sizing: border-box;
+}
+
+.swiper-wrapper {
+  display: block !important;
 }
 
 .main_content {
@@ -901,10 +1005,15 @@
       .list_wrap {
         padding: 10px 0;
 
+        .list_temp {
+          height: 210px !important;
+          overflow: hidden;
+        }
+
         .list {
           .line {
             display: flex;
-            height: 30px;
+            height: 30px !important;
             align-items: center;
             padding: 0 10px;
             font-size: 12px;
@@ -1224,7 +1333,7 @@
 
           .item {
             width: 100%;
-            height: 36px;
+            height: 36px !important;
             display: flex;
             align-items: center;
 
@@ -1526,34 +1635,41 @@
         color: #D2E0FF;
         padding: 10px;
         margin-bottom: 10px;
+
         .head {
           display: flex;
           justify-content: space-between;
           align-items: center;
           height: 36px;
           line-height: 36px;
-          border-bottom: 1px solid rgba(255,255,255,0.16);
+          border-bottom: 1px solid rgba(255, 255, 255, 0.16);
           margin-bottom: 10px;
+
           .code {
             font-weight: 500;
             font-size: 14px;
             color: #00F2F3;
           }
         }
-        .line{
+
+        .line {
           display: flex;
           align-items: center;
           margin-bottom: 8px;
-          &:nth-last-child(1){
+
+          &:nth-last-child(1) {
             margin-bottom: 0;
           }
-          .name{
+
+          .name {
             flex: 4;
           }
-          .num{
+
+          .num {
             flex: 3;
           }
-          .val{
+
+          .val {
             color: #fff;
           }
         }
diff --git a/screen/src/views/SecurityControl.vue b/screen/src/views/SecurityControl.vue
index 4953e4a..282403c 100644
--- a/screen/src/views/SecurityControl.vue
+++ b/screen/src/views/SecurityControl.vue
@@ -43,11 +43,10 @@
               <div class="rate">
                 <div class="la">
                   <span>杞︿綅浣跨敤鐜�</span>
-                  <span v-if="data.inParkCarTotal && data.parkingLotTotal" class="num">{{ ((data.inParkCarTotal /
-                    data.parkingLotTotal) * 100).toFixed(0) }}%</span>
+                  <span v-if="data.inParkCarTotal && data.parkingLotTotal" class="num">{{ data.parkingUseRate }}%</span>
                 </div>
                 <div class="val">
-                  <Percent :rate="((data.inParkCarTotal / data.parkingLotTotal) * 100).toFixed(0)" />
+                  <Percent :rate="data.parkingUseRate" />
                 </div>
               </div>
             </div>
@@ -89,7 +88,7 @@
             <div class="car_static">
               <div class="echart_wrap">
                 <div class="pie_text">
-                  <div class="fs30"><strong v-if="data.visitJobCarTotal">{{ data.internalJobCarTotal +
+                  <div class="fs30"><strong v-if="data.visitJobCarTotal || data.visitJobCarTotal == 0">{{ data.internalJobCarTotal +
                     data.relatedJobCarTotal + data.visitJobCarTotal }}</strong></div>
                   <div>璐ц溅</div>
                 </div>
@@ -111,30 +110,30 @@
           <div v-if="showJk" class="jiankong">
             <img class="jk_bg" src="@/assets/images/SecurityControl/jiankong_bg@2x.png" alt="">
             <div class="content">
-              <div class="video"></div>
+              <video :src="activeVideo" class="video"></video>
             </div>
             <div class="right_wrap">
               <div class="menus">
                 <div class="search_wrap">
                   <img class="search" src="@/assets/images/SecurityControl/ic_search@2x.png" alt="">
-                  <input v-model="dataValue5" @input="getData5" class="input" type="text" placeholder="鎼滅储鐩戞帶鍚嶇О">
+                  <input v-model="dataValue5" @blur="getData5" @keyup.enter="getData5" class="input" type="text" placeholder="鎼滅储鐩戞帶鍚嶇О">
                 </div>
                 <div class="menu_wrap">
                   <div class="menu" v-for="menu, i in data5">
                     <div class="menu_name" @click="menuClick(i)">
                       <div class="name">{{ menu.name }}</div>
-                      <!-- <img v-if="activeJkIndex == i" class="open" src="@/assets/images/SecurityControl/ar_close@2x.png"
+                      <img v-if="activeJkIndex == i" class="open" src="@/assets/images/SecurityControl/ar_close@2x.png"
                         alt="">
-                      <img v-else class="icon" src="@/assets/images/SecurityControl/ar_open@2x.png" alt=""> -->
+                      <img v-else class="icon" src="@/assets/images/SecurityControl/ar_open@2x.png" alt="">
                     </div>
-                    <!-- <div v-if="activeJkIndex == i" class="list">
-                      <div class="item" @click="menuItemClick(item.name)" v-for="item in menu.childen">
-                        <img v-if="activeMenu == item.name" class="icon"
+                    <div v-if="activeJkIndex == i" class="list">
+                      <div class="item" @click="menuItemClick(item)" v-for="item in menu.carmeraList">
+                        <img v-if="activeMenu.indexCode == item.indexCode" class="icon"
                           src="@/assets/images/SecurityControl/ic_jiankong_sel@2x.png" alt="">
                         <img v-else class="icon" src="@/assets/images/SecurityControl/ic_jiankon.png" alt="">
-                        <span :class="{ active: activeMenu == item.name }">{{ item.name }}</span>
+                        <span :class="{ active: activeMenu.indexCode == item.indexCode }">{{ item.name }}</span>
                       </div>
-                    </div> -->
+                    </div>
                   </div>
 
                 </div>
@@ -161,7 +160,7 @@
                   <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt="">
                 </div>
                 <div class="num_wrap">
-                  <div class="num">{{ data.inParkCarTotal }}</div>
+                  <div class="num">{{ data.internalCarTotal }}</div>
                   <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt="">
                 </div>
               </div>
@@ -171,7 +170,7 @@
                   <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt="">
                 </div>
                 <div class="num_wrap">
-                  <div class="num">{{ data.deviceTotal }}</div>
+                  <div class="num">{{ data2 }}</div>
                   <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt="">
                 </div>
               </div>
@@ -181,7 +180,7 @@
                   <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt="">
                 </div>
                 <div class="num_wrap">
-                  <div class="num">{{ data.errTotal }}</div>
+                  <div class="num">{{ warningNum }}</div>
                   <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt="">
                 </div>
               </div>
@@ -208,24 +207,25 @@
                 <img src="@/assets/images/SecurityControl/staff_ic_neibu@2x.png" alt="">
                 <div class="content">
                   <div class="name">鍐呴儴鍛樺伐</div>
-                  <div class="num" v-if="data.internalTotal && data.inParkTotal"><span>{{ data.internalTotal }}</span> |
-                    {{ ((data.internalTotal / data.inParkTotal) * 100).toFixed(1) }}%</div>
+                  <div class="num"><span>{{ data.internalTotal || 0 }}</span> |
+                    {{ data.inParkTotal ? ((data.internalTotal / data.inParkTotal) * 100).toFixed(1) : 0 }}%</div>
                 </div>
               </div>
               <div class="item">
                 <img src="@/assets/images/SecurityControl/staff_ic_xiangguanfang@2x.png" alt="">
                 <div class="content">
                   <div class="name">闀挎湡鐩稿叧鏂�</div>
-                  <div class="num today" v-if="data.relatedTotal && data.inParkTotal"><span>{{ data.relatedTotal
-                      }}</span> | {{ ((data.relatedTotal / data.inParkTotal) * 100).toFixed(1) }}%</div>
+                  <div class="num today"><span>{{ data.relatedTotal || 0
+                      }}</span> | {{ data.inParkTotal ? ((data.relatedTotal / data.inParkTotal) * 100).toFixed(1) : 0
+                    }}%</div>
                 </div>
               </div>
               <div class="item">
                 <img src="@/assets/images/SecurityControl/staff_ic_fangke@2x.png" alt="">
                 <div class="content">
                   <div class="name">鍦ㄥ洯璁垮</div>
-                  <div class="num finish" v-if="data.visitTotal && data.inParkTotal"><span>{{ data.visitTotal }}</span>
-                    | {{ ((data.visitTotal / data.inParkTotal) * 100).toFixed(1) }}%</div>
+                  <div class="num finish"><span>{{ data.visitTotal || 0 }}</span>
+                    | {{ data.inParkTotal ? ((data.visitTotal / data.inParkTotal) * 100).toFixed(1) : 0 }}%</div>
                 </div>
               </div>
             </div>
@@ -314,11 +314,11 @@
               <div>瀹夐槻鍛婅</div>
             </div>
             <div class="tabs">
-              <div class="tab active">鍏ㄩ儴</div>
+              <div class="tab" :class="{ active: warningTab == '0' }" @click="tasClick('0')">鍏ㄩ儴</div>
               <div class="separate"></div>
-              <div class="tab">鍖哄煙鍛婅</div>
+              <div class="tab" :class="{ active: warningTab == '1' }" @click="tasClick('1')">鍖哄煙鍛婅</div>
               <div class="separate"></div>
-              <div class="tab">琛屼负鍛婅</div>
+              <div class="tab" :class="{ active: warningTab == '2' }" @click="tasClick('2')">琛屼负鍛婅</div>
             </div>
             <img src="@/assets/images/title@2x.png" class="bg" alt="" />
           </div>
@@ -329,17 +329,17 @@
                   <img :src="item.img" class="avatar" alt="">
                   <div class="content">
                     <div class="header">
-                      <div class="name">{{item.title}}</div>
-                      <div class="have_time">宸茬粡鍙戠敓{{item.haveTime}}</div>
+                      <div class="name">{{ item.title }}</div>
+                      <div class="have_time">宸茬粡鍙戠敓{{ item.haveTime }}</div>
                     </div>
                     <div class="wrap">
                       <div class="line addr">
                         <img class="icon" src="@/assets/images/SecurityControl/xiaofang_ic_weizhi@2x.png" alt="">
-                        <span>{{item.addr}}</span>
+                        <span>{{ item.addr }}</span>
                       </div>
                       <div class="line time">
                         <img class="icon" src="@/assets/images/SecurityControl/clock.png" alt="">
-                        <span>{{item.createDate}}</span>
+                        <span>{{ item.createDate }}</span>
                       </div>
                     </div>
                   </div>
@@ -391,18 +391,23 @@
                 <div>绂荤嚎鏁�</div>
                 <div>鍦ㄧ嚎鐜�</div>
               </div>
-              <template v-for="item, i in dataList2">
-                <div class="line">
-                  <div class="driver">{{ item.deviceType }}</div>
-                  <div>{{ item.totalNum }}</div>
-                  <div>{{ item.onlineNum }}</div>
-                  <div>{{ item.offlineDeviceNum }}</div>
-                  <div>{{ item.totalNum ? ((item.onlineNum / item.totalNum) * 100).toFixed(0) : 0 }}%
-                  </div>
+              <div class="list two-swiper">
+                <div class="swiper-wrapper">
+                  <template v-for="item, i in dataList2">
+                    <div class="item two-swiper-slide swiper-slide">
+                      <div class="line">
+                        <div class="driver">{{ item.deviceType }}</div>
+                        <div>{{ item.totalNum }}</div>
+                        <div>{{ item.onlineNum }}</div>
+                        <div>{{ item.offlineDeviceNum }}</div>
+                        <div>{{ item.totalNum ? ((item.onlineNum / item.totalNum) * 100).toFixed(0) : 0 }}%
+                        </div>
+                      </div>
+                      <div class="separate"></div>
+                    </div>
+                  </template>
                 </div>
-                <div class="separate"></div>
-              </template>
-
+              </div>
             </div>
           </div>
         </div>
@@ -420,14 +425,19 @@
               <div class="dept">鎷滆閮ㄩ棬</div>
               <div class="dept">瓒呮椂鏃堕暱</div>
             </div>
-            <template v-for="item in dataList3">
-              <div class="line">
-                <div>{{ item.name }}</div>
-                <div class="dept">{{ item.companyName }}</div>
-                <div class="dept">{{ item.timeOutMinuteT }}</div>
+            <div class="three-swiper list">
+              <div class="swiper-wrapper">
+                <div class="item swiper-slide three-swiper-slide" v-for="item in dataList3">
+                  <div class="line">
+                    <div>{{ item.name }}</div>
+                    <div class="dept">{{ item.companyName }}</div>
+                    <div class="dept">{{ item.timeOutMinuteT }}</div>
+                  </div>
+                  <div class="separate"></div>
+                </div>
               </div>
-              <div class="separate"></div>
-            </template>
+            </div>
+
           </div>
         </div>
       </div>
@@ -445,7 +455,16 @@
 import * as echarts from 'echarts'
 import 'swiper/css/swiper.min.css'
 import Swiper from 'swiper'
-import { getEnergyCenterData,afwarningEventData, getSecurityDeviceData, getVisitRetentionData, afgetVisitData, afregionTreea } from '@/api'
+import {
+  getEnergyCenterData,
+  afgetCarmeraPreviemUrl,
+  afwarningEventData,
+  getSecurityDeviceData,
+  getVisitRetentionData,
+  afgetVisitData,
+  afregionTreea,
+  visitSecurityData
+} from '@/api'
 
 
 const weekMap = ['鏄熸湡鏃�', '鏄熸湡涓�', '鏄熸湡浜�', '鏄熸湡涓�', '鏄熸湡鍥�', '鏄熸湡浜�', '鏄熸湡鍏�',]
@@ -459,41 +478,6 @@
 
 }, 1000)
 
-const showJk = ref(true)
-const activeJkIndex = ref(0)
-const activeMenu = ref('')
-const jkList = ref([
-  {
-    name: '鏈堝彴鍖�',
-    childen: [
-      { name: '鏈堝彴1', id: 0 },
-      { name: '鏈堝彴2', id: 0 },
-      { name: '鏈堝彴3', id: 0 },
-    ]
-  },
-  {
-    name: '鍔炲叕妤�',
-    childen: []
-  },
-  {
-    name: '鍘傛埧',
-    childen: []
-  },
-  {
-    name: '澶ч棬',
-    childen: []
-  },
-])
-const menuClick = (val) => {
-  if (val == activeJkIndex.value) {
-    activeJkIndex.value = -1
-  } else {
-    activeJkIndex.value = val
-  }
-}
-const menuItemClick = (val) => {
-  activeMenu.value = val
-}
 
 
 const arr = ['#68e2e3', '#50afd3', '#377cdb', '#d5ae3a']
@@ -608,7 +592,7 @@
           show: false,
           position: 'center'
         },
-        padAngle: 5,
+        padAngle: 3,
         itemStyle: {
           borderRadius: 10
         },
@@ -658,10 +642,10 @@
       color: '#61d3f9'
     }])]
   const data = []
-  data.push({ name: '寰呰闂�', value: data4.value.waitVisitNum, rate: data4.value.waitVisitRata })
-  data.push({ name: '宸茬櫥璁�', value: data4.value.registerVisitNum, rate: data4.value.registerVisitRata })
-  data.push({ name: '宸茬寮�', value: data4.value.levelNum, rate: data4.value.levelRata })
-  data.push({ name: '婊炵暀', value: data4.value.retentionNum, rate: data4.value.retentionRata })
+  data.push({ name: '寰呰闂�', value: data4.value.waitVisitNum, rate: data4.value.waitVisitNum / data4.value.total })
+  data.push({ name: '宸茬櫥璁�', value: data4.value.registerVisitNum, rate: data4.value.registerVisitNum / data4.value.total  })
+  data.push({ name: '宸茬寮�', value: data4.value.levelNum, rate: data4.value.levelNum / data4.value.total  })
+  data.push({ name: '婊炵暀', value: data4.value.retentionNum, rate: data4.value.retentionNum / data4.value.total  })
   const option = {
     color: colors,
     tooltip: {
@@ -722,7 +706,7 @@
         label: {
           show: true,
           position: 'outside',
-          formatter: '{a|{b}}  {a|{c}%}',
+          formatter: '{a|{b}}  {a|{d}%}',
           rich: {
             a: {
               color: '#869CC9',
@@ -766,70 +750,130 @@
 const data = ref({})
 const getData1 = () => {
   getEnergyCenterData().then(res => {
-    const result = res.data
-    data.value = result
-    initEchart1()
+    if (res.code == 200) {
+      const result = res.data
+      data.value = result
+      initEchart1()
+    }
   })
 }
 
 const dataList2 = ref([])
+const data2 = ref(0)
 const dataListT2 = ref([])
 const getData2 = () => {
   getSecurityDeviceData().then(res => {
-    if(res.code == 200 && res.data && res.data.length > 0){
+    if (res.code == 200 && res.data && res.data.length > 0) {
       const result = res.data
-    let temp = []
-    let online = 0
-    let outline = 0
-    dataList2.value = result.map(item => {
-      online += item.onlineNum
-      outline += item.offlineDeviceNum
-      return item
-    })
-    if (online >= outline) {
-      temp.push({ name: '鍦ㄧ嚎', value: online, rate: ((online / (online + outline)) * 100).toFixed(1) })
-      temp.push({ name: '绂荤嚎', value: outline, rate: ((outline / (online + outline)) * 100).toFixed(1) })
-    } else {
-      temp.push({ name: '绂荤嚎', value: outline, rate: ((outline / (online + outline)) * 100).toFixed(1) })
-      temp.push({ name: '鍦ㄧ嚎', value: online, rate: ((online / (online + outline)) * 100).toFixed(1) })
-    }
+      let temp = []
+      let online = 0
+      let outline = 0
+      let total = 0
+      dataList2.value = result.map(item => {
+        total += item.totalNum
+        online += item.onlineNum
+        outline += item.offlineDeviceNum
+        if (item.deviceType && item.deviceType.length > 6) {
+          item.deviceType = item.deviceType.slice(0, 6) + '...'
+        }
+        return item
+      })
+      data2.value = total
+      if (online >= outline) {
+        temp.push({ name: '鍦ㄧ嚎', value: online, rate: ((online / (online + outline)) * 100).toFixed(1) })
+        temp.push({ name: '绂荤嚎', value: outline, rate: ((outline / (online + outline)) * 100).toFixed(1) })
+      } else {
+        temp.push({ name: '绂荤嚎', value: outline, rate: ((outline / (online + outline)) * 100).toFixed(1) })
+        temp.push({ name: '鍦ㄧ嚎', value: online, rate: ((online / (online + outline)) * 100).toFixed(1) })
+      }
 
-    dataListT2.value = temp
+      dataListT2.value = temp
     }
-    
     initEchart2()
+    loopFn2()
   })
 }
 
 const dataList3 = ref([])
+const data4 = ref({})
 const getData3 = () => {
-  getVisitRetentionData().then(res => {
-    const result = res.data || []
+  visitSecurityData().then(res => {
+    if( !res.code == 200) return
+    data4.value = res.data || {}
+    let obj = data4.value
+    data4.value.total = obj.levelNum + obj.retentionNum + obj.registerVisitNum + obj.waitVisitNum    
+    const result = res.data.visitRetentionDataList || []
     dataList3.value = result.map(i => {
-      i.timeOutMinuteT = dayjs.duration(i.timeOutMinute * 60 * 1000).format('HH:mm')
+      if (i.timeOutMinute) {
+        i.timeOutMinute = Math.abs(i.timeOutMinute)
+      }
+      if (i.timeOutMinute > 60 * 24) {
+        i.timeOutMinuteT = dayjs.duration(i.timeOutMinute * 60 * 1000).format('D澶〩鏃秏鍒�')
+      } else if (i.timeOutMinute > 60) {
+        i.timeOutMinuteT = dayjs.duration(i.timeOutMinute * 60 * 1000).format('H鏃秏鍒�')
+      } else {
+        i.timeOutMinuteT = item.timeOutMinuteT + '鍒�'
+      }
+
       return i
     })
-  })
-}
-const data4 = ref({})
-const getData4 = () => {
-  afgetVisitData().then(res => {
-    const result = res.data || {}
-    data4.value = result
     initEchart3()
+    loopFn3()
   })
-}
 
+  // getVisitRetentionData().then(res => {
+  //   const result = res.data || []
+  //   dataList3.value = result.map(i => {
+  //     if (i.timeOutMinute) {
+  //       i.timeOutMinute = Math.abs(i.timeOutMinute)
+  //     }
+  //     if (i.timeOutMinute > 60 * 24) {
+  //       i.timeOutMinuteT = dayjs.duration(i.timeOutMinute * 60 * 1000).format('D澶〩鏃秏鍒�')
+  //     } else if (i.timeOutMinute > 60) {
+  //       i.timeOutMinuteT = dayjs.duration(i.timeOutMinute * 60 * 1000).format('H鏃秏鍒�')
+  //     } else {
+  //       i.timeOutMinuteT = item.timeOutMinuteT + '鍒�'
+  //     }
+
+  //     return i
+  //   })
+  //   loopFn3()
+  // })
+}
+// const data4 = ref({})
+// const getData4 = () => {
+//   afgetVisitData().then(res => {
+//     const result = res.data || {}
+//     data4.value = result
+//     initEchart3()
+//   })
+// }
+
+const warningTab = ref('0')
+const warningNum = ref(0)
 const warningList = ref([])
 const getWarning = () => {
-  afwarningEventData({type: 0}).then(res => {
-    const result = res.data || []
+  afwarningEventData({ type: warningTab.value }).then(res => {
+    if (!res.data) return
+    const result = res.data.list || []
+    warningNum.value = res.data.total
     warningList.value = result.map(item => {
       item.haveTime = dayjs.duration(new Date().getTime() - new Date(item.createDate).getTime()).format('HH灏忔椂mm鍒嗛挓')
       return item
     })
+    // loopFn1()
   })
 }
+const tasClick = (val) => {
+  warningTab.value = val
+  getWarning()
+}
+
+
+const showJk = ref(false)
+const activeJkIndex = ref(0)
+const activeMenu = ref({})
+const activeVideo = ref('')
 const dataValue5 = ref('')
 const data5 = ref([])
 const getData5 = () => {
@@ -838,7 +882,20 @@
     withCameras: 1
   }).then(res => {
     const result = res.data || []
-    data5.value = result
+    data5.value = result.filter(item => item.carmeraList && item.carmeraList.length > 0)
+  })
+}
+const menuClick = (val) => {
+  if (val == activeJkIndex.value) {
+    activeJkIndex.value = -1
+  } else {
+    activeJkIndex.value = val
+  }
+}
+const menuItemClick = (val) => {
+  activeMenu.value = val
+  afgetCarmeraPreviemUrl({ indexCode: val.indexCode }).then(res => {
+    activeVideo.value = res.data
   })
 }
 
@@ -851,26 +908,23 @@
 }
 const loopFn1 = () => {
   var newSwiper1 = new Swiper('.one-swiper', {
-    // initialSlide: 0,
+    initialSlide: 0,
     loop: true, // 寰幆妯″紡閫夐」
-    // direction: 'vertical', //绔栫洿鏂瑰悜
-    slidesPerView: 2,
+    direction: 'vertical', //绔栫洿鏂瑰悜
+    slidesPerView: 1,
     slidesPerGroup: 2,
     slidesPerColumn: 2,
     // autoplay: { delay: 500, disableOnInteraction: false },
-    autoplay: autoplayFlag(dataList2.value, 2, 2000),
+    autoplay: warningList.value.length > 2 ? { delay: 500, disableOnInteraction: false } : false,
     observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
   })
 }
-loopFn1()
 const loopFn2 = () => {
   var newSwiper1 = new Swiper('.two-swiper', {
     initialSlide: 0,
-    // loop: true, // 寰幆妯″紡閫夐」
     direction: 'vertical', //绔栫洿鏂瑰悜
     slidesPerView: 3,
-    // autoplay: { delay: 500, disableOnInteraction: false },
-    autoplay: autoplayFlag(dataList2.value, 3, 4000),
+    autoplay: autoplayFlag(dataList2.value, 3, 2000),
     observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
   })
 }
@@ -881,7 +935,7 @@
     direction: 'vertical', //绔栫洿鏂瑰悜
     slidesPerView: 3,
     // autoplay: { delay: 500, disableOnInteraction: false },
-    autoplay: autoplayFlag(dataList2.value, 3, 4000),
+    autoplay: autoplayFlag(dataList3.value, 3, 4000),
     observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
   })
 }
@@ -892,7 +946,7 @@
   getData1()
   getData2()
   getData3()
-  getData4()
+  // getData4()
   getData5()
   getWarning()
 
@@ -906,9 +960,11 @@
 div {
   box-sizing: border-box;
 }
+
 .swiper-wrapper {
-    display: block !important;
-  }
+  display: block !important;
+}
+
 .main_content {
   display: flex;
   padding: 20px 25px 0;
@@ -1134,8 +1190,8 @@
         padding: 16px 0px 32px 20px;
 
         .video {
+          width: 100%;
           height: 100%;
-          border: 1px solid;
         }
       }
 
@@ -1174,8 +1230,9 @@
 
           .menu_wrap {
             margin-top: 15px;
-            max-height: 400px;
-              overflow: auto;
+            max-height: 440px;
+            overflow: auto;
+
             .menu {
               .menu_name {
                 display: flex;
@@ -1199,16 +1256,17 @@
               .list {
                 .item {
                   display: flex;
-                  align-items: center;
-                  height: 34px;
+                  /* align-items: center; */
                   margin-left: 10px;
                   cursor: pointer;
                   color: #D2E0FF;
+                  margin-top: 8px;
 
                   .icon {
                     width: 15px;
                     height: 14px;
                     margin-right: 8px;
+                    margin-top: 2px;
                   }
 
                   .active {
@@ -1473,6 +1531,7 @@
   .safe_warning {
     width: 786px;
     margin-right: 20px;
+
     /* one-swiper */
     .list {
       height: 124px;
@@ -1481,13 +1540,21 @@
       scrollbar-width: none;
       display: flex;
       flex-wrap: wrap;
-      
+      margin-left: 20px;
+
       .item {
         width: 366px;
         /* width: 50%; */
-        height: 102px;
+        float: left;
+        height: 102px !important;
         font-size: 13px;
         color: #D2E0FF;
+        margin-right: 10px;
+
+        &:nth-of-type(2n) {
+          margin-right: 0;
+        }
+
         .item_wrap {
           height: 90px;
           padding: 10px;
@@ -1630,14 +1697,25 @@
       }
 
       .table {
+        .list {
+          height: 102px !important;
+          overflow: auto;
+
+          .item {
+            height: 34px !important;
+          }
+        }
+
         .line {
+          height: 32px !important;
+
           div {
             justify-content: flex-end;
             padding-right: 10px;
           }
 
           .driver {
-            flex: 4;
+            flex: 5;
             justify-content: center;
           }
         }
@@ -1686,6 +1764,15 @@
     width: 360px;
 
     .table {
+      .list {
+        height: 102px !important;
+        overflow: auto;
+
+        .item {
+          height: 34px !important;
+        }
+      }
+
       .line {
         div {
           .dept {
diff --git a/screen/src/views/TaskEfficiency.vue b/screen/src/views/TaskEfficiency.vue
index 442c916..fc9f8c0 100644
--- a/screen/src/views/TaskEfficiency.vue
+++ b/screen/src/views/TaskEfficiency.vue
@@ -603,9 +603,9 @@
         label: {
           show: true,
           position: 'outside',
-          // formatter: '{a|{b}}  {a|{c}%}',
-          formatter: params => {
+          formatter: (params) => {
             return `{a|${params.data.name} ${params.data.rate}%}`
+            // return `<div>${params.data.name}</div>`
           },
           rich: {
             a: {
diff --git a/screen/vite.config.js b/screen/vite.config.js
index 1afa5c0..f4a5d19 100644
--- a/screen/vite.config.js
+++ b/screen/vite.config.js
@@ -25,9 +25,9 @@
   server: {
     proxy: {
       "/gateway_interface": {
-        // target: "http://192.168.0.103:10010",
+        target: "http://192.168.0.103:10010",
         // target: "http://10.50.250.253:8088/gateway_interface",
-        target: "http://192.168.0.173/gateway_interface",
+        // target: "http://192.168.0.173/gateway_interface",
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/gateway_interface/, ""),
       },

--
Gitblit v1.9.3