zhgdyun/src/views/projectFront/lifter/operationInfo.vue
2023-08-31 18:16:18 +08:00

949 lines
28 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 运行信息 -->
<vue-scroll style="height: 100%">
<div class="operationInfo">
<div class="title whiteBlock">
<el-form :inline="true" size="medium" class="demo-form-inline">
<el-form-item :label="$t('message.lifter.devName')">
<el-select
v-model="devSn"
:placeholder="
$t('message.lifter.pleaseSelect') + $t('message.lifter.devName')
"
@visible-change="visibleChange"
@change="selectChange"
>
<el-option
:label="item.devName"
v-for="(item, index) in lifterList"
:key="index"
:value="item.devSn"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<!-- <el-button type="primary" @click="getListData" plain>{{
$t('message.lifter.demand')
}}</el-button> -->
<!-- <el-button type="warning" plain @click="refresh">{{
$t("message.lifter.refresh")
}}</el-button> -->
</el-form-item>
</el-form>
</div>
<div class="content whiteBlock">
<div class="bottom_info flex" style="height: 398px">
<div class="T_H_wrap" style="margin-right: 12px">
<div class="load whiteBlock">
<div class="state_title pageTitle">
{{ $t('message.lifter.realTimeVideo') }}
</div>
<div style="margin-bottom: 15px">
<el-select
size="small"
v-model="videoId"
:placeholder="$t('message.lifter.pleaseSelectVideo')"
@change="getVideo"
@visible-change="visibleChange"
>
<el-option
v-for="item in videoList"
:key="item.id"
:label="item.videoName"
:value="item.id"
>
</el-option>
</el-select>
<el-button
type="primary"
size="small"
style="margin-left: 10px; height: 32px"
plain
>{{ $t('message.lifter.demand') }}</el-button
>
</div>
<videoModule
class="playVideoBox"
:type="'1x1'"
:value="selectList"
:displayBottomMod="false"
:winNumBer="1"
:autoplay="false"
:showCaptrue="false"
:showControl="false"
:showPlayback="false"
></videoModule>
</div>
</div>
<div class="T_H_wrap" style="margin-right: 12px">
<div class="load whiteBlock">
<div class="flex2">
<div class="state_title pageTitle">
{{
company == 'longguang'
? $t('message.lifter.currentLiftOperator')
: $t('message.lifter.currentElevatorDriver')
}}
</div>
<el-button
type="primary"
size="small"
style="margin-left: 10px; margin-bottom: 15px"
@click="showDriver = true"
plain
>{{
company == 'longguang'
? $t('message.lifter.viewLiftOperator')
: $t('message.lifter.viewDriverList')
}}</el-button
>
</div>
<vue-scroll style="height: 86%">
<div
class="driver_info"
v-for="(item, index) in driverList"
:key="index"
>
<div v-if="driverList.length > 0">
<img
class="imgHead"
:src="fileUrl + item.imageUrl"
v-if="item.imageUrl"
width=""
/>
<img src="@/assets/images/profile_photo.png" v-else />
<div>
{{ $t('message.lifter.fullName') }}{{ item.workerName }}
</div>
<div>
{{ $t('message.lifter.contactNumber') }}{{
item.phoneNumber
}}
</div>
</div>
<div class="noMessage" v-else>暂无数据</div>
</div>
<!-- <div class="driver_info" v-for="item in driverList">-->
<!-- <img-->
<!-- :src="realTimeDevData.fieldAcquisitionUrl"-->
<!-- v-if="realTimeDevData.fieldAcquisitionUrl"-->
<!-- />-->
<!-- <img src="@/assets/images/profile_photo.png" v-else />-->
<!-- <div>姓名{{ realTimeDevData.driverName }}</div>-->
<!-- <div>上岗时间{{ realTimeDevData.reciveTime }}</div>-->
<!-- </div>-->
</vue-scroll>
</div>
</div>
<div class="T_H_wrap">
<div class="load whiteBlock">
<div class="state_title pageTitle">
{{ $t('message.lifter.recentWork') }}
</div>
<div class="flex">
<el-date-picker
style="width: 300px"
v-model="timeValue"
type="daterange"
size="small"
:range-separator="$t('message.lifter.to')"
:start-placeholder="$t('message.lifter.startDate')"
value-format="yyyy-MM-dd"
:end-placeholder="$t('message.lifter.deadline')"
@change="getTime"
>
</el-date-picker>
<el-button
type="primary"
size="small"
style="margin-left: 10px"
plain
@click="getRecentWorkList"
>{{ $t('message.lifter.demand') }}</el-button
>
</div>
<el-table
:data="workList"
class="tables"
style="width: 100%; min-height: 180px"
>
<el-table-column
prop="startTime"
:label="$t('message.lifter.startTime')"
width="180"
>
</el-table-column>
<el-table-column
prop="endTime"
:label="$t('message.lifter.endTime')"
width="180"
>
</el-table-column>
<el-table-column
prop="workTime"
:label="$t('message.lifter.workingHours')"
>
</el-table-column>
<el-table-column
prop="loading"
:label="$t('message.lifter.liftingWeight')"
>
</el-table-column>
<el-table-column
prop="driverName"
:label="
company == 'longguang'
? $t('message.lifter.liftOperator')
: $t('message.lifter.driver')
"
>
</el-table-column>
</el-table>
</div>
</div>
</div>
<div class="direction_data_wrap flex" style="margin-top: 5px">
<div class="data_wrap whiteBlock">
<div class="state_title pageTitle">
{{ $t('message.lifter.realTimeData') }}
</div>
<div class="flex">
<div class="data_type">
<div class="type bg1 flex2">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata11.png"
/>
<div>{{ $t('message.lifter.load') }}</div>
</div>
<div class="value">
{{ realTimeData.loading ? realTimeData.loading : 0 }} kg
</div>
</div>
<div class="type bg1 flex2 marg_t">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata13.png"
/>
<div>{{ $t('message.lifter.weightPercentage') }}</div>
</div>
<div class="value">
{{ realTimeData.loadRatio ? realTimeData.loadRatio : 0 }} %
</div>
</div>
</div>
<div class="data_type">
<div class="type bg2 flex2">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata2.png"
/>
<div>{{ $t('message.lifter.altitude') }}</div>
</div>
<div class="value">
{{ realTimeData.height ? realTimeData.height : 0 }} m
</div>
</div>
<!-- 预警 -->
<div class="type bg2 flex2 marg_t">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata10.png"
/>
<div>{{ $t('message.lifter.alarmStatus') }}</div>
</div>
<div class="value">
{{
realTimeData.isAlarm == 1
? $t('message.lifter.abnormal')
: $t('message.lifter.normal')
}}
</div>
</div>
</div>
<div class="data_type">
<div class="type bg3 flex2">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata12.png"
/>
<div>{{ $t('message.lifter.heightPercentage') }}</div>
</div>
<div class="value">
{{ floorNumS ? floorNumS : 0 }} %
</div>
</div>
<div class="type bg3 flex2 marg_t">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata6.png"
/>
<div>{{ $t('message.lifter.currentSpeed') }}</div>
</div>
<div class="value">
{{ realTimeData.speed ? realTimeData.speed : 0 }}m/s
</div>
</div>
</div>
<div class="data_type">
<div class="type bg4 flex2">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata4.png"
/>
<div>{{ $t('message.lifter.dipAngle') }}X</div>
</div>
<div class="value">
{{ realTimeData.dipAngleX ? realTimeData.dipAngleX : 0 }} °
</div>
</div>
<div class="type bg4 flex2 marg_t">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata6.png"
/>
<div>{{ $t('message.lifter.airSpeed') }}</div>
</div>
<div class="value">
{{ realTimeData.windSpeed ? realTimeData.windSpeed : 0 }}
m/s
</div>
</div>
</div>
<div class="data_type">
<div class="type bg5 flex2">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata5.png"
/>
<div>{{ $t('message.lifter.dipAngle') }}Y</div>
</div>
<div class="value">
{{ realTimeData.dipAngleY ? realTimeData.dipAngleY : 0 }} °
</div>
</div>
<div class="type bg5 flex2 marg_t">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata2.png"
/>
<div>{{ $t('message.lifter.currentFloor') }}</div>
</div>
<div class="value">{{ realTimeData.floorNum }}</div>
</div>
</div>
<div class="data_type">
<div class="type bg6 flex2">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata14.png"
/>
<div>{{ $t('message.lifter.numberOfPeople') }}</div>
</div>
<div class="value">
{{
realTimeData.peopleNumber ? realTimeData.peopleNumber : 0
}}
</div>
</div>
<div class="type bg6 flex2 marg_t">
<div class="left">
<img
src="@/assets/images/towericon/towercurrentdata10.png"
/>
<div>{{ $t('message.lifter.equipmentStatus') }}</div>
</div>
<div class="value">
{{ devOnline === 1 ? '在线' : '离线' }}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="bottom_info flex">
<div class="T_H_wrap" style="margin-right: 12px">
<div class="load whiteBlock">
<div class="state_title pageTitle">
{{
$t('message.lifter.realTime') +
$t('message.lifter.liftingWeight')
}}
</div>
<div style="height: 85%; width: 100%" ref="liftingWeight"></div>
</div>
<!-- <div class="altitude">
<div class="state_title pageTitle">{{$t('message.lifter.realTime')+$t('message.lifter.inclination')}}</div>
<div style="height: 85%; width: 100%" ref="gradient"></div>
</div> -->
</div>
<div class="T_H_wrap">
<div class="load whiteBlock">
<div class="state_title pageTitle">
{{
$t('message.lifter.realTime') + $t('message.lifter.altitude')
}}
</div>
<div style="height: 85%; width: 100%" ref="height"></div>
</div>
<!-- <div class="altitude">
<div class="state_title pageTitle">{{$t('message.lifter.realTime')+$t('message.lifter.alarm')}}</div>
<div style="height: 85%; width: 100%" ref="alarm"></div>
</div> -->
</div>
</div>
</div>
<!-- 查看司机信息 -->
<el-dialog
:modal-append-to-body="false"
:title="
company == 'longguang'
? $t('message.lifter.liftOperator')
: $t('message.lifter.driverInfo')
"
:visible.sync="showDriver"
width="667px"
>
<div class="dialog_content">
<el-table :data="driverData" class="tables" style="width: 100%">
<el-table-column
prop="workerName"
:label="$t('message.lifter.fullName')"
>
</el-table-column>
<el-table-column
prop="phoneNumber"
:label="$t('message.lifter.contactNumber')"
align="center"
>
</el-table-column>
<el-table-column
prop="imageUrl"
:label="$t('message.lifter.photo')"
align="center"
>
<template slot-scope="scope">
<img
:src="fileUrl + scope.row.fieldAcquisitionUrl"
@click="openImg(fileUrl + scope.row.fieldAcquisitionUrl)"
width="20"
alt=""
srcset=""
/>
</template>
</el-table-column>
</el-table>
</div>
</el-dialog>
</div>
</vue-scroll>
</template>
<script>
import echarts from 'echarts4';;
import {
getLifterListApi,
getLifterCurrentDataApi,
getSelectLifterBySnApi,
getSelectLifterWorkCycleListApi,
getTodayLifterCurrentDataListApi
} from "@/assets/js/api/lifter";
import {
hidePluginWindow, showPluginWindow
} from "@/components/videoModule/isc_plugin/video_isc_plugin.js";
import videoModule from "@/components/videoModule/videoModule.vue";
export default {
components: {
videoModule,
},
data() {
return {
projectSn: "",
lifterList: [],
devSn: "",
realTimeData: {
loading: 0,
loadRatio: 0,
height: 0,
heightRatio: 0,
biasAngle: 0,
biasRatio: 0,
peopleNumber: 0,
dipAngleX: 0,
speed: 0,
floorNum: 0,
windSpeed: 0,
isAlarm: 0
},
videoId: "",
videoList: [],
selectList: [], //视频数据源
realTimeDevData: {},
showDriver: false,
timeValue: "",
fileUrl: "",
workList: [],
driverList: [],
startTime: '',
endTime: '',
echartsArr: [],
devOnline: 0,
maxHeight: 0,
floorNumS: 0,
company: COMPANY,
driverData: [],
};
},
created() {
this.projectSn = this.$store.state.projectSn;
this.fileUrl = this.$store.state.FILEURL;
this.getLifterList();
},
mounted() {
},
methods: {
openImg(src) {
window.open(src)
},
//下拉框聚焦
visibleChange(val) {
if (val) {
hidePluginWindow();
} else {
showPluginWindow();
}
},
//选择时间时
getTime(val) {
if (val) {
this.startTime = val[0];
this.endTime = val[1];
} else {
this.startTime = "";
this.endTime = "";
}
},
//获取近期工作数据列表
getRecentWorkList() {
let data = {
endTime: this.endTime,
startTime: this.startTime,
devSn: this.devSn,
};
getSelectLifterWorkCycleListApi(data).then((res) => {
if (res.code == 200) {
this.workList = res.result;
}
});
},
//下拉选择
selectChange(val) {
this.devSn = val
this.floorNumS = 0
console.log("下拉时的devSn----", this.devSn);
this.getSelectLifterBySn();
this.getRecentWorkList();
this.getTodayLifterCurrentDataList();
setTimeout(() => {
this.getListData();
}, 1000)
},
//获取设备列表下拉
getLifterList() {
let data = {
projectSn: this.projectSn,
};
getLifterListApi(data).then((res) => {
if (res.code == 200) {
this.lifterList = res.result;
if (res.result.length > 0) {
this.devSn = res.result[0].devSn;
this.getSelectLifterBySn();
this.getRecentWorkList();
this.getTodayLifterCurrentDataList();
setTimeout(() => {
this.getListData();
}, 1000)
}
}
});
},
//获取 设备 视频列表
getSelectLifterBySn() {
let data = {
devSn: this.devSn
}
getSelectLifterBySnApi(data).then(res => {
this.maxHeight = res.result.lifter.maxHeight
console.log("9999999999999999", res);
if (res.code == 200) {
if (res.result.currentDriver != null) {
this.driverList = [res.result.currentDriver]
} else {
this.driverList = []
}
this.driverData = res.result.driverList != [] ? res.result.driverList : []
this.videoList = res.result.videoList;
this.devOnline = res.result.lifter.devOnline
if (res.result.videoList.length > 0) {
this.videoId = res.result.videoList[0].id;
this.getVideo(res.result.videoList[0].id);
}
}
})
},
//获取实时数据
getListData() {
let data = {
devSn: this.devSn,
};
getLifterCurrentDataApi(data).then((res) => {
if (res.code == 200) {
if (res.result) {
this.realTimeData = res.result;
console.log("66666666666666666666", this.maxHeight);
if (!this.maxHeight) {
this.$message.error(this.$t('message.lifter.theHeightIsZero'));
return
}
console.log('计算之前1', res.result.height);
console.log('计算之前2', this.maxHeight);
let Num = res.result.height / this.maxHeight * 100
console.log('计算后的值', Num);
this.floorNumS = Num.toFixed(2)
this.getSelectLifterBySn();
this.realTimeDevData = res.result;
this.getTodayLifterCurrentDataList();
} else {
this.realTimeData = {
loading: 0,
loadRatio: 0,
height: 0,
heightRatio: 0,
biasAngle: 0,
biasRatio: 0,
peopleNumber: 0,
dipAngleX: 0,
speed: 0,
floorNum: 0,
windSpeed: 0,
isAlarm: 0
}
this.echartsArr = []
this.createdEcharts();
}
}
});
},
//选择的视频
getVideo(val) {
for (let i = 0; i < this.videoList.length; i++) {
if (val == this.videoList[i].id) {
this.selectList = [this.videoList[i]];
}
}
},
//刷新
refresh() {
this.devSn = "";
},
//获取图表数据
getTodayLifterCurrentDataList() {
let data = {
devSn: this.devSn
};
getTodayLifterCurrentDataListApi(data).then(res => {
if (res.code == 200) {
if (res.result) {
this.echartsArr = res.result;
} else {
this.echartsArr = []
}
this.createdEcharts(); //创建图表
}
})
},
//创建图表
createdEcharts() {
var chart1 = echarts.init(this.$refs.liftingWeight);
// var chart2 = echarts.init(this.$refs.gradient);
var chart3 = echarts.init(this.$refs.height);
// var chart4 = echarts.init(this.$refs.alarm);
chart1.clear();
// chart2.clear();
chart3.clear();
// chart4.clear();
chart1.setOption(this.getOption(0));
// chart2.setOption(this.getOption(1));
chart3.setOption(this.getOption(2));
// chart4.setOption(this.getOption(3));
},
//图表信息
getOption(index) {
let heightArr = [];
let loadArr = [];
let timeArr = [];
for (let i = 0; i < this.echartsArr.length; i++) {
let time = this.echartsArr[i].reciveTime.substring(12);
heightArr.push(this.echartsArr[i].height);
loadArr.push(this.echartsArr[i].loading);
timeArr.push(time)
}
var colors = ["#3A7BFF", "#55CBBB", "#B59CF2", "#F3D025"];
var opt = {
color: colors,
tooltip: {
trigger: "axis",
},
grid: {
top: 30,
bottom: 30,
},
// legend: {},
xAxis: {
type: "category",
axisTick: {
show: false,
},
axisLine: {
show: false,
},
data: timeArr,
axisLabel: {
//X轴刻度配置
interval: "auto", //0表示全部显示不间隔auto:表示自动根据刻度个数和宽度自动设置间隔个数
},
},
yAxis: {
name: [
this.$t("message.lifter.load") + "(kg)",
this.$t("message.lifter.angle") + "(°)",
this.$t("message.lifter.altitude") + "(m)",
this.$t("message.lifter.alarm") +
"(" +
this.$t("message.lifter.next") +
")",
][index],
axisTick: {
show: false,
},
axisLine: {
show: false,
},
splitLine: {
lineStyle: {
color: "#eee",
},
},
},
dataZoom: [
{
show: true,
// realtime: true,
start: 0,
end: 100,
height: 8,
borderColor: "transparent",
backgroundColor: "#e8e8e8",
filterColor: "#999999",
bottom: 0,
},
],
series: [
{
name: [
this.$t("message.lifter.load"),
this.$t("message.lifter.angle"),
this.$t("message.lifter.altitude"),
this.$t("message.lifter.alarm"),
][index],
type: "line",
symbol: "none",
smooth: true,
data: index == 0 ? loadArr : heightArr,
// markLine: getMarkLine(index),
itemStyle: {
normal: {
lineStyle: {
color: colors[index],
},
areaStyle: {
color: colors[index],
opacity: 0.1,
},
},
},
},
],
};
return opt;
},
},
};
</script>
<style lang="less" scoped>
.flex {
display: flex;
}
.flex2 {
display: flex;
align-items: center;
justify-content: space-between;
}
.operationInfo {
width: 100%;
height: 100%;
.title {
padding: 0 20px;
padding-top: 17px;
height: 70px;
box-sizing: border-box;
}
.content {
margin-top: 12px;
box-sizing: border-box;
width: 100%;
height: 298px;
.pageTitle {
line-height: 20px;
}
.direction_data_wrap {
box-sizing: border-box;
height: 260px;
width: 100%;
.data_wrap {
width: 100%;
height: 100%;
padding: 12px 20px;
box-sizing: border-box;
.data_type {
width: 16%;
margin-right: 12px;
.type {
width: 100%;
height: 80px;
border-radius: 8px;
box-sizing: border-box;
padding: 10px 15px;
color: #ffffff;
font-size: 14px;
line-height: 20px;
text-align: center;
.left {
width: 45%;
}
}
.value {
font-size: 24px;
font-weight: 500;
text-align: right;
}
}
.marg_t {
margin-top: 12px;
}
}
}
.bottom_info {
width: 100%;
height: calc(100%);
margin-top: 12px;
box-sizing: border-box;
.T_H_wrap {
width: 50%;
height: 100%;
box-sizing: border-box;
.load {
width: 100%;
height: calc(100% - 6px);
// background: #fff;
padding: 12px 20px;
box-sizing: border-box;
}
.altitude {
margin-top: 12px;
width: 100%;
height: calc(50% - 6px);
background: #fff;
padding: 12px 20px;
box-sizing: border-box;
}
}
}
}
.playVideoBox {
width: 90%;
height: calc(100% - 100px);
}
.driver_info {
/*text-align: center;*/
line-height: 25px;
.noMessage {
height: 315px;
line-height: 315px;
text-align: center;
}
.imgHead {
width: 100px;
}
img {
margin-bottom: 18px;
}
div {
padding: 0 20px;
text-align: left;
}
}
.bg1 {
background-color: #7ba6ff;
background-image: none;
}
.bg2 {
background-color: #55cbbb;
}
.bg3 {
background-color: #84ccf3;
}
.bg4 {
background-color: #b59cf2;
}
.bg5 {
background-color: #f6b87d;
}
.bg6 {
background-color: #9ed96b;
}
}
</style>