| | |
| | | </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 v-if="data.inParkCarTotal && data.parkingLotTotal" class="num">{{ ((data.inParkCarTotal / |
| | | data.parkingLotTotal) * 100).toFixed(0) }}%</span> |
| | | </div> |
| | | <div class="val"> |
| | | <Percent :rate="50" /> |
| | | <Percent :rate="((data.inParkCarTotal / data.parkingLotTotal) * 100).toFixed(0)" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="private_car"> |
| | | <div class="item"> |
| | | <div class="name">员工车辆</div> |
| | | <div class="num">20</div> |
| | | <div class="num">{{ data.internalCarTotal }}</div> |
| | | </div> |
| | | <div class="item"> |
| | | <div class="name">相关方车辆</div> |
| | | <div class="num num2">20</div> |
| | | <div class="num num2">{{ data.relatedCarTotal }}</div> |
| | | </div> |
| | | <div class="item"> |
| | | |
| | | <div class="name">来访车辆</div> |
| | | <div class="num num3">20</div> |
| | | <div class="num num3">{{ data.visitCarTotal }}</div> |
| | | </div> |
| | | </div> |
| | | <div class="section"> |
| | | <div class="item"></div> |
| | | <div class="item"></div> |
| | | <div class="item"></div> |
| | | <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"> |
| | |
| | | <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.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> |
| | |
| | | <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> |
| | |
| | | <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.inParkCarTotal }}</div> |
| | | <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> |
| | | </div> |
| | | </div> |
| | |
| | | <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.deviceTotal }}</div> |
| | | <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> |
| | | </div> |
| | | </div> |
| | |
| | | <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.errTotal }}</div> |
| | | <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> |
| | | </div> |
| | | </div> |
| | |
| | | <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" v-if="data.internalTotal && data.inParkTotal"><span>{{ data.internalTotal }}</span> | |
| | | {{ ((data.internalTotal / data.inParkTotal) * 100).toFixed(1) }}%</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" v-if="data.relatedTotal && data.inParkTotal"><span>{{ data.relatedTotal |
| | | }}</span> | {{ ((data.relatedTotal / data.inParkTotal) * 100).toFixed(1) }}%</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" v-if="data.visitTotal && data.inParkTotal"><span>{{ data.visitTotal }}</span> |
| | | | {{ ((data.visitTotal / data.inParkTotal) * 100).toFixed(1) }}%</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <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 class="sa_static"> |
| | | <div class="echart_wrap"> |
| | | <div class="pie_text"> |
| | | <div class="fs30"><strong>300</strong></div> |
| | | <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"> |
| | | <div class="item" v-for="item, i in dataListT2"> |
| | | <div class="line"> |
| | | <div :style="{ background: colors[1] }" 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[1] }" class="num">100</div> |
| | | <div :style="{ color: colors[i] }" class="num">{{ item.value }} | {{ item.rate }}%</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> |
| | | |
| | | </div> |
| | | </div> |
| | | <div class="table"> |
| | |
| | | <div>离线数</div> |
| | | <div>在线率</div> |
| | | </div> |
| | | <div class="line"> |
| | | <div class="driver">门禁设备</div> |
| | | <div>10</div> |
| | | <div>10</div> |
| | | <div>10</div> |
| | | <div>10</div> |
| | | </div> |
| | | <div class="separate"></div> |
| | | <div class="line"> |
| | | <div class="driver">门禁设备</div> |
| | | <div>10</div> |
| | | <div>10</div> |
| | | <div>10</div> |
| | | <div>10</div> |
| | | </div> |
| | | <div class="separate"></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 v-if="item.onlineNum && item.totalNum">{{ ((item.onlineNum / item.totalNum) * 100).toFixed(0) }}% |
| | | </div> |
| | | </div> |
| | | <div class="separate"></div> |
| | | </template> |
| | | |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="dept">拜访部门</div> |
| | | <div class="dept">超时时长</div> |
| | | </div> |
| | | <div class="line"> |
| | | <div>name</div> |
| | | <div class="dept">综合管理科</div> |
| | | <div class="dept">10:21</div> |
| | | </div> |
| | | <div class="separate"></div> |
| | | <div class="line"> |
| | | <div>name</div> |
| | | <div class="dept">综合管理科</div> |
| | | <div class="dept">10:21</div> |
| | | </div> |
| | | <div class="separate"></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> |
| | | <div class="separate"></div> |
| | | </template> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | 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' |
| | | import { getEnergyCenterData, getSecurityDeviceData, getVisitRetentionData } from '@/api' |
| | | import { getEnergyCenterData, getSecurityDeviceData, getVisitRetentionData, afgetVisitData } from '@/api' |
| | | |
| | | |
| | | const colors = ['#FEAF01', '#01ABFE', '#51F9E4'] |
| | | const weekMap = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六',] |
| | | const date = ref(dayjs().format('YYYY.MM.DD')) |
| | | const week = ref(weekMap[new Date().getDay()]) |
| | |
| | | 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: [ |
| | | { |
| | |
| | | labelLine: { |
| | | show: false |
| | | }, |
| | | data: [ |
| | | { value: 1048, name: 'Search Engine' }, |
| | | { value: 735, name: 'Direct' }, |
| | | { value: 580, name: 'Email' } |
| | | ] |
| | | data: temp |
| | | } |
| | | ] |
| | | } |
| | |
| | | myChart.resize() |
| | | }) |
| | | } |
| | | |
| | | const colors = ['#FEAF01', '#01ABFE', '#51F9E4'] |
| | | const initEchart2 = () => { |
| | | const myChart = echarts.init(document.getElementById('echart2')) |
| | | const option = { |
| | |
| | | labelLine: { |
| | | show: false |
| | | }, |
| | | data: [ |
| | | { value: 1048, name: 'Search Engine' }, |
| | | { value: 735, name: 'Direct' }, |
| | | { value: 580, name: 'Email' } |
| | | ] |
| | | data: dataListT2.value |
| | | } |
| | | ] |
| | | } |
| | |
| | | offset: 1, |
| | | 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 }) |
| | | const option = { |
| | | color: colors, |
| | | tooltip: { |
| | |
| | | color: "#000" |
| | | }, |
| | | itemHeight: 2, |
| | | data: ['待访问', '已登记', '已离开', '滞留'] |
| | | data: data.map(i => i.name) |
| | | }, |
| | | series: [ |
| | | { |
| | |
| | | borderWidth: 0, |
| | | borderColor: '#fff' |
| | | }, |
| | | data: [ |
| | | { value: 100, name: '待访问', }, |
| | | { value: 50, name: '已登记' }, |
| | | { value: 20, name: '已离开' }, |
| | | { value: 30, name: '滞留' }, |
| | | |
| | | ] |
| | | data |
| | | }, |
| | | { |
| | | type: 'funnel', |
| | |
| | | opacity: 1 |
| | | } |
| | | }, |
| | | data: [ |
| | | { value: 100, name: '待访问', }, |
| | | { value: 50, name: '已登记' }, |
| | | { value: 20, name: '已离开' }, |
| | | { value: 30, name: '滞留' }, |
| | | |
| | | ] |
| | | data |
| | | }, |
| | | ] |
| | | } |
| | |
| | | myChart.resize() |
| | | }) |
| | | } |
| | | const ininDate = () => { |
| | | getEnergyCenterData() |
| | | |
| | | const data = ref({}) |
| | | const getData1 = () => { |
| | | getEnergyCenterData().then(res => { |
| | | const result = res.data |
| | | data.value = result |
| | | initEchart1() |
| | | }) |
| | | } |
| | | |
| | | const dataList2 = ref([]) |
| | | const dataListT2 = ref([]) |
| | | const getData2 = () => { |
| | | getSecurityDeviceData().then(res => { |
| | | 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) }) |
| | | } |
| | | |
| | | dataListT2.value = temp |
| | | initEchart2() |
| | | }) |
| | | } |
| | | |
| | | const dataList3 = ref([]) |
| | | const getData3 = () => { |
| | | getVisitRetentionData().then(res => { |
| | | const result = res.data || [] |
| | | dataList3.value = result.map(i => { |
| | | i.timeOutMinuteT = dayjs.duration(i.timeOutMinute * 60 * 1000).format('HH:mm') |
| | | return i |
| | | }) |
| | | }) |
| | | } |
| | | const data4 = ref({}) |
| | | const getData4 = () => { |
| | | afgetVisitData().then(res => { |
| | | const result = res.data || {} |
| | | dataList4.value = result |
| | | initEchart3() |
| | | }) |
| | | } |
| | | |
| | | |
| | | onMounted(() => { |
| | | ininDate() |
| | | initEchart3() |
| | | initEchart1() |
| | | initEchart2() |
| | | getData1() |
| | | getData2() |
| | | getData3() |
| | | getData4() |
| | | |
| | | // initEchart1() |
| | | }) |
| | | |
| | | |
| | |
| | | .main_content { |
| | | display: flex; |
| | | padding: 20px 25px 0; |
| | | border: 1px solid; |
| | | |
| | | .left_box { |
| | | width: 360px; |
| | |
| | | flex: 1; |
| | | margin-right: 20px; |
| | | position: relative; |
| | | |
| | | .content { |
| | | display: flex; |
| | | |
| | |
| | | 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{ |
| | | |
| | | .icon { |
| | | width: 30px; |
| | | } |
| | | |
| | | .top { |
| | | width: 12px; |
| | | height: 12px; |