zhgdyun/src/views/projectFront/lifter/operationInfo.vue

815 lines
25 KiB
Vue
Raw Normal View History

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