From 53b6400ec10c8ca61ccec91c82c358d2488eead8 Mon Sep 17 00:00:00 2001 From: jiangping <jp@doumee.com> Date: 星期五, 20 十二月 2024 09:50:39 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- screen/src/views/SecurityControl.vue | 1332 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 1,250 insertions(+), 82 deletions(-) diff --git a/screen/src/views/SecurityControl.vue b/screen/src/views/SecurityControl.vue index e2188dc..17f7c0a 100644 --- a/screen/src/views/SecurityControl.vue +++ b/screen/src/views/SecurityControl.vue @@ -3,7 +3,7 @@ <div class="main_app"> <img src="@/assets/images/SecurityControl/bg@2x.png" class="main_bg" alt="" /> <div class="main_header"> - <img src="@/assets/images/maintitle@2x.png" class="main_header_bg" alt="" /> + <img src="@/assets/images/maintitle.gif" class="main_header_bg" alt="" /> <div class="title">瀹夋嘲鏅烘収鐗╂祦鍥尯-瀹夐槻鏅鸿兘鐩戞祴</div> <div class="time_wrap"> <span class="date">{{ date }}</span> @@ -19,7 +19,7 @@ <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> <div>瀹炴椂鍥尯杞﹁締</div> </div> - <img src="@/assets/images/title@2x.png" class="bg" alt="" /> + <img src="@/assets/images/task/title@2x.png" class="bg" alt="" /> </div> <div class="second_title"> <div class="title"> @@ -28,25 +28,25 @@ </div> <div class="num_wrap"> <div class="la">鎬昏溅浣嶏細</div> - <div class="val">100</div> + <div class="val">{{ data.parkingLotTotal }}</div> </div> </div> <div class="stall_static"> <div class="residue"> <div class="la">鍓╀綑杞︿綅</div> - <div class="val">50</div> + <div class="val">{{ data.freeParkingLot }}</div> </div> <div class="total"> <div class="la">杞︿綅鎬绘暟</div> - <div class="val">50</div> + <div class="val">{{ data.parkingLotTotal }}</div> </div> <div class="rate"> <div class="la"> <span>杞︿綅浣跨敤鐜�</span> - <span class="num">50%</span> + <span class="num">{{ data.parkingUseRate }}%</span> </div> <div class="val"> - <Percent :rate="50" /> + <Percent :rate="data.parkingUseRate" /> </div> </div> </div> @@ -58,21 +58,27 @@ </div> <div class="private_car"> <div class="item"> - <img src="" class="icon" alt=""> - <div class="num">20</div> + <img class="icon" src="@/assets/images/SecurityControl/car_yuangong@2x.png" alt=""> + <div class="num">{{ data.internalCarTotal }}</div> <div class="name">鍛樺伐杞﹁締</div> </div> <div class="item"> - <img src="" class="icon" alt=""> - <div class="num">20</div> + <img class="icon" src="@/assets/images/SecurityControl/car_xiangguanfang@2x.png" alt=""> + <div class="num num2">{{ data.relatedCarTotal }}</div> <div class="name">鐩稿叧鏂硅溅杈�</div> + </div> <div class="item"> - <img src="" class="icon" alt=""> - <div class="num">20</div> + <img class="icon" src="@/assets/images/SecurityControl/car_laifang@2x.png" alt=""> + <div class="num num3">{{ data.visitCarTotal }}</div> <div class="name">鏉ヨ杞﹁締</div> </div> </div> + <!-- <div class="section"> + <div class="item" :style="{ flex: data.internalCarTotal }"></div> + <div class="item" :style="{ flex: data.relatedCarTotal }"></div> + <div class="item" :style="{ flex: data.visitCarTotal }"></div> + </div> --> <div class="second_title"> <div class="title"> <img src="@/assets/images/SecurityControl/ic_title_green@2x.png" class="icon" alt="" /> @@ -82,39 +88,64 @@ <div class="car_static"> <div class="echart_wrap"> <div class="pie_text"> - <div class="fs30"><strong>300</strong></div> + <div class="fs30"><strong v-if="data.visitJobCarTotal || data.visitJobCarTotal == 0">{{ + data.internalJobCarTotal + + data.relatedJobCarTotal + data.visitJobCarTotal }}</strong></div> <div>璐ц溅</div> </div> <div class="echart" id="echart1"></div> </div> <div class="list"> - <div class="item"> + <div class="item" v-for="item, i in dataList1"> <div class="line"> - <div :style="{ background: colors[0] }" class="icon"></div> - <div class="text">鍐呰繍杞﹁締</div> + <div :style="{ background: colors[i] }" class="icon"></div> + <div class="text">{{ item.name }}</div> </div> - <div :style="{ color: colors[0] }" class="num">100</div> - </div> - <div class="item"> - <div class="line"> - <div :style="{ background: colors[1] }" class="icon"></div> - <div class="text">澶栧崗杩愯緭杞﹁締</div> - </div> - <div :style="{ color: colors[1] }" class="num">100</div> - </div> - <div class="item"> - <div class="line"> - <div :style="{ background: colors[2] }" class="icon"></div> - <div class="text">甯傚叕鍙稿嵏璐ц溅杈�</div> - </div> - <div :style="{ color: colors[2] }" class="num">100</div> + <div :style="{ color: colors[i] }" class="num">{{ item.value }}</div> </div> </div> </div> </div> </div> <div class="center_box"> - <div class="center_box_one"> + <div v-show="showJk" class="jiankong"> + <img class="jk_bg" src="@/assets/images/SecurityControl/jiankong_bg@2x.png" alt=""> + <div class="content"> + <Video v-if="showJk && activeMenu && activeMenu.indexCode" :href="data.videoPluginUrl" :indexCode="activeMenu.indexCode" /> + <!-- <div class="player_bg" style="width: 100%;height: 100%;" id="playWnd"> </div> --> + </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" @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" + 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)" 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.indexCode == item.indexCode }">{{ item.name }}</span> + </div> + </div> + </div> + + </div> + + </div> + </div> + + </div> + <div v-show="!showJk" class="center_box_one"> <div class="list"> <div class="item"> <div class="name_wrap"> @@ -122,7 +153,7 @@ <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt=""> </div> <div class="num_wrap"> - <div class="num">200</div> + <div class="num">{{ data.inParkTotal }}</div> <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> </div> </div> @@ -132,7 +163,7 @@ <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt=""> </div> <div class="num_wrap"> - <div class="num">200</div> + <div class="num">{{ data.internalCarTotal }}</div> <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> </div> </div> @@ -142,7 +173,7 @@ <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt=""> </div> <div class="num_wrap"> - <div class="num">200</div> + <div class="num">{{ data2 }}</div> <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> </div> </div> @@ -152,7 +183,7 @@ <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt=""> </div> <div class="num_wrap"> - <div class="num">200</div> + <div class="num">{{ warningNum }}</div> <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> </div> </div> @@ -166,7 +197,7 @@ <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> <div>鍦ㄥ洯浜哄憳鍒嗘瀽</div> </div> - <img src="@/assets/images/title@2x.png" class="bg" alt="" /> + <img src="@/assets/images/task/title@2x.png" class="bg" alt="" /> </div> <div class="second_title"> <div class="title"> @@ -179,21 +210,25 @@ <img src="@/assets/images/SecurityControl/staff_ic_neibu@2x.png" alt=""> <div class="content"> <div class="name">鍐呴儴鍛樺伐</div> - <div class="num"><span>1000</span> | 66.6%</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"><span>1000</span> | 66.6%</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"><span>1000</span> | 66.6%</div> + <div class="num finish"><span>{{ data.visitTotal || 0 }}</span> + | {{ data.inParkTotal ? ((data.visitTotal / data.inParkTotal) * 100).toFixed(1) : 0 }}%</div> </div> </div> </div> @@ -207,15 +242,15 @@ <div class="item"> <div class="name">寰呰闂�</div> <div class="num_wrap"> - <span class="num">22</span> + <span class="num">{{ data4.waitVisitNum }}</span> <span>浜�</span> </div> </div> <div class="spacing"></div> <div class="item"> - <div class="name">宸茬櫥鏈�</div> + <div class="name">宸茬櫥璁�</div> <div class="num_wrap"> - <span class="num">22</span> + <span class="num">{{ data4.registerVisitNum }}</span> <span>浜�</span> </div> </div> @@ -223,7 +258,7 @@ <div class="item"> <div class="name">宸茬寮�</div> <div class="num_wrap"> - <span class="num">22</span> + <span class="num">{{ data4.levelNum }}</span> <span>浜�</span> </div> </div> @@ -231,11 +266,12 @@ <div class="item"> <div class="name">婊炵暀</div> <div class="num_wrap"> - <span class="num">22</span> + <span class="num">{{ data4.retentionNum }}</span> <span>浜�</span> </div> </div> </div> + <div class="echart3" id="echart3"></div> </div> <div class="right_box_two"> @@ -245,18 +281,224 @@ </div> </div> </div> + <div class="main_footer"> + <!-- <div class="car_warning"> + <div class="com_header"> + <div class="title"> + <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> + <div>褰撳墠杞﹁締婊炵暀棰勮</div> + </div> + <img src="@/assets/images/task/title@2x.png" class="bg" alt="" /> + </div> + <div class="table"> + <div class="line header"> + <div>杞︾墝</div> + <div class="dept">鎷滆閮ㄩ棬</div> + <div class="time">瓒呮椂鏃堕暱</div> + </div> + <div class="line"> + <div>鐨朅33234</div> + <div class="dept">缁煎悎绠$悊绉�</div> + <div class="time">10:21</div> + </div> + <div class="separate"></div> + <div class="line"> + <div>鐨朅33234</div> + <div class="dept">缁煎悎绠$悊绉�</div> + <div class="time">10:21</div> + </div> + <div class="separate"></div> + </div> + </div> --> + <div class="safe_warning"> + <div class="com_header"> + <div class="title"> + <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> + <div>瀹夐槻鍛婅</div> + </div> + <div class="tabs"> + <div class="tab" :class="{ active: warningTab == '0' }" @click="tasClick('0')">鍏ㄩ儴</div> + <div class="separate"></div> + <div class="tab" :class="{ active: warningTab == '1' }" @click="tasClick('1')">鍖哄煙鍛婅</div> + <div class="separate"></div> + <div class="tab" :class="{ active: warningTab == '2' }" @click="tasClick('2')">琛屼负鍛婅</div> + </div> + <img src="@/assets/images/task/title@2x.png" class="bg" alt="" /> + </div> + <div class="one_swiper_wrap"> + <div class="list one-swiper"> + <div class="swiper-wrapper"> + <div class="one-swiper-slide swiper-slide item" v-for="item in warningList"> + <div class="item_wrap"> + <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> + <div class="wrap"> + <div class="line addr"> + <img class="icon" src="@/assets/images/SecurityControl/xiaofang_ic_weizhi@2x.png" alt=""> + <span>{{ item.addr }}</span> + </div> + <div class="line time"> + <img class="icon" src="@/assets/images/SecurityControl/clock.png" alt=""> + <span>{{ item.createDate }}</span> + </div> + </div> + </div> + </div> + <div v-if="item.title0 && item.createDate0" class="item_wrap"> + <img :src="item.img0" class="avatar" alt=""> + <div class="content"> + <div class="header"> + <div class="name">{{ item.title0 }}</div> + <div class="have_time">宸茬粡鍙戠敓{{ item.haveTime0 }}</div> + </div> + <div class="wrap"> + <div class="line addr"> + <img class="icon" src="@/assets/images/SecurityControl/xiaofang_ic_weizhi@2x.png" alt=""> + <span>{{ item.addr0 }}</span> + </div> + <div class="line time"> + <img class="icon" src="@/assets/images/SecurityControl/clock.png" alt=""> + <span>{{ item.createDate0 }}</span> + </div> + </div> + </div> + </div> + </div> + <div v-if="warningList.length == 0" class="empty_wrap"> + <img src="@/assets/images/default_empty.png" alt=""> + </div> + </div> + </div> + + </div> + + </div> + <div class="garden_warning"> + <div class="com_header"> + <div class="title"> + <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> + <div>鍥尯瀹夐槻璁惧</div> + </div> + <img src="@/assets/images/task/title@2x.png" class="bg" alt="" /> + </div> + <div class="monitoring" @click="changeMon"> + <img src="@/assets/images/SecurityControl/ic_jiankong@2x.png" class="icon" alt=""> + <div>鐩戞帶鍒楄〃</div> + <img v-if="showJk" src="@/assets/images/SecurityControl/jiankong_ic_close@2x.png" class="top" alt=""> + <img v-else src="@/assets/images/SecurityControl/jiankong_ic_open@2x.png" class="top" alt=""> + </div> + <div class="content"> + <div class="sa_static"> + <div class="echart_wrap"> + <div class="pie_text"> + <div class="fs30"><strong v-if="dataListT2 && dataListT2.length == 2">{{ dataListT2[0].value + + dataListT2[1].value }}</strong></div> + <div>鎬昏</div> + </div> + <div class="echart" id="echart2"></div> + </div> + <div class="list"> + <div class="item" v-for="item, i in dataListT2"> + <div class="line"> + <div :style="{ background: colors[i] }" class="icon"></div> + <div class="text">{{ item.name }}</div> + </div> + <div :style="{ color: colors[i] }" class="num">{{ item.value }} | {{ item.rate }}%</div> + </div> + + </div> + </div> + <div class="table"> + <div class="line header"> + <div class="driver">璁惧绫诲瀷</div> + <div>鎬绘暟</div> + <div>鍦ㄧ嚎鏁�</div> + <div>绂荤嚎鏁�</div> + <div>鍦ㄧ嚎鐜�</div> + </div> + <div class="list two-swiper"> + <div class="swiper-wrapper"> + <template v-for="item, i in dataList2.filter(i => i.total > 0)"> + <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> + </div> + </div> + </div> + <div class="visitor_warning"> + <div class="com_header"> + <div class="title"> + <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> + <div>浠婃棩璁垮婊炵暀鎯呭喌</div> + </div> + <img src="@/assets/images/task/title@2x.png" class="bg" alt="" /> + </div> + <div class="table"> + <div class="line header"> + <div>濮撳悕</div> + <div class="dept">鎷滆閮ㄩ棬</div> + <div class="dept">瓒呮椂鏃堕暱</div> + </div> + <div v-if="dataList3.length > 0" 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> + <div v-if="dataList3.length == 0" class="empty_wrap"> + <img src="@/assets/images/default_empty.png" alt=""> + </div> + </div> + </div> + </div> </div> </v-scale-screen> </template> <script setup> -import { ref, onMounted } from 'vue' +import { ref, onMounted, nextTick } from 'vue' import VScaleScreen from 'v-scale-screen' import Percent from '@/components/percent.vue' import dayjs from 'dayjs' - +import duration from 'dayjs/plugin/duration' +dayjs.extend(duration) import * as echarts from 'echarts' -const colors = ['#FEAF01', '#01ABFE', '#51F9E4'] +import 'swiper/css/swiper.min.css' +import Swiper from 'swiper' +import Video from './videoUrl/Video.vue' +import { + getEnergyCenterData, + afgetCarmeraPreviemUrl, + afwarningEventData, + getSecurityDeviceData, + getVisitRetentionData, + afgetVisitData, + afregionTreea, + visitSecurityData +} from '@/api' + + const weekMap = ['鏄熸湡鏃�', '鏄熸湡涓�', '鏄熸湡浜�', '鏄熸湡涓�', '鏄熸湡鍥�', '鏄熸湡浜�', '鏄熸湡鍏�',] const date = ref(dayjs().format('YYYY.MM.DD')) const week = ref(weekMap[new Date().getDay()]) @@ -329,8 +571,18 @@ myChart.resize() }) } + +const dataList1 = ref([]) const initEchart1 = () => { const myChart = echarts.init(document.getElementById('echart1')) + const temp = [] + temp.push({ name: '鍐呰繍杞﹁締', value: data.value.internalJobCarTotal }) + temp.push({ name: '澶栧崗杩愯緭杞﹁締', value: data.value.relatedJobCarTotal }) + temp.push({ name: '甯傚叕鍙稿嵏璐ц溅杈�', value: data.value.visitJobCarTotal }) + temp.sort((a, b) => { + return a.value - b.value + }) + dataList1.value = temp const option = { series: [ { @@ -348,11 +600,7 @@ labelLine: { show: false }, - data: [ - { value: 1048, name: 'Search Engine' }, - { value: 735, name: 'Direct' }, - { value: 580, name: 'Email' } - ] + data: temp } ] } @@ -362,9 +610,387 @@ }) } +const colors = ['#FEAF01', '#01ABFE', '#51F9E4'] +const initEchart2 = () => { + const myChart = echarts.init(document.getElementById('echart2')) + const option = { + series: [ + { + type: 'pie', + radius: ['86%', '100%'], + label: { + show: false, + position: 'center' + }, + padAngle: 3, + itemStyle: { + borderRadius: 10 + }, + color: colors, + labelLine: { + show: false + }, + data: dataListT2.value + } + ] + } + myChart.setOption(option) + window.addEventListener('resize', function () { // 鎵ц + myChart.resize() + }) +} +const initEchart3 = () => { + const myChart = echarts.init(document.getElementById('echart3')) + var colors = [ + new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ + offset: 0, + color: '#7fe3fc' + }, + { + offset: 1, + color: '#9ce9fc' + }]), + new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ + offset: 0, + color: '#64d7fa' + }, { + offset: 1, + color: '#7de3fc' + }]), + new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ + offset: 0, + color: '#4370f2' + }, { + offset: 1, + color: '#61d3f9' + }]), + new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ + offset: 0, + color: '#4679f6' + }, { + offset: 1, + color: '#4674f6' + }]), + ] + const data = [] + data.push({ name: '寰呰闂�', value: data4.value.waitVisitNum, rate: (data4.value.waitVisitNum / data4.value.total).toFixed(1) }) + data.push({ name: '宸茬櫥璁�', value: data4.value.registerVisitNum, rate: (data4.value.registerVisitNum / data4.value.total).toFixed(1) }) + data.push({ name: '宸茬寮�', value: data4.value.levelNum, rate: (data4.value.levelNum / data4.value.total).toFixed(1) }) + data.push({ name: '婊炵暀', value: data4.value.retentionNum, rate: (data4.value.retentionNum / data4.value.total).toFixed(1) }) + const option = { + color: colors, + tooltip: { + trigger: "axis", + axisPointer: { + type: "cross", + label: { + backgroundColor: "red" + }, + lineStyle: { + color: "#9eb2cb" + } + } + }, + + legend: { + show: false, + top: "top", + left: "2%", + textStyle: { + color: "#000" + }, + itemHeight: 2, + data: data.map(i => i.name) + }, + series: [ + { + type: 'funnel', + left: '15%', + right: '45%', + top: '10%', + bottom: '10%', + minSize: '20%', + maxSize: '80%', + gap: 4, + label: { + show: false, + formatter: '', + lineHeight: 0, + position: 'inside' + }, + tooltip: { + trigger: 'none', // 褰撻紶鏍囨偓娴湪鏌愪釜鏁版嵁椤逛笂鏃惰Е鍙� + }, + itemStyle: { //鍘绘帀榛樿鐧借壊杈规绾� + borderWidth: 0, + borderColor: '#fff' + }, + data + }, + { + type: 'funnel', + left: '15%', + right: '45%', + top: '10%', + bottom: '10%', + minSize: '80%', + maxSize: '80%', + gap: 4, + z: 1, + label: { + show: true, + position: 'outside', + formatter: (params) => { + const index = params.dataIndex + return `{color${index}|${params.data.name} ${params.data.rate}%}` + // return `<div>${params.data.name}</div>` + }, + rich: { + color0: { color: 'orange', fontSize: 14 }, + color1: { color: '#869CC9', fontSize: 13 }, + color2: { color: '#869CC9', fontSize: 13 }, + color3: { color: '#869CC9', fontSize: 13 } + } + }, + labelLine: { + show: true, + normal: { + length: 80, + position: 'right', + lineStyle: { + width: 1, + type: 'dashed', + color: 'rgba(102, 160, 239,.5)' + } + }, + }, + itemStyle: { //鍘绘帀榛樿鐧借壊杈规绾� + borderWidth: 0, + borderColor: '#fff' + }, + itemStyle: { + normal: { + color: 'transparent', + borderWidth: 0, + opacity: 1 + } + }, + data + }, + ] + } + myChart.setOption(option) + window.addEventListener('resize', function () { // 鎵ц + myChart.resize() + }) +} + +const data = ref({}) +const getData1 = () => { + getEnergyCenterData().then(res => { + 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) { + const result = res.data + 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 + } + initEchart2() + }) +} + +const dataList3 = ref([]) +const data4 = ref({}) +const getData3 = () => { + 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 => { + 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 + }) + initEchart3() + }) +} + +const warningTab = ref('0') +const warningNum = ref(0) +const warningList = ref([]) +const getWarning = () => { + 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 + }) + let temp = [] + warningList.value.forEach((item, i) => { + // console.log(i); + if (i == 0 || i % 2 == 0) { + temp.push(item) + } else { + temp[temp.length - 1].addr0 = item.addr + temp[temp.length - 1].createDate0 = item.createDate + temp[temp.length - 1].haveTime0 = item.haveTime + temp[temp.length - 1].img0 = item.img + temp[temp.length - 1].title0 = item.title + } + }) + warningList.value = temp + // console.log('temp', warningList.value); + }) +} +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 = () => { + afregionTreea({ + name: dataValue5.value, + withCameras: 1 + }).then(res => { + const result = res.data || [] + data5.value = result.filter(item => item.carmeraList && item.carmeraList.length > 0) + }) +} +const changeMon = () => { + showJk.value = !showJk.value + if(!showJk.value){ + activeJkIndex.value = -1 + activeMenu.value = {} + } +} +const menuClick = (val) => { + if (val == activeJkIndex.value) { + activeJkIndex.value = -1 + } else { + activeJkIndex.value = val + } +} +const menuItemClick = (val) => { + activeMenu.value = val + +} +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, + // loop: true, // 寰幆妯″紡閫夐」 + direction: 'vertical', //绔栫洿鏂瑰悜 + slidesPerView: 2, + autoplay: warningList.value.length > 1 ? { delay: 4000, disableOnInteraction: false } : false, + observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper + }) +} +const loopFn2 = () => { + var newSwiper1 = new Swiper('.two-swiper', { + initialSlide: 0, + direction: 'vertical', //绔栫洿鏂瑰悜 + slidesPerView: 3, + autoplay: autoplayFlag(dataList2.value.filter(i => i.total > 0), 3, 4000), + observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper + }) +} +const loopFn3 = () => { + var newSwiper1 = new Swiper('.three-swiper', { + initialSlide: 0, + // loop: true, // 寰幆妯″紡閫夐」 + direction: 'vertical', //绔栫洿鏂瑰悜 + slidesPerView: 3, + // autoplay: { delay: 500, disableOnInteraction: false }, + autoplay: autoplayFlag(dataList3.value, 3, 4000), + observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper + }) +} + + + + onMounted(() => { - // initEnergy() - initEchart1() + getData1() + getData2() + getData3() + getData5() + getWarning() + + setInterval(() => { + getData1() + getData2() + getData3() + getWarning() + }, 1000 * 60) + + setInterval(() => { + getData5() + }, 1000 * 60 * 60) + + setTimeout(() => { + loopFn1() + loopFn2() + loopFn3() + }, 12000) + }) @@ -373,6 +999,10 @@ <style lang="scss" scoped> div { box-sizing: border-box; +} + +.swiper-wrapper { + display: block !important; } .main_content { @@ -388,6 +1018,8 @@ margin-bottom: 20px; font-size: 14px; color: #D2E0FF; + background: rgba(0, 86, 255, 0.05); + backdrop-filter: blur(5px); .second_title { margin-top: 24px; @@ -396,7 +1028,7 @@ .stall_static { display: flex; - margin-bottom: 40px; + margin-bottom: 60px; padding: 0 20px; .residue { @@ -437,10 +1069,10 @@ } .private_car { - padding: 4px 32px; + padding: 4px 20px; display: flex; justify-content: space-between; - margin-bottom: 36px; + margin-bottom: 10px; .item { display: flex; @@ -450,18 +1082,54 @@ .icon { width: 52px; height: 52px; - margin-bottom: 10px; + margin-bottom: 8px; } + /* align-items: center; */ .num { line-height: 28px; height: 28px; - margin-bottom: 2px; + margin-top: 4px; font-weight: bold; font-size: 18px; color: #01D9FE; } + .num2 { + color: #FEAF01; + } + + .num3 { + color: #09FACD; + } + + } + } + + .section { + margin: 0 auto; + display: flex; + align-items: center; + width: 320px; + height: 20px; + background: rgba(255, 255, 255, 0.1); + padding: 0 4px; + margin-bottom: 60px; + + .item { + height: 10px; + margin-right: 1px; + background-color: #63d6fa; + flex: 1; + + &:nth-of-type(2) { + background-color: #f2b23e; + } + + &:nth-last-child(1) { + margin-right: 0; + background-color: #73f6cf; + } } } @@ -545,6 +1213,116 @@ flex: 1; margin: 0 20px; + .jiankong { + margin: 0 48px; + display: flex; + height: calc(100% - 40px); + position: relative; + + .jk_bg { + width: 100%; + height: 100%; + position: absolute; + z-index: -1; + } + + .content { + flex: 1; + /* height: calc( 100% - 30px ); */ + padding: 16px 0px 32px 20px; + + .video { + width: 100%; + height: 100%; + } + } + + .right_wrap { + margin-left: 15px; + width: 250px; + padding: 16px 20px 32px 0; + + .menus { + height: 100%; + background: #002A42; + border: 1px solid rgba(1, 171, 254, 0.8); + padding: 15px; + + .search_wrap { + display: flex; + align-items: center; + box-shadow: inset 0px 0px 6px 0px rgba(1, 171, 254, 0.5); + border-radius: 2px; + border: 1px solid rgba(1, 171, 254, 0.8); + height: 34px; + line-height: 34px; + padding-left: 12px; + + .search { + width: 12px; + height: 12px; + margin-right: 3px; + } + + .input { + flex: 1; + font-size: 14px; + } + } + + .menu_wrap { + margin-top: 15px; + max-height: 440px; + overflow: auto; + + .menu { + .menu_name { + display: flex; + justify-content: space-between; + align-items: center; + height: 34px; + border-bottom: 2px solid rgba(210, 224, 255, 0.2); + cursor: pointer; + + .name {} + + .icon { + width: 8px; + } + + .open { + width: 14px; + } + } + + .list { + .item { + display: flex; + /* 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 { + color: #01D9FE; + } + } + } + } + } + } + } + + } + .center_box_one { padding: 8px 60px; @@ -590,6 +1368,8 @@ .right_box_one { margin-bottom: 20px; + background: rgba(0, 86, 255, 0.05); + backdrop-filter: blur(5px); .second_title { margin-top: 20px; @@ -639,7 +1419,8 @@ .visitor_list { display: flex; justify-content: space-between; - padding: 20px; + padding: 20px 20px 16px; + .item { font-size: 12px; color: #D2E0FF; @@ -648,25 +1429,38 @@ display: flex; align-items: flex-end; margin-top: 8px; - .num{ + + .num { font-size: 22px; line-height: 22px; color: #FFFFFF; } } } - .spacing{ + + .spacing { width: 1px; height: 40px; background-color: #405173; margin: 0 24px; } } + + .echart3 { + width: 100%; + height: 140px; + } } - .right_box_two {} + .right_box_two { + background: rgba(0, 86, 255, 0.05); + backdrop-filter: blur(5px); + } - .right_box_three {} + .right_box_three { + background: rgba(0, 86, 255, 0.05); + backdrop-filter: blur(5px); + } } } @@ -704,15 +1498,14 @@ align-items: center; .time { - width: 180px; + width: 130px; display: flex; justify-content: flex-end; - padding-bottom: 10px; - font-size: 36px; + font-size: 30px; } .week { - margin-left: 36px; + margin-left: 20px; } } @@ -724,6 +1517,333 @@ height: 100%; object-fit: cover; z-index: -1; + } +} + +.main_footer { + /* margin-top: 20px; */ + display: flex; + padding: 20px 25px 0; + + .car_warning { + width: 360px; + + .table { + margin-top: 15px; + + .line { + display: flex; + align-items: center; + font-size: 14px; + height: 32px; + + div { + flex: 3; + height: 16px; + display: flex; + align-items: center; + justify-content: center; + } + + .dept { + flex: 5; + } + + .time { + flex: 4; + } + } + + .header { + background: rgba(134, 156, 201, 0.1); + font-weight: 500; + + div { + border-right: 1px solid rgba(255, 255, 255, 0.2); + + &:nth-last-child(1) { + border: none; + } + } + } + + .separate { + width: 100%; + height: 2px; + background-color: rgba(255, 255, 255, 0.2); + /* background-color: red; */ + border-right: 4px solid #00F2F3; + border-left: 4px solid #00F2F3; + } + } + } + + .safe_warning { + width: 786px; + margin-right: 20px; + + /* one-swiper */ + .one_swiper_wrap { + height: 140px; + overflow: hidden; + background: rgba(0, 86, 255, 0.05); + backdrop-filter: blur(5px); + } + + .list { + height: 204px; + overflow: hidden; + margin-top: 15px; + scrollbar-width: none; + display: flex; + flex-wrap: wrap; + margin-left: 20px; + + .item { + width: 736px; + height: 102px !important; + font-size: 13px; + color: #D2E0FF; + display: flex; + + /* border: 1px solid; */ + .item_wrap { + width: 368px; + height: 90px; + padding: 10px; + background: linear-gradient(270deg, rgba(1, 217, 254, 0) 0%, rgba(1, 217, 254, 0.19) 100%); + border: 1px solid #006E81; + display: flex; + margin-right: 10px; + + &:nth-of-type(2n) { + margin-right: 0; + } + } + + + .avatar { + width: 70px; + height: 70px; + margin-right: 10px; + } + + .content { + flex: 1; + + .header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 8px; + + .name { + font-weight: 500; + font-size: 15px; + } + + .have_time { + font-size: 12px; + color: #D2E0FF; + + span { + color: #FEAF01; + } + } + } + + .wrap { + font-size: 12px; + color: #D2E0FF; + + .line { + display: flex; + align-items: center; + margin-bottom: 3px; + } + + .icon { + width: 12px; + margin-right: 8px; + } + } + } + } + } + } + + .garden_warning { + flex: 1; + margin-right: 20px; + position: relative; + background: rgba(0, 86, 255, 0.05); + backdrop-filter: blur(5px); + + .content { + display: flex; + + .sa_static { + width: 285px; + margin-top: 15px; + display: flex; + justify-content: center; + align-items: center; + padding-top: 16px; + padding-left: 24px; + + .echart_wrap { + position: relative; + + .pie_text { + width: 82px; + height: 82px; + box-shadow: inset 0px 0px 8px 0px #01D9FE; + border-radius: 50%; + position: absolute; + + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + z-index: 999; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + font-size: 12px; + + .fs30 { + font-weight: bold; + font-size: 18px; + margin-bottom: 4px; + } + } + } + + .echart { + width: 110px; + height: 110px; + } + + .list { + margin-left: 32px; + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + height: 110px; + + .item { + width: 100%; + font-size: 14px; + + .line { + display: flex; + align-items: center; + margin-bottom: 6px; + + .icon { + width: 12px; + height: 12px; + border-radius: 50%; + margin-right: 10px; + background: linear-gradient(270deg, #29aeff 0%, #207ff7 100%); + } + } + + .num { + margin-left: 20px; + } + } + } + } + + .table { + .list { + height: 102px !important; + overflow: hidden; + + .item { + height: 34px !important; + } + } + + .line { + height: 32px !important; + + div { + justify-content: flex-end; + padding-right: 10px; + } + + .driver { + flex: 5; + justify-content: center; + } + } + + .header { + div { + justify-content: center; + padding-right: 0; + } + } + } + } + + .monitoring { + position: absolute; + cursor: pointer; + top: -60px; + right: 0; + display: flex; + align-items: center; + justify-content: center; + font-weight: 500; + font-size: 15px; + width: 134px; + height: 40px; + background: linear-gradient(180deg, #021F4A 0%, #054281 100%), linear-gradient(180deg, #011738 0%, rgba(5, 66, 129, 0.26) 100%), #00141F; + border-radius: 2px; + border: 1px solid rgba(12, 153, 236, 0.68); + + .icon { + width: 16px; + height: 16px; + margin-right: 4px; + } + + .top { + width: 12px; + height: 12px; + margin-left: 8px; + } + } + + } + + .visitor_warning { + width: 360px; + background: rgba(0, 86, 255, 0.05); + backdrop-filter: blur(5px); + + .table { + .list { + height: 102px !important; + overflow: hidden; + + .item { + height: 34px !important; + } + } + + .line { + div { + .dept { + flex: 5; + } + } + } + } } } @@ -740,13 +1860,6 @@ align-items: center; font-weight: bold; font-size: 16px; - background-image: -webkit-linear-gradient(top, - #ffffff 0%, - #c8ddff 66%, - #85b4ff 72%, - #74a9ff 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; .icon { width: 16px; @@ -764,13 +1877,70 @@ .separate { width: 1px; height: 14px; - background-color: #d2e0ff; + /* background-color: #d2e0ff; */ margin: 0 6px; } - .active { - color: #0094eb; + .tab { + cursor: pointer; } + + .active { + font-weight: 600; + font-size: 15px; + color: #FFFFFF; + text-shadow: 0px 0px 8px #01D9FE; + } + } +} + +.table { + margin-top: 15px; + flex: 1; + + .line { + display: flex; + align-items: center; + font-size: 14px; + height: 32px; + + div { + flex: 3; + height: 16px; + display: flex; + align-items: center; + justify-content: center; + } + + .dept { + flex: 5; + } + + .time { + flex: 4; + } + } + + .header { + background: rgba(134, 156, 201, 0.1); + font-weight: 500; + + div { + border-right: 1px solid rgba(255, 255, 255, 0.2); + + &:nth-last-child(1) { + border: none; + } + } + } + + .separate { + width: 100%; + height: 2px; + background-color: rgba(255, 255, 255, 0.2); + /* background-color: red; */ + border-right: 4px solid #00F2F3; + border-left: 4px solid #00F2F3; } } @@ -816,10 +1986,8 @@ height: 960px; /* width: 100%; height: 100vh; */ - background: #0b2539; color: #FFFFFF; position: relative; - z-index: -2; font-size: 14px; .main_bg { -- Gitblit v1.9.3