616 lines
29 KiB
Vue
616 lines
29 KiB
Vue
<template>
|
||
<div class="fullHeight greenPage">
|
||
<div class="headerBox">
|
||
<h1 class="title">
|
||
{{ $store.state.currentProDetail.projectName }} -
|
||
{{ $t("message.carOverview.vehicleStatistics") }}
|
||
</h1>
|
||
<closePage></closePage>
|
||
</div>
|
||
<div class="leftLine"></div>
|
||
<div class="rightLine"></div>
|
||
<div class="bottomLine"></div>
|
||
<div class="greenContent">
|
||
<div class="top">
|
||
<div class="smallDiv smallDiv1 fullHeight">
|
||
<div class="blockBox">
|
||
<div class="title">
|
||
<p class="e1">
|
||
{{ $t("message.carOverview.latestApproachVehicle") }}
|
||
</p>
|
||
</div>
|
||
<div class="blockContent">
|
||
<!-- {{inList[0]}}-->
|
||
<!-- *{{$store.state.FILEURL+inList[0].imageUrl}}-->
|
||
<div class="carBox big">
|
||
<img :preview="inObj.panoramaUrl?$store.state.FILEURL+inObj.panoramaUrl:''"
|
||
:src="inObj.panoramaUrl?$store.state.FILEURL+inObj.panoramaUrl:''"/>
|
||
<div class="carDetail" v-if="inList.length">
|
||
<p class="greenBtn whiteList" :class="inObj.isBlack===0?'':inObj.isBlack===1?'red':'green'">
|
||
<img
|
||
v-for="item in 4"
|
||
:key="item"
|
||
:class="'arrow' + item"
|
||
class="arrow"
|
||
src="@/assets/images/carOverview/arrow.png"
|
||
/>
|
||
{{inObj.isBlack===0?$t("message.carOverview.whiteList"):inObj.isBlack===1?$t("message.carOverview.blackList"):$t("message.carOverview.temporaryCar")}}
|
||
</p>
|
||
<p class="carNum">{{inObj.carNumber}}</p>
|
||
<p class="time">{{inObj.passTime}}</p>
|
||
</div>
|
||
<div class="placeholderBox placeholderBox2" v-if="inList.length==0">
|
||
<img src="@/assets/images/noData3.png" alt="" srcset="">
|
||
<p>{{$t("message.carOverview.noData")}}</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="blockBox">
|
||
<div class="title">
|
||
<p class="e4">
|
||
{{ $t("message.carOverview.entryBrakeControl") }}
|
||
</p>
|
||
</div>
|
||
<div class="blockContent controlBox">
|
||
<div class="bg2" @click="clickOnStart(inObj)">
|
||
{{ $t("message.carOverview.clickOnStart") }}
|
||
{{ $t("message.carOverview.vehiclesEntering") }}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="centerDiv fullHeight">
|
||
<p class="centerTitle">
|
||
{{ $t("message.carOverview.todaysTrafficStatistics") }}
|
||
</p>
|
||
<div ref="centerChart" class="centerChart"></div>
|
||
<div class="totalBox">
|
||
<div class="item">
|
||
<p>{{ $t("message.carOverview.vehiclesForApproachToday") }}</p>
|
||
<div class="bg1">
|
||
<countTo :startVal="0" :endVal="outInData.innum" :duration="5000"></countTo>
|
||
</div>
|
||
</div>
|
||
<div class="item">
|
||
<p>{{ $t("message.carOverview.vehiclesForToday") }}</p>
|
||
<div class="bg1">
|
||
<countTo :startVal="0" :endVal="outInData.outnum" :duration="5000"></countTo>
|
||
</div>
|
||
</div>
|
||
<div class="item">
|
||
<p>{{ $t("message.carOverview.vehicleWashingRate") }}</p>
|
||
<div class="bg1">
|
||
<!-- <countTo :startVal="0" :endVal="0" :duration="5000"></countTo> -->
|
||
0%
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="smallDiv fullHeight">
|
||
<div class="blockBox">
|
||
<div class="title">
|
||
<p class="e3">{{$t("message.carOverview.latestVehicle") }}</p>
|
||
</div>
|
||
<div class="blockContent alarmBlockContent">
|
||
<div class="carBox big">
|
||
<img :preview="outObj.panoramaUrl?$store.state.FILEURL+outObj.panoramaUrl:''"
|
||
:src="outObj.panoramaUrl?$store.state.FILEURL+outObj.panoramaUrl:''"
|
||
alt="" srcset=""/>
|
||
<div class="carDetail" v-if="outList.length">
|
||
<p class="greenBtn whiteList" :class="outObj.isBlack===0?'':outObj.isBlack===1?'red':'green'">
|
||
<img
|
||
v-for="item in 4"
|
||
:key="item"
|
||
:class="'arrow' + item"
|
||
class="arrow"
|
||
src="@/assets/images/carOverview/arrow.png"
|
||
/>
|
||
{{outObj.isBlack===0?$t("message.carOverview.whiteList"):outObj.isBlack===1?$t("message.carOverview.blackList"):$t("message.carOverview.temporaryCar")}}
|
||
</p>
|
||
<p class="carNum">{{outObj.carNumber}}</p>
|
||
<p class="time">{{outObj.passTime}}</p>
|
||
</div>
|
||
<div class="placeholderBox placeholderBox2" v-if="outList.length==0">
|
||
<img src="@/assets/images/noData3.png" alt="" srcset="">
|
||
<p>{{$t("message.carOverview.noData")}}</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="blockBox">
|
||
<div class="title">
|
||
<p class="e5">{{ $t("message.carOverview.exitGateControl") }}</p>
|
||
</div>
|
||
<div class="blockContent controlBox">
|
||
<div class="bg2" @click="clickOutStart">
|
||
{{ $t("message.carOverview.clickOnStart") }}
|
||
{{ $t("message.carOverview.vehicleAppearance") }}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="bottom">
|
||
<div class="blockBox fullHeight">
|
||
<div class="title">
|
||
<p class="e6">
|
||
{{
|
||
$t("message.carOverview.vehiclesApproachingTheSceneAreSnapped")
|
||
}}
|
||
</p>
|
||
</div>
|
||
<div class="blockContent carList">
|
||
<vue-scroll :ops="ops">
|
||
<div class="carBox" v-for="item in inList" :key="item.id">
|
||
<img :preview="$store.state.FILEURL+item.panoramaUrl"
|
||
:src="$store.state.FILEURL+item.panoramaUrl" alt="" srcset=""/>
|
||
<div class="carDetail">
|
||
<p class="carNum">{{item.carNumber}}</p>
|
||
<p class="time">{{item.passTime}}</p>
|
||
<span class="greenBtn" :class="item.isBlack===0?'':item.isBlack===1?'red':'green'">
|
||
<img v-for="item in 4" :key="item" :class="'arrow' + item" class="arrow"
|
||
src="@/assets/images/carOverview/arrow.png"/>
|
||
{{item.isBlack===0?$t("message.carOverview.whiteList"):item.isBlack===1?$t("message.carOverview.blackList"):$t("message.carOverview.temporaryCar")}}</span>
|
||
</div>
|
||
</div>
|
||
</vue-scroll>
|
||
<div class="placeholderBox placeholderBox2" v-if="inList.length==0">
|
||
<img src="@/assets/images/noData3.png" alt="" srcset="">
|
||
<p>{{$t("message.carOverview.noData")}}</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="blockBox fullHeight">
|
||
<div class="title">
|
||
<p class="e7">
|
||
{{ $t("message.carOverview.exitVehicleSnapshot") }}
|
||
</p>
|
||
</div>
|
||
<div class="blockContent carList">
|
||
<vue-scroll :ops="ops">
|
||
<div class="carBox" v-for="item in outList" :key="item.id">
|
||
<img :preview="$store.state.FILEURL+item.panoramaUrl"
|
||
:src="$store.state.FILEURL+item.panoramaUrl" alt="" srcset=""/>
|
||
<div class="carDetail">
|
||
<p class="carNum">{{item.carNumber}}</p>
|
||
<p class="time">{{item.passTime}}</p>
|
||
<span class="greenBtn" :class="item.isBlack===0?'':item.isBlack===1?'red':'green'">
|
||
<img v-for="item in 4" :key="item" :class="'arrow' + item" class="arrow"
|
||
src="@/assets/images/carOverview/arrow.png"/>
|
||
{{item.isBlack===0?$t("message.carOverview.whiteList"):item.isBlack===1?$t("message.carOverview.blackList"):$t("message.carOverview.temporaryCar")}}
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</vue-scroll>
|
||
<div class="placeholderBox placeholderBox2" v-if="outList.length==0">
|
||
<img src="@/assets/images/noData3.png" alt="" srcset="">
|
||
<p>{{$t("message.carOverview.noData")}}</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
<script>
|
||
import {
|
||
getCarPassRecordStatistics,
|
||
getCarCameraListApi,
|
||
openGate
|
||
} from '../../../assets/js/api/carManage'
|
||
import echarts from 'echarts4';;
|
||
import countTo from "vue-count-to";
|
||
import closePage from "@/components/closePage"
|
||
export default {
|
||
components: {
|
||
countTo,closePage
|
||
},
|
||
data() {
|
||
return {
|
||
ops: {
|
||
vuescroll: {
|
||
// wheelScrollDuration: 0,
|
||
wheelDirectionReverse: true
|
||
}
|
||
},
|
||
valve: {},
|
||
inList: [],
|
||
inObj: {},
|
||
outList: [],
|
||
outObj: {},
|
||
outInData: {
|
||
innum: 0,
|
||
outnum: 0,
|
||
presencenum:0
|
||
},
|
||
weatherInfo: {
|
||
data: [],
|
||
},
|
||
Chart:null,
|
||
option:{},
|
||
angle:0,
|
||
interval:null
|
||
};
|
||
},
|
||
mounted() {
|
||
this.getCar();
|
||
// this.upDataChart();
|
||
},
|
||
methods: {
|
||
getCar() {
|
||
getCarCameraListApi({projectSn: this.$store.state.projectSn}).then(result => {
|
||
if (result.success) {
|
||
console.log('查看阀门', result.result);
|
||
result.result.map(item => {
|
||
if (item.passType === 1) {
|
||
this.valve.in = item.cameraId;
|
||
} else if (item.passType === 2) {
|
||
this.valve.out = item.cameraId;
|
||
}
|
||
})
|
||
}
|
||
})
|
||
getCarPassRecordStatistics({projectSn: this.$store.state.projectSn}).then(result => {
|
||
if (result.success) {
|
||
console.log('查看车辆', result.result);
|
||
this.inList = result.result.inList;
|
||
this.inObj = this.inList[0] || {};
|
||
this.outList = result.result.outList;
|
||
this.outObj = this.outList[0] || {};
|
||
this.outInData = result.result.outInData;
|
||
this.$nextTick(() => {
|
||
this.$previewRefresh();
|
||
//
|
||
if(this.Chart){
|
||
// this.Chart.setOption(this.option);
|
||
// if(this.interval){
|
||
// clearInterval(this.interval)
|
||
// }
|
||
// this.interval=setInterval(() => {
|
||
// //用setInterval做动画感觉有问题
|
||
// this.angle = this.angle + 3;
|
||
// this.Chart.setOption(this.option, true);
|
||
// }, 100);
|
||
}else{
|
||
this.upDataChart();
|
||
}
|
||
|
||
})
|
||
setTimeout(()=>{
|
||
this.getCar()
|
||
},10000)
|
||
// console.log('查看outObj', this.outObj);
|
||
}
|
||
})
|
||
},
|
||
clickOnStart() {
|
||
console.log('入场开启', this.inObj, this.valve)
|
||
if(!this.valve.in){
|
||
this.$message.error('没有入场相机')
|
||
return
|
||
}
|
||
openGate({cameraId: this.valve.in}).then(result => {
|
||
if (result.success) {
|
||
console.log('进入成功', result.result);
|
||
this.$message.success(result.message)
|
||
}
|
||
})
|
||
},
|
||
clickOutStart() {
|
||
console.log('出厂开启', this.inObj, this.valve)
|
||
if(!this.valve.out){
|
||
this.$message.error('没有出场相机')
|
||
return
|
||
}
|
||
openGate({cameraId: this.valve.out}).then(result => {
|
||
if (result.success) {
|
||
console.log('出厂成功', result.result);
|
||
this.$message.success(result.message)
|
||
}
|
||
})
|
||
},
|
||
upDataChart() {
|
||
let that = this;
|
||
// this.Chart.clear();
|
||
// let angle = 0; //角度,用来做简单的动画效果的
|
||
this.Chart = echarts.init(this.$refs.centerChart);
|
||
// let value = this.outInData.presencenum;
|
||
console.log('查看outInData', this.outInData);
|
||
this.option = {
|
||
title: {
|
||
text:
|
||
"{a|" +
|
||
this.outInData.presencenum +
|
||
"}\n{c| " +
|
||
this.$t("message.carOverview.presentVehicle") +
|
||
" }",
|
||
x: "center",
|
||
y: "center",
|
||
textStyle: {
|
||
rich: {
|
||
a: {
|
||
fontSize: 46,
|
||
color: "#5CE2F6",
|
||
},
|
||
c: {
|
||
fontSize: 16,
|
||
lineHeight: 20,
|
||
color: "#5CE2F6",
|
||
},
|
||
},
|
||
},
|
||
},
|
||
|
||
series: [
|
||
{
|
||
name: "ring5",
|
||
type: "custom",
|
||
coordinateSystem: "none",
|
||
renderItem: function (params, api) {
|
||
return {
|
||
type: "arc",
|
||
shape: {
|
||
cx: api.getWidth() / 2,
|
||
cy: api.getHeight() / 2,
|
||
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.79,
|
||
startAngle: ((0 + that.angle) * Math.PI) / 180,
|
||
endAngle: ((90 + that.angle) * Math.PI) / 180,
|
||
},
|
||
style: {
|
||
stroke: "#0CD3DB",
|
||
fill: "transparent",
|
||
lineWidth: 1.5,
|
||
},
|
||
silent: true,
|
||
};
|
||
},
|
||
data: [0],
|
||
},
|
||
{
|
||
name: "ring5",
|
||
type: "custom",
|
||
coordinateSystem: "none",
|
||
renderItem: function (params, api) {
|
||
return {
|
||
type: "arc",
|
||
shape: {
|
||
cx: api.getWidth() / 2,
|
||
cy: api.getHeight() / 2,
|
||
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.79,
|
||
startAngle: ((180 + that.angle) * Math.PI) / 180,
|
||
endAngle: ((270 + that.angle) * Math.PI) / 180,
|
||
},
|
||
style: {
|
||
stroke: "#0CC1CD",
|
||
fill: "transparent",
|
||
lineWidth: 1.5,
|
||
},
|
||
silent: true,
|
||
};
|
||
},
|
||
data: [0],
|
||
},
|
||
{
|
||
name: "ring5",
|
||
type: "custom",
|
||
coordinateSystem: "none",
|
||
renderItem: function (params, api) {
|
||
return {
|
||
type: "arc",
|
||
shape: {
|
||
cx: api.getWidth() / 2,
|
||
cy: api.getHeight() / 2,
|
||
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.85,
|
||
startAngle: ((270 + -that.angle) * Math.PI) / 180,
|
||
endAngle: ((40 + -that.angle) * Math.PI) / 180,
|
||
},
|
||
style: {
|
||
stroke: "#0CC1CD",
|
||
fill: "transparent",
|
||
lineWidth: 1.5,
|
||
},
|
||
silent: true,
|
||
};
|
||
},
|
||
data: [0],
|
||
},
|
||
{
|
||
name: "ring5",
|
||
type: "custom",
|
||
coordinateSystem: "none",
|
||
renderItem: function (params, api) {
|
||
return {
|
||
type: "arc",
|
||
shape: {
|
||
cx: api.getWidth() / 2,
|
||
cy: api.getHeight() / 2,
|
||
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.85,
|
||
startAngle: ((90 + -that.angle) * Math.PI) / 180,
|
||
endAngle: ((220 + -that.angle) * Math.PI) / 180,
|
||
},
|
||
style: {
|
||
stroke: "#0CC1CD",
|
||
fill: "transparent",
|
||
lineWidth: 1.5,
|
||
},
|
||
silent: true,
|
||
};
|
||
},
|
||
data: [0],
|
||
},
|
||
{
|
||
name: "ring5",
|
||
type: "custom",
|
||
coordinateSystem: "none",
|
||
renderItem: function (params, api) {
|
||
let x0 = api.getWidth() / 2;
|
||
let y0 = api.getHeight() / 2;
|
||
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.85;
|
||
let point = that.getCirlPoint(x0, y0, r, 90 + -that.angle);
|
||
return {
|
||
type: "circle",
|
||
shape: {
|
||
cx: point.x,
|
||
cy: point.y,
|
||
r: 4,
|
||
},
|
||
style: {
|
||
stroke: "#0CC1CD", //粉
|
||
fill: "#0CD3DB",
|
||
},
|
||
silent: true,
|
||
};
|
||
},
|
||
data: [0],
|
||
},
|
||
{
|
||
name: "ring5", //绿点
|
||
type: "custom",
|
||
coordinateSystem: "none",
|
||
renderItem: function (params, api) {
|
||
let x0 = api.getWidth() / 2;
|
||
let y0 = api.getHeight() / 2;
|
||
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.85;
|
||
let point = that.getCirlPoint(x0, y0, r, 270 + -that.angle);
|
||
return {
|
||
type: "circle",
|
||
shape: {
|
||
cx: point.x,
|
||
cy: point.y,
|
||
r: 4,
|
||
},
|
||
style: {
|
||
stroke: "#0CC1CD", //绿
|
||
fill: "#0CD3DB",
|
||
},
|
||
silent: true,
|
||
};
|
||
},
|
||
data: [0],
|
||
},
|
||
{
|
||
type: "pie",
|
||
radius: ["72%", "58%"],
|
||
silent: true,
|
||
clockwise: true,
|
||
startAngle: 90,
|
||
z: 0,
|
||
zlevel: 0,
|
||
label: {
|
||
normal: {
|
||
position: "center",
|
||
},
|
||
},
|
||
data: [
|
||
{
|
||
value: this.outInData.presencenum,
|
||
name: "",
|
||
itemStyle: {
|
||
normal: {
|
||
color: "#5EE4F7",
|
||
},
|
||
},
|
||
},
|
||
{
|
||
value: 100 - this.outInData.presencenum,
|
||
name: "",
|
||
label: {
|
||
normal: {
|
||
show: false,
|
||
},
|
||
},
|
||
itemStyle: {
|
||
normal: {
|
||
color: "#072735",
|
||
},
|
||
},
|
||
},
|
||
],
|
||
},
|
||
//划块线
|
||
{
|
||
name: "",
|
||
type: "gauge",
|
||
radius: "72%",
|
||
center: ["50%", "50%"],
|
||
startAngle: 0,
|
||
endAngle: 359.9,
|
||
splitNumber: 8,
|
||
hoverAnimation: true,
|
||
axisTick: {
|
||
show: false,
|
||
},
|
||
splitLine: {
|
||
length: 20,
|
||
lineStyle: {
|
||
width: 2,
|
||
color: "#061740",
|
||
},
|
||
},
|
||
axisLabel: {
|
||
show: false,
|
||
},
|
||
pointer: {
|
||
show: false,
|
||
},
|
||
axisLine: {
|
||
lineStyle: {
|
||
opacity: 0,
|
||
},
|
||
},
|
||
detail: {
|
||
show: false,
|
||
},
|
||
data: [
|
||
{
|
||
value: 0,
|
||
name: "",
|
||
},
|
||
],
|
||
},
|
||
],
|
||
};
|
||
// this.Chart.setOption(this.option);
|
||
this.interval=setInterval(() => {
|
||
//用setInterval做动画感觉有问题
|
||
this.angle = this.angle + 3;
|
||
this.Chart.setOption(this.option, true);
|
||
}, 100);
|
||
},
|
||
|
||
//获取圆上面某点的坐标(x0,y0表示坐标,r半径,angle角度)
|
||
getCirlPoint(x0, y0, r, angle) {
|
||
let x1 = x0 + r * Math.cos((angle * Math.PI) / 180);
|
||
let y1 = y0 + r * Math.sin((angle * Math.PI) / 180);
|
||
return {
|
||
x: x1,
|
||
y: y1,
|
||
};
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
<style lang="less" scoped>
|
||
@import url("./style.less");
|
||
|
||
.whiteList {
|
||
position: relative;
|
||
background: #235A67;
|
||
margin-top: 0;
|
||
width: calc(100% - 22px);
|
||
|
||
.arrow {
|
||
opacity: 1;
|
||
}
|
||
}
|
||
/deep/ .__view {
|
||
display: flex;
|
||
}
|
||
|
||
.carBox {
|
||
& > img {
|
||
height: unset;
|
||
}
|
||
}
|
||
</style> |