zhgdyun/src/views/projectFront/lifter/operationInfo.vue
2022-06-08 14:51:11 +08:00

815 lines
25 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'
>
<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-if="company == 'longguang' || item.idCard == realTimeDevData.driverIdCard" v-for="item in driverList">
<img
class="imgHead"
:src="fileUrl + item.fieldAcquisitionUrl"
v-if="item.fieldAcquisitionUrl"
width=""
/>
<img src="@/assets/images/profile_photo.png" v-else />
<div>{{ $t("message.lifter.fullName") }}{{ item.workerName }}</div>
<div>{{ $t("message.lifter.contactNumber") }}{{ item.emergentPhone }}</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 v-if="floorNumS" class="value">{{ floorNumS?floorNumS:"--" }} %</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===0? $t("message.lifter.offLine") : $t("message.lifter.onLine") }}</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="driverList" class="tables" style="width: 100%">
<el-table-column prop="workerName" :label="$t('message.lifter.fullName')"> </el-table-column>
<el-table-column prop="emergentPhone" :label="$t('message.lifter.contactNumber')">
</el-table-column>
<el-table-column prop="address" :label="$t('message.lifter.photo')">
<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:'',
floorNumS:"",
company:COMPANY
};
},
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;
}
});
},
//获取设备列表下拉
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.getListData();
this.getSelectLifterBySn();
this.getRecentWorkList();
this.getTodayLifterCurrentDataList();
}
}
});
},
//获取 设备 视频列表
getSelectLifterBySn(){
let data = {
devSn:this.devSn
}
getSelectLifterBySnApi(data).then(res=>{
this.maxHeight = res.result.lifter.maxHeight
if(res.code==200){
this.videoList = res.result.videoList;
this.devonline=res.result.lifter.devonline
this.driverList = res.result.driverList;
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(this.maxHeight);
if (!this.maxHeight){
this.$message.error(this.$t('message.lifter.theHeightIsZero'));
return
}
let Num = res.result.height/this.maxHeight*100
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 {
height: calc(100% - 90px);
}
.driver_info {
/*text-align: center;*/
line-height: 25px;
margin-top: 100px;
.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>