You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1043 lines
29 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<div class="headTitle">门匹配生产数据监控平台</div>
<div class="topNum planNum">{{
(['0', '0', '0', '0']).concat(planNum.toString().split('')).slice(-4).join('')
}}
</div>
<div class="topNum practicalNum">
{{
(['0', '0', '0', '0']).concat(practicalNum.toString().split('')).slice(-4).join('')
}}
</div>
<div class="topNum differenceValue">
{{ (['0', '0', '0', '0']).concat(differenceNum.toString().split('')).slice(-4).join('') }}
</div>
<div class="title" v-for="(i,k) in title"
:style="'top:'+(titlePosition[k]&&titlePosition[k].top||0)+'%;left:'+(titlePosition[k]&&titlePosition[k].left||0)+'%'">
{{ i }}
</div>
<div style="position: absolute;transform: translateY(-50%);top: 24.4%;left: 31%;color: #fff;font-size: 0.8vw;">设备状态:</div>
<div style="position: absolute;transform: translateY(-50%);top: 27.4%;left: 31%;color: #fff;font-size: 0.8vw;">发泡线状态:</div>
<div style="position: absolute;transform: translateY(-50%);top: 32.2%;left: 31%;color: #fff;font-size: 0.8vw;">发泡机状态:</div>
<div class="status1"
:style="'background-color:'+(status1 === '1' ? '#00ff00':'ff0000')"></div>
<div class="status2"
:style="'background-color:'+(status2 === '1' ? '#00ff00':'ff0000')"></div>
<div style="position: absolute; top: 23%;left: 60%;width:10vw;color: #fff;font-size: 0.8vw;line-height: 1.5vw">
<div>生产节拍:</div>
<div>线体1圈 <span style="margin-left: 10px">{{ ' ' + meter1 }}</span>s</div>
<div>台车1位 <span style="margin-left: 10px">{{ ' ' + meter2 }}</span>s</div>
</div>
<div class="foamingMachine"></div>
<div class="supplementInfo">注射压力标准范围10.0-14.0Mpa A、B组份枪头压力差≤1Mpa</div>
<div class="supplementInfo1">发泡料温度标准范围:18.0-24.0℃</div>
<div style="position: absolute;top: 62%; left: 40%;color:#FFF">
<div style="width: 12px;height: 12px;background-color: #1be409;display: inline-block;margin: 0 8px;"></div>
启用
<div style="width: 12px;height: 12px;background-color: #8a8e96;display: inline-block;margin: 0 8px;"></div>
停用
<div style="width: 12px;height: 12px;background-color: #ff0000;display: inline-block;margin: 0 8px;"></div>
注料位
<div style="width: 12px;height: 12px;background-color: #ff8000;display: inline-block;margin: 0 8px;"></div>
出模位
</div>
<div style="position: absolute;top: 62%; left: 20%;color:#FFF">
门体发泡总产量:{{ total }}
</div>
<div class="scrollTable">
<div style="background-color: #094170">
<div class="scrollTableItem" style="font-weight: bold;width: 10%;padding:4px 0; ">
序号
</div>
<div class="scrollTableItem" style="font-weight: bold;width: 45%;padding:4px 0; ">
型号
</div>
<div class="scrollTableItem" style="font-weight: bold;width: 45%;padding:4px 0; ">
扫描时间
</div>
</div>
<vue-seamless-scroll :class-option="scrollTableOption" :data="scrollTableData" class="case-item"
style="height: 84%;overflow: hidden;">
<div v-for="(item, index) in scrollTableData" :key="index">
<div :style='"background-color:" + ((index % 2 === 0) ? "#053460" : "#032d57")'>
<div class="scrollTableItem" style="width: 10%;padding:4px 0 ">
{{ item.COLUMN_A }}
</div>
<div class="scrollTableItem" style="width: 45%;padding:4px 0 ">
{{ item.COLUMN_B }}
</div>
<div class="scrollTableItem" style="width: 45%;padding:4px 0 ">
{{ item.COLUMN_C }}
</div>
</div>
</div>
</vue-seamless-scroll>
</div>
<div class="chart1">
<Chart ref="chart1"></Chart>
</div>
<div class="chart2">
<Chart ref="chart2"></Chart>
</div>
<div class="chart3">
<Chart ref="chart3"></Chart>
</div>
<div class="chart4">
<Chart ref="chart4"></Chart>
</div>
<div class="tableOne">
<div style="height: 9%;line-height:2.6vh;color: #fff;text-align: center;background-color: #38a2decc ">
<div style="width: 33%;display: inline-block">台车号</div>
<div style="width: 33%;display: inline-block">型号</div>
<div style="width: 33%;display: inline-block">产量</div>
</div>
<div v-for="i in bottomTableData.slice(0,10)"
:style="'margin-bottom:2px;height: calc(9% - 2px);line-height:calc(2.6vh - 2px);color: '+ setColor(i.COLUMN_D,i.COLUMN_E)+';text-align: center;background-color:#053460'">
<div style="width: 33%;display: inline-block">{{ i.COLUMN_A }}</div>
<div style="width: 33%;display: inline-block">{{ i.COLUMN_B }}</div>
<div style="width: 33%;display: inline-block">{{ i.COLUMN_C }}</div>
</div>
</div>
<div class="tableTwo">
<div style="height: 9%;line-height:2.6vh;color: #fff;text-align: center;background-color: #38a2decc">
<div style="width: 33%;display: inline-block">台车号</div>
<div style="width: 33%;display: inline-block">型号</div>
<div style="width: 33%;display: inline-block">产量</div>
</div>
<div v-for="i in bottomTableData.slice(10,20)"
:style="'margin-bottom:2px;height: calc(9% - 2px);line-height:calc(2.6vh - 2px);color:'+ setColor(i.COLUMN_D,i.COLUMN_E)+';text-align: center;background-color:#053460'">
<div style="width: 33%;display: inline-block">{{ i.COLUMN_A }}</div>
<div style="width: 33%;display: inline-block">{{ i.COLUMN_B }}</div>
<div style="width: 33%;display: inline-block">{{ i.COLUMN_C }}</div>
</div>
</div>
<div class="tableThree">
<div style="height: 9%;line-height:2.6vh;color: #fff;text-align: center;background-color: #38a2decc">
<div style="width: 33%;display: inline-block">台车号</div>
<div style="width: 33%;display: inline-block">型号</div>
<div style="width: 33%;display: inline-block">产量</div>
</div>
<div v-for="i in bottomTableData.slice(20,30)"
:style="'margin-bottom:2px;height: calc(9% - 2px);line-height:calc(2.6vh - 2px);color:'+ setColor(i.COLUMN_D,i.COLUMN_E)+';text-align: center;background-color:#053460'">
<div style="width: 33%;display: inline-block">{{ i.COLUMN_A }}</div>
<div style="width: 33%;display: inline-block">{{ i.COLUMN_B }}</div>
<div style="width: 33%;display: inline-block">{{ i.COLUMN_C }}</div>
</div>
</div>
<div class="tableFour">
<div style="height: 9%;line-height:2.6vh;color: #fff;text-align: center;background-color: #38a2decc">
<div style="width: 33%;display: inline-block">台车号</div>
<div style="width: 33%;display: inline-block">型号</div>
<div style="width: 33%;display: inline-block">产量</div>
</div>
<div v-for="i in bottomTableData.slice(30,40)"
:style="'margin-bottom:2px;height: calc(9% - 2px);line-height:calc(2.6vh - 2px);color:'+ setColor(i.COLUMN_D,i.COLUMN_E)+';text-align: center;background-color:#053460'">
<div style="width: 33%;display: inline-block">{{ i.COLUMN_A }}</div>
<div style="width: 33%;display: inline-block">{{ i.COLUMN_B }}</div>
<div style="width: 33%;display: inline-block">{{ i.COLUMN_C }}</div>
</div>
</div>
</div>
</template>
<script>
import vueSeamlessScroll from "vue-seamless-scroll";
import Chart from "../../../components/board/Chart";
import * as echarts from 'echarts'
import {getData} from "@/api/board/getData";
import {mixData} from "@/api/board/mixData";
let intervalFun = null
export default {
components: {
vueSeamlessScroll,
Chart
},
name: "Liner",
data() {
return {
total:'',
title: [
'箱体队列',
'箱体队列统计',
'生产统计数据',
'发泡注射压力监控',
'发泡料温度监控',
'门体发泡生产统计',
],
status1: 0,
status2: 0,
meter1: 0,
meter2: 0,
titlePosition: [
{
top: 11.5,
left: 5.5
},
{
top: 39.2,
left: 5.5
},
{
top: 62.8,
left: 5.5
},
{
top: 11.5,
left: 75
},
{
top: 39.3,
left: 75
},
{
top: 62.9,
left: 75
},
],
show: 0,
planNum: 0,
practicalNum: 0,
differenceNum:0,
scrollTableOption: {
step: 0.5, // 数值越大速度滚动越快
limitMoveNum: 9999999999, // 开始无缝滚动的数据量 this.dataList.length
hoverStop: true, // 是否开启鼠标悬停stop
direction: 1, // 0向下 1向上 2向左 3向右
openWatch: true, // 开启数据实时监控刷新dom
singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
waitTime: 0,
},
scrollTableData: [],
bottomTableData: [],
RequestDataSet: [
{
e: 'xm-01',
i: "scada_pp_xt_queue_01('')",
f: (e) => {
this.scrollTableData = e
}
},
{
e: 'xm-02',
i: "scada_pp_xt_tj_01('')",
f: (e) => {
this.$refs.chart2.setData({
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "0",
right: "4%",
bottom: 0,
top: 20,
containLabel: true,
},
xAxis: {
type: "category",
data: e.map(val => val.X_VALUE),
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
interval: 0,
// rotate: 40,
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: false,
},
axisLabel: {},
},
series: [
{
name: '数量',
type: "bar",
barMaxWidth: 60,
barWidth: "40%",
label: {
show: true,
position: "top",
textStyle: {
color: "#49d9ff",
},
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#47cbfd",
},
{
offset: 1,
color: "#3e8aff",
},
]),
borderRadius: 3,
},
},
data: e.map(val => val.Y_VALUE),
},
],
})
}
},
{
e: 'xm-03',
i: "scada_pp_fp_zt_01('')",
f: (e) => {
this.$refs.chart1.setData({
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "0",
right: "4%",
bottom: "0",
top: 35,
containLabel: true,
},
legend: {
data: ['POL压力', 'ISO压力'],
right: 'center',
top: 0,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
// itemGap: 35
},
xAxis: {
type: "category",
data: e.map(val => val.X_VALUE),
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
// interval: 0,
// rotate: 40,
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
min: 10,
max: 14,
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: false,
},
axisLabel: {},
},
series: [
{
name: 'POL压力',
type: "bar",
barWidth: "30%",
label: {
show: true,
position: "top",
textStyle: {
color: "#49d9ff",
},
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#39ffff",
},
{
offset: 1,
color: "#f5804d",
},
]),
borderRadius: 2,
},
},
data: e.map(val => {
if (val.Y_VALUE_ONE === 0) {
return null
} else {
return val.Y_VALUE_ONE
}
}),
},
{
name: 'ISO压力',
type: "bar",
barWidth: "30%",
barGap: '40%',
label: {
show: true,
position: "top",
textStyle: {
color: "#49d9ff",
},
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#47cbfd",
},
{
offset: 1,
color: "#3e8aff",
},
]),
borderRadius: 2,
},
},
data: e.map(val => {
if (val.Y_VALUE_TWO === 0) {
return null
} else {
return val.Y_VALUE_TWO
}
}),
},
],
})
}
},
{
e: 'xm-04',
i: "scada_pp_fp_temp_01('')",
f: (e) => {
this.$refs.chart3.setData({
legend: {
data: ['POL温度', 'ISO温度'],
right: 'center',
top: 0,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
// itemGap: 35
},
tooltip: {
trigger: "axis",
axisPointer: {
lineStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgba(0, 255, 233,0)",
},
{
offset: 0.5,
color: "rgba(255, 255, 255,1)",
},
{
offset: 1,
color: "rgba(0, 255, 233,0)",
},
],
global: false,
},
},
},
},
grid: {
top: "15%",
left: 40,
right: "5%",
bottom: "15%",
// containLabel: true
},
xAxis: [
{
show: false,
type: "category",
axisLine: {
show: true,
},
splitArea: {
// show: true,
color: "#f00",
lineStyle: {
color: "#f00",
},
},
axisLabel: {
color: "#fff",
},
splitLine: {
show: false,
},
boundaryGap: false,
data: e.map(val => val.X_VALUE),
},
],
yAxis: [
{
type: "value",
min: 18,
max: 24,
splitNumber: 4,
splitLine: {
show: true,
lineStyle: {
color: "rgba(255,255,255,0.1)",
},
},
axisLine: {
show: true,
},
axisLabel: {
show: true,
margin: 20,
textStyle: {
color: "#d1e6eb",
},
},
axisTick: {
show: true,
},
},
],
series: [
{
name: 'POL温度',
type: "line",
showAllSymbol: true,
symbol: "circle",
symbolSize: 5,
lineStyle: {
normal: {
color: "#49d9ff",
},
},
label: {
show: true,
position: "top",
textStyle: {
color: "#49d9ff",
},
},
itemStyle: {
color: "#49d9ff",
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{
offset: 0,
color: "rgba(108,80,243,0.3)",
},
{
offset: 1,
color: "rgba(108,80,243,0)",
},
],
false
),
shadowColor: "rgba(108,80,243, 0.9)",
shadowBlur: 20,
},
},
data: e.map(val => {
if (val.Y_VALUE_ONE === 0) {
return null
} else {
return val.Y_VALUE_ONE
}
}),
},
{
name: 'ISO温度',
type: "line",
// smooth: true, //是否平滑
showAllSymbol: true,
// symbol: 'image://./static/images/guang-circle.png',
symbol: "circle",
symbolSize: 5,
lineStyle: {
normal: {
color: "#668e84",
},
},
label: {
show: true,
position: "top",
textStyle: {
color: "#668e84",
},
},
itemStyle: {
color: "#00ca95",
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{
offset: 0,
color: "rgba(0,202,149,0.3)",
},
{
offset: 1,
color: "rgba(0,202,149,0)",
},
],
false
),
shadowColor: "rgba(0,202,149, 0.9)",
shadowBlur: 20,
},
},
data: e.map(val => {
if (val.Y_VALUE_TWO === 0) {
return null
} else {
return val.Y_VALUE_TWO
}
}),
},
],
})
}
},
{
e: 'xm-05',
i: "scada_pp_fp_tj_01('')",
f: (e) => {
this.$refs.chart4.setData({
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "0",
right: "4%",
bottom: "0",
top: "10%",
containLabel: true,
},
xAxis: {
type: "category",
data: e.map(val => val.X_VALUE),
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
interval: 0,
// rotate: 40,
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: false,
},
axisLabel: {},
},
series: [
{
name: '产量',
type: "bar",
barWidth: "33%",
barMaxWidth: 60,
label: {
show: true,
position: "top",
textStyle: {
color: "#49d9ff",
},
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#39ffff",
},
{
offset: 1,
color: "#f5804d",
},
]),
borderRadius: 2,
},
},
data: e.map(val => val.Y_VALUE),
},
],
})
}
},
{
e: 'xm-06',
i: "scada_pp_pro_stat_01('')",
f: (e) => {
this.bottomTableData = e
let a = 0
let b = 0
e.forEach(v=>{
a += parseFloat(v.COLUMN_C.split('-')[0])
b += parseFloat(v.COLUMN_C.split('-')[1])
})
this.total = a+' - '+b
}
},
{
e: 'xm-07',
i: "scada_fp_cy_01('CX_02')",
f: (e) => {
console.log(e)
this.planNum = e[0]?.X_VALUE || 0
this.practicalNum = e[0]?.Y_VALUE_ONE || 0
this.differenceNum = e[0]?.Y_VALUE_TWO || 0
}
},
{
e: 'xm-08',
i: "scada_pp_zt_jp_01('')",
f: (e) => {
this.status1 = e[0]?.X_VALUE
this.status2 = e[0]?.X_VALUE
this.meter1 = e[0]?.Y_VALUE_ONE
this.meter2 = e[0]?.Y_VALUE_TWO
}
},
]
}
},
mounted() {
let timeInter = setInterval(() => {
this.show = (this.show + 1) % 4
}, 10 * 1000)
this.RequestDataSet.forEach(val => {
mixData(val)
})
intervalFun = setInterval(() => {
this.RequestDataSet.forEach(val => {
mixData(val)
})
}, 1000 * 10)
},
beforeDestroy() {
if(intervalFun){
clearInterval(intervalFun)
intervalFun = null
}
},
methods: {
setColor: (e, i) => {
if (e === '1') {
if (i === '1') {
return '#ffb769'
} else if (i === '3') {
return '#ff5959'
} else {
return '#1be409'
}
} else {
return '#bed4ce'
}
}
}
};
</script>
<style scoped>
.foamingMachine {
background-image: url("../../../assets/board/foamingMachine1.png");
background-repeat: no-repeat;
background-size: 100% 100%;
position: absolute;
transform: translateX(-50%);
top: 23%;
left: 50%;
width: 46vw;
height: 23vw;
}
.app-container {
background-image: url("../../../assets/board/foaming1.jpg");
background-repeat: no-repeat;
background-size: 100% 100%;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
.headTitle {
position: absolute;
top: 5%;
left: 50%;
transform: translate(-50%, -100%);
font-size: 1.5vw;
color: #d6eaed;
letter-spacing: 10px;
}
.topNum {
position: absolute;
transform: translate(-50%, -50%);
color: #5db9e8;
top: 17.1%;
letter-spacing: 2vw;
}
.planNum {
font-size: 1.7vw;
left: 36.5%;
}
.practicalNum {
left: 50.9%;
font-size: 1.7vw;
color: #97febd;
}
.differenceValue {
font-size: 1.7vw;
left: 65.4%;
color: #b15462;
}
.scrollTable {
position: absolute;
top: 15%;
left: 4%;
width: 23%;
height: 20%;
}
.scrollTableItem {
color: rgb(185, 186, 192);
margin: auto 0px;
padding: 0 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-align: center;
display: inline-block;
width: 16.6%;
}
.chart1 {
position: absolute;
top: 14.5%;
left: 73%;
width: 23.5%;
height: 21%;
}
.chart2 {
position: absolute;
top: 43%;
left: 3.6%;
width: 23.3%;
height: 15.5%;
}
.chart3 {
position: absolute;
top: 42%;
left: 73%;
width: 23.5%;
height: 18.5%;
}
.chart4 {
position: absolute;
top: 66.2%;
left: 73%;
width: 23.5%;
height: 28.5%;
}
.status1 {
position: absolute;
transform: translate(-50%, -50%);
top: 27.4%;
left: 37.5%;
width: 1.5vw;
height: 1.5vw;
background: #00ff00;
border-radius: 50%;
}
.status2 {
position: absolute;
transform: translate(-50%, -50%);
top: 32.2%;
left: 37.5%;
width: 1.5vw;
height: 1.5vw;
background: #00ff00;
border-radius: 50%;
}
.scrollTable1 {
position: absolute;
top: 66%;
left: 3.5%;
width: 68%;
height: 25%;
}
.total {
position: absolute;
top: 91%;
left: 3.5%;
width: 68%;
height: 3%;
}
.table1-enter-active {
animation: table-in .5s;
}
.table1-leave-active {
animation: table-in .5s reverse;
}
@keyframes table-in {
0% {
opacity: 0;
transform: scale(0);
}
100% {
opacity: 1;
transform: scale(1);
}
}
.supplementInfo {
position: absolute;
top: 35.5%;
left: 73.6%;
font-size: 0.7vw;
color: #fff;
}
.supplementInfo1 {
position: absolute;
top: 59%;
left: 73.6%;
font-size: 0.7vw;
color: #fff;
}
.tableOne {
position: absolute;
top: 66%;
left: 3.5%;
width: 17%;
height: 29%;
}
.tableTwo {
position: absolute;
top: 66%;
left: 20.7%;
width: 16.8%;
height: 29%;
}
.tableThree {
position: absolute;
top: 66%;
left: 37.7%;
width: 16.8%;
height: 29%;
}
.tableFour {
position: absolute;
top: 66%;
left: 54.7%;
width: 16.8%;
height: 29%;
}
.title {
position: absolute;
transform: translateY(-50%);
color: #dddddd;
font-size: 1vw;
letter-spacing: 2px;
}
</style>