616 lines
29 KiB
Vue
Raw Normal View History

2022-06-08 14:51:11 +08:00
<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>