| | |
| | | <script setup> |
| | | import { onBeforeUnmount, onMounted, onUnmounted, ref, computed, nextTick } from "vue"; |
| | | import { onBeforeUnmount, onMounted, onUnmounted, ref, computed, nextTick, watch } from "vue"; |
| | | import { useRouter } from "vue-router" |
| | | import { host, WebSocketHost } from '@/utils/constants' |
| | | import request from "@/utils/request" |
| | |
| | | const edgTwoTasks = ref([]) |
| | | const engineeringOne = ref([]) |
| | | const engineeringTwo = ref([]) |
| | | |
| | | let myChartLoad = null; |
| | | let myChartEdg = null; |
| | | let myChartTemp = null; |
| | | let myChartHollow = null; |
| | | const socketUrl1 = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/largenScreen`; |
| | | const handleMessage1 = (data) => { |
| | | edgOneTasks.value = data.edgOneTasks[0]; |
| | |
| | | engineeringTwo.value = data.engineeringTwo[0]; |
| | | if (numBoxes.value != edgOneTasks.value.length) { |
| | | numBoxes.value = edgOneTasks.value.length; |
| | | boxStart(); |
| | | initBoxes(boxes, numBoxes, 'firstup'); |
| | | |
| | | } |
| | | if (numBoxes2.value != edgTwoTasks.value.length) { |
| | | numBoxes2.value = edgTwoTasks.value.length; |
| | | boxStart2(); |
| | | initBoxes(boxes2, numBoxes2, 'firstup'); |
| | | } |
| | | const pieChartVOS = ref([]); |
| | | pieChartVOS.value = data.pieChartVOS[0]; |
| | | let oneFinish = ref(); |
| | | let twoFinish = ref(); |
| | | let oneunFinish = ref(); |
| | | let twounFinish = ref(); |
| | | if (pieChartVOS.value.length > 0) { |
| | | if (load.value) { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedQuantity; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedQuantity; |
| | | oneunFinish = pieChartVOS.value[0].oneUncompletedQuantity; |
| | | twounFinish = pieChartVOS.value[0].twoUncompletedQuantity; |
| | | } else { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedArea; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedArea; |
| | | oneunFinish = pieChartVOS.value[0].oneUncompletedArea; |
| | | twounFinish = pieChartVOS.value[0].twoUncompletedArea; |
| | | } |
| | | } else { |
| | | oneFinish = 0; |
| | | twoFinish = 0; |
| | | oneunFinish = 0; |
| | | twounFinish = 0; |
| | | } |
| | | |
| | | |
| | | const chartDomOne = chartOne.value; |
| | | if (!chartDomOne) { |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | const myChartOne = echarts.init(chartDomOne); |
| | | const optionOne = { |
| | | title: { |
| | | text: t('large.load'), |
| | | subtext: '', |
| | | left: 'right' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'vertical', |
| | | left: 'left' |
| | | }, |
| | | series: [ |
| | | { |
| | | name: '', |
| | | type: 'pie', |
| | | radius: '50%', |
| | | data: [ |
| | | { value: oneFinish, name: t('large.oneFinish') }, |
| | | { value: twoFinish, name: t('large.twoFinish') }, |
| | | { value: oneunFinish, name: t('large.oneunFinish') }, |
| | | { value: twounFinish, name: t('large.twounFinish') }, |
| | | ], |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | } |
| | | ], |
| | | graphic: [ |
| | | { |
| | | type: 'rect', |
| | | left: 'center', |
| | | top: 0, |
| | | shape: { |
| | | width: 80, |
| | | height: 30 |
| | | }, |
| | | style: { |
| | | text: load.value == true ? t('large.quantity') : t('large.are'), |
| | | fill: '#5470C6', |
| | | stroke: '#000', |
| | | lineWidth: 1 |
| | | }, |
| | | onclick: function () { |
| | | load.value = !load.value; |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | |
| | | myChartOne.setOption(optionOne); |
| | | timeAxisCreate("切割当天运行情况", chartLoad.value, myChartLoad, data.loadRunTimes[0]); |
| | | timeAxisCreate("磨边当天运行情况", chartEdg.value, myChartEdg, data.loadRunTimes[0]); |
| | | }; |
| | | let socket2 = null; |
| | | const temperingTaskType = ref([]) |
| | |
| | | temperingGlassInfoList.value = data.temperingGlassInfoList[0]; |
| | | if (numBoxes3.value != temperingTaskType.value) { |
| | | numBoxes3.value = temperingTaskType.value; |
| | | boxStart3(); |
| | | initBoxes(boxes3, numBoxes3, 'secondleft'); |
| | | } |
| | | if (temperingGlassInfoList.value > 1) { |
| | | numBoxes4.value = 1; |
| | | } else { |
| | | numBoxes4.value = 0; |
| | | } |
| | | temperingGlassInfoInList.value = data.temperingGlassInfoInList[0]; |
| | | const pieChartVOS = ref([]); |
| | | pieChartVOS.value = data.pieChartVOS[0]; |
| | | let oneFinish = ref(); |
| | | let ondDamage = ref(); |
| | | let oneunFinish = ref(); |
| | | if (pieChartVOS.value.length > 0) { |
| | | if (temp.value) { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedQuantity; |
| | | ondDamage = pieChartVOS.value[0].oneDamageQuantity; |
| | | oneunFinish = pieChartVOS.value[0].oneUncompletedQuantity; |
| | | } else { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedArea; |
| | | ondDamage = pieChartVOS.value[0].oneDamageArea; |
| | | oneunFinish = pieChartVOS.value[0].oneUncompletedArea; |
| | | if (temperingGlassInfoList.value >= 1) { |
| | | if (numBoxes4.value != 1) { |
| | | numBoxes4.value = 1; |
| | | initBoxes(boxes4, numBoxes4, 'right'); |
| | | } |
| | | } else { |
| | | oneFinish = 0; |
| | | ondDamage = 0; |
| | | oneunFinish = 0; |
| | | if (numBoxes4.value != 0) { |
| | | numBoxes4.value = 0; |
| | | initBoxes(boxes4, numBoxes4, 'right'); |
| | | } |
| | | |
| | | } |
| | | |
| | | temperingGlassInfoInList.value = data.temperingGlassInfoInList[0]; |
| | | |
| | | const chartDomOne = chartThree.value; |
| | | if (!chartDomOne) { |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | const myChartOne = echarts.init(chartDomOne); |
| | | const optionOne = { |
| | | title: { |
| | | text: t('large.temp'), |
| | | subtext: '', |
| | | left: 'right' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'vertical', |
| | | left: 'left' |
| | | }, |
| | | series: [ |
| | | { |
| | | name: '', |
| | | type: 'pie', |
| | | radius: '50%', |
| | | data: [ |
| | | { value: oneFinish, name: t('large.oneFinish') }, |
| | | { value: ondDamage, name: t('large.ondDamage') }, |
| | | { value: oneunFinish, name: t('large.oneunFinish') }, |
| | | ], |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | } |
| | | ], |
| | | graphic: [ |
| | | { |
| | | type: 'rect', |
| | | left: 'center', |
| | | top: 0, |
| | | shape: { |
| | | width: 80, |
| | | height: 30 |
| | | }, |
| | | style: { |
| | | text: temp.value == true ? t('large.quantity') : t('large.are'), |
| | | fill: '#5470C6', |
| | | stroke: '#000', |
| | | lineWidth: 1 |
| | | }, |
| | | onclick: function () { |
| | | temp.value = !temp.value; |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | |
| | | myChartOne.setOption(optionOne); |
| | | }; |
| | | let socket3 = null; |
| | | const bigStorageCageUsage = ref([]) |
| | | const socketUrl3 = `ws://${WebSocketHost}:${host}/api/cacheVerticalGlass/api/talk/largenScreen`; |
| | | const handleMessage3 = (data) => { |
| | | bigStorageCageUsage.value = data.bigStorageCageUsage[0]; |
| | | const pieChartVOS = ref([]); |
| | | pieChartVOS.value = data.pieChartVOS[0]; |
| | | let oneFinish = ref(); |
| | | let twoFinish = ref(); |
| | | let oneunFinish = ref(); |
| | | let twounFinish = ref(); |
| | | if (pieChartVOS.value.length > 0) { |
| | | if (edg.value) { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedQuantity; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedQuantity; |
| | | oneunFinish = pieChartVOS.value[0].oneUncompletedQuantity; |
| | | twounFinish = pieChartVOS.value[0].twoUncompletedQuantity; |
| | | } else { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedArea; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedArea; |
| | | oneunFinish = pieChartVOS.value[0].oneUncompletedArea; |
| | | twounFinish = pieChartVOS.value[0].twoUncompletedArea; |
| | | } |
| | | } else { |
| | | oneFinish = 0; |
| | | twoFinish = 0; |
| | | oneunFinish = 0; |
| | | twounFinish = 0; |
| | | } |
| | | timeAxisCreate("钢化当天运行情况", chartTemp.value, myChartTemp, data.tempRunTimes[0]); |
| | | }; |
| | | // let mychart = null; // 建议设为外部变量避免重复初始化 |
| | | |
| | | // const formatToTimeString(datetime) => { |
| | | const formatToTimeString = (datetime) => { |
| | | const date = new Date(datetime); |
| | | const hours = date.getHours().toString().padStart(2, '0'); |
| | | const minutes = date.getMinutes().toString().padStart(2, '0'); |
| | | const seconds = date.getSeconds().toString().padStart(2, '0'); |
| | | return `${hours}:${minutes}:${seconds}`; |
| | | } |
| | | |
| | | const chartDomOne = chartTwo.value; |
| | | if (!chartDomOne) { |
| | | const timeAxisCreate = (title, chartDom, mychart, RunTimes) => { |
| | | if (!chartDom) { |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | const myChartOne = echarts.init(chartDomOne); |
| | | |
| | | if (!mychart) { |
| | | mychart = echarts.init(chartDom); |
| | | } |
| | | let firstTime = null; |
| | | let secondTime = null; |
| | | if (RunTimes.length == 0) { |
| | | firstTime = "00-00-00 00:00:00"; |
| | | secondTime = "00-00-00 00:00:00"; |
| | | } else { |
| | | firstTime = RunTimes[0].startTimestamp; |
| | | secondTime = RunTimes[0].endTimestamp; |
| | | } |
| | | |
| | | let datas = ref([]) |
| | | RunTimes.forEach((item, index) => { |
| | | // if (index % 2 === 0) { |
| | | datas.value.push([item.firstTimestamp, -1, formatToTimeString(item.firstTimestamp)]) |
| | | datas.value.push([item.secondTimestamp, 1, formatToTimeString(item.secondTimestamp)]) |
| | | // } else { |
| | | // datas.value.push([item.firstTimestamp, -1, item.diffMinutes]) |
| | | // datas.value.push([item.firstTimestamp, -1, item.diffMinutes]) |
| | | // } |
| | | }) |
| | | // console.log(D) |
| | | // 构建线段数组 |
| | | const segments = RunTimes.map(item => ({ |
| | | type: 'line', |
| | | symbol: 'none', |
| | | data: [ |
| | | [item.firstTimestamp, 0], |
| | | [item.secondTimestamp, 0] |
| | | ], |
| | | lineStyle: { |
| | | color: 'red', // 支持不同颜色 |
| | | width: 4 |
| | | }, |
| | | z: 1 |
| | | })); |
| | | |
| | | const optionOne = { |
| | | title: { |
| | | text: t('large.edg'), |
| | | subtext: '', |
| | | left: 'right' |
| | | text: title, |
| | | left: 'center', |
| | | top: '5%', |
| | | textStyle: { |
| | | fontSize: 16, |
| | | fontWeight: 'bold', |
| | | color: '#333' |
| | | } |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | trigger: 'axis', |
| | | axisPointer: { type: 'line' }, |
| | | backgroundColor: 'rgba(50,50,50,0.7)', |
| | | textStyle: { color: '#fff' } |
| | | }, |
| | | legend: { |
| | | orient: 'vertical', |
| | | left: 'left' |
| | | grid: { |
| | | top: '20%', |
| | | left: '5%', |
| | | right: '5%', |
| | | bottom: '15%' |
| | | }, |
| | | xAxis: { |
| | | type: 'time', |
| | | axisLabel: { |
| | | formatter: function (value) { |
| | | const date = new Date(value); |
| | | return ( |
| | | date.getHours().toString().padStart(2, '0') + ':' + |
| | | date.getMinutes().toString().padStart(2, '0') + ':' + |
| | | date.getSeconds().toString().padStart(2, '0') |
| | | ); |
| | | }, |
| | | fontSize: 10, |
| | | color: '#666' |
| | | }, |
| | | splitLine: { show: false }, |
| | | axisLine: { lineStyle: { color: '#aaa' } } |
| | | }, |
| | | yAxis: { |
| | | type: 'value', |
| | | min: -1, |
| | | max: 1, |
| | | show: false |
| | | }, |
| | | series: [ |
| | | // 主时间线(蓝色渐变,稍微加粗) |
| | | { |
| | | name: '', |
| | | type: 'pie', |
| | | radius: '50%', |
| | | type: 'line', |
| | | symbol: 'none', |
| | | data: [ |
| | | { value: oneFinish, name: t('large.oneFinish') }, |
| | | { value: twoFinish, name: t('large.twoFinish') }, |
| | | { value: oneunFinish, name: t('large.oneunFinish') }, |
| | | { value: twounFinish, name: t('large.twounFinish') }, |
| | | [firstTime, 0], |
| | | [secondTime, 0] |
| | | ], |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | lineStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [ |
| | | { offset: 0, color: '#4facfe' }, |
| | | { offset: 1, color: '#00f2fe' } |
| | | ]), |
| | | width: 5, |
| | | shadowColor: 'rgba(0,0,0,0.2)', |
| | | shadowBlur: 8 |
| | | }, |
| | | z: 0 |
| | | }, |
| | | // 小段时间线(统一柔和的黄色) |
| | | ...segments.map(seg => ({ |
| | | ...seg, |
| | | lineStyle: { |
| | | color: '#ffcc00', |
| | | width: 3, |
| | | shadowColor: 'rgba(255,204,0,0.5)', |
| | | shadowBlur: 5 |
| | | } |
| | | } |
| | | ], |
| | | graphic: [ |
| | | })), |
| | | // 卡片事件(优化样式) |
| | | { |
| | | type: 'rect', |
| | | left: 'center', |
| | | top: 0, |
| | | shape: { |
| | | width: 80, |
| | | height: 30 |
| | | type: 'custom', |
| | | renderItem: function (params, api) { |
| | | const x = api.coord([api.value(0), api.value(1)])[0]; |
| | | const yBase = api.coord([api.value(0), 0])[1]; |
| | | const yOffset = api.value(1) > 0 ? -70 : 30; |
| | | const cardWidth = 40; |
| | | const cardHeight = 22; |
| | | const cardX = x; |
| | | const cardY = yBase + yOffset; |
| | | const text = api.value(2); |
| | | |
| | | return { |
| | | type: 'group', |
| | | children: [ |
| | | { |
| | | type: 'line', |
| | | shape: { |
| | | x1: x, |
| | | y1: yBase, |
| | | x2: x, |
| | | y2: cardY + (api.value(1) > 0 ? cardHeight : 0) |
| | | }, |
| | | style: { |
| | | stroke: '#888', |
| | | lineWidth: 1.5, |
| | | lineDash: [4, 2] |
| | | } |
| | | }, |
| | | { |
| | | type: 'rect', |
| | | shape: { |
| | | x: cardX - cardWidth / 2, |
| | | y: cardY, |
| | | width: cardWidth, |
| | | height: cardHeight, |
| | | r: 6 // 圆角 |
| | | }, |
| | | style: { |
| | | fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#ffffff' }, |
| | | { offset: 1, color: '#e0f7fa' } |
| | | ]), |
| | | stroke: '#00acc1', |
| | | lineWidth: 1, |
| | | shadowColor: '#ccc', |
| | | shadowBlur: 6 |
| | | } |
| | | }, |
| | | { |
| | | type: 'text', |
| | | style: { |
| | | text: text, |
| | | x: cardX, |
| | | y: cardY + cardHeight / 2, |
| | | textAlign: 'center', |
| | | textVerticalAlign: 'middle', |
| | | font: '12px sans-serif', |
| | | fill: '#006064' |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | }, |
| | | style: { |
| | | text: edg.value == true ? t('large.quantity') : t('large.are'), |
| | | fill: '#5470C6', |
| | | stroke: '#000', |
| | | lineWidth: 1 |
| | | encode: { |
| | | x: 0 |
| | | }, |
| | | onclick: function () { |
| | | edg.value = !edg.value; |
| | | } |
| | | data: datas.value, |
| | | z: 10 |
| | | } |
| | | ] |
| | | }; |
| | | |
| | | myChartOne.setOption(optionOne); |
| | | mychart.setOption(optionOne); |
| | | }; |
| | | |
| | | let socket4 = null; |
| | | const hollowBigStorageCageUsage = ref([]) |
| | | const socketUrl4 = `ws://${WebSocketHost}:${host}/api/hollowGlass/api/talk/largenScreen`; |
| | | const handleMessage4 = (data) => { |
| | | hollowBigStorageCageUsage.value = data.hollowBigStorageCageUsage[0]; |
| | | const pieChartVOS = ref([]); |
| | | pieChartVOS.value = data.pieChartVOS[0]; |
| | | let oneFinish = ref(); |
| | | let twoFinish = ref(); |
| | | let oneunFinish = ref(); |
| | | let twounFinish = ref(); |
| | | if (pieChartVOS.value.length > 0) { |
| | | if (hollow.value) { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedQuantity; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedQuantity; |
| | | oneunFinish = pieChartVOS.value[0].oneUncompletedQuantity; |
| | | twounFinish = pieChartVOS.value[0].twoUncompletedQuantity; |
| | | } else { |
| | | oneFinish = pieChartVOS.value[0].oneCompletedArea; |
| | | twoFinish = pieChartVOS.value[0].twoCompletedArea; |
| | | oneunFinish = pieChartVOS.value[0].oneUncompletedArea; |
| | | twounFinish = pieChartVOS.value[0].twoUncompletedArea; |
| | | } |
| | | } else { |
| | | oneFinish = 0; |
| | | twoFinish = 0; |
| | | oneunFinish = 0; |
| | | twounFinish = 0; |
| | | } |
| | | |
| | | |
| | | const chartDomOne = chartFour.value; |
| | | if (!chartDomOne) { |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | const myChartOne = echarts.init(chartDomOne); |
| | | const optionOne = { |
| | | title: { |
| | | text: t('large.hollow'), |
| | | subtext: '', |
| | | left: 'right' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'vertical', |
| | | left: 'left' |
| | | }, |
| | | series: [ |
| | | { |
| | | name: '', |
| | | type: 'pie', |
| | | radius: '50%', |
| | | data: [ |
| | | { value: oneFinish, name: t('large.oneFinish') }, |
| | | { value: twoFinish, name: t('large.twoFinish') }, |
| | | { value: oneunFinish, name: t('large.oneunFinish') }, |
| | | { value: twounFinish, name: t('large.twounFinish') }, |
| | | ], |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | } |
| | | ], |
| | | graphic: [ |
| | | { |
| | | type: 'rect', |
| | | left: 'center', |
| | | top: 0, |
| | | shape: { |
| | | width: 80, |
| | | height: 30 |
| | | }, |
| | | style: { |
| | | text: hollow.value == true ? t('large.quantity') : t('large.are'), |
| | | fill: '#5470C6', |
| | | stroke: '#000', |
| | | lineWidth: 1 |
| | | }, |
| | | onclick: function () { |
| | | hollow.value = !hollow.value; |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | |
| | | myChartOne.setOption(optionOne); |
| | | timeAxisCreate("中空当天运行情况", chartHollow.value, myChartHollow, data.hollowRunTimes[0]); |
| | | }; |
| | | let socket5 = null; |
| | | let myChart = null; |
| | | let myChart2 = null; |
| | | const productionVO = ref([]) |
| | | const socketUrl5 = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/largenScreenProduction`; |
| | | const handleMessage5 = (data) => { |
| | |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | |
| | | const myChart = echarts.init(chartDom); |
| | | // myChart = echarts.init(chartDom); |
| | | if (!myChart) { |
| | | myChart = echarts.init(chartDom); |
| | | } |
| | | // else { |
| | | // myChart.clear(); |
| | | // } |
| | | |
| | | |
| | | const option = { |
| | |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | const myChart2 = echarts.init(chartDom2); |
| | | // myChart2 = echarts.init(chartDom2); |
| | | if (!myChart2) { |
| | | myChart2 = echarts.init(chartDom2); |
| | | } |
| | | // else { |
| | | // myChart2.clear(); |
| | | // } |
| | | const option2 = { |
| | | title: { text: '' }, |
| | | tooltip: { trigger: 'axis' }, |
| | |
| | | } |
| | | } |
| | | |
| | | const exportToExcel = async () => { |
| | | try { |
| | | window.open('http://'+{WebSocketHost}+':10011/largenScreen/exportDailyProduction', '_blank'); |
| | | // const response = await request.get('/cacheGlass/largenScreen/exportDailyProduction'); |
| | | // if (response.code == 200) { |
| | | // ElMessage.success(response.message); |
| | | // tableDatad.value = response.data; |
| | | // } else { |
| | | // ElMessage.error(response.message); |
| | | // } |
| | | } |
| | | catch (error) { |
| | | console.error(error); |
| | | } |
| | | } |
| | | |
| | | const tableData = ref([]); |
| | | const dynamicColumns = ref([]); |
| | | const flowCardDetail = async (orderId) => { |
| | |
| | | }; |
| | | const chartRef = ref(null) |
| | | const chartRef2 = ref(null) |
| | | const chartOne = ref(null) |
| | | const chartTwo = ref(null) |
| | | const chartThree = ref(null) |
| | | const chartFour = ref(null) |
| | | const chartLoad = ref(null) |
| | | const chartEdg = ref(null) |
| | | const chartTemp = ref(null) |
| | | const chartHollow = ref(null) |
| | | |
| | | |
| | | // 在组件挂载时设置默认时间范围 |
| | | onMounted(async () => { |
| | | |
| | | boxStart(); |
| | | boxStart2(); |
| | | boxStart3(); |
| | | boxStart4(); |
| | | requestAnimationFrame(animate); |
| | | // boxStart(); |
| | | // boxStart2() |
| | | // boxStart3() |
| | | // boxStart4(); |
| | | // requestAnimationFrame(animate); |
| | | socket = initializeWebSocket(socketUrl, handleMessage); |
| | | socket1 = initializeWebSocket(socketUrl1, handleMessage1); |
| | | socket2 = initializeWebSocket(socketUrl2, handleMessage2); |
| | |
| | | closeWebSocket(socket5); |
| | | } |
| | | }); |
| | | onBeforeUnmount(() => { |
| | | closeWebSocket(); |
| | | }); |
| | | const numBoxes = ref(5); |
| | | const numBoxes2 = ref(5); |
| | | const numBoxes3 = ref(5); |
| | | const numBoxes4 = ref(1); |
| | | const numBoxes = ref(0); |
| | | const numBoxes2 = ref(0); |
| | | const numBoxes3 = ref(0); |
| | | const numBoxes4 = ref(0); |
| | | const speed = 0.1; |
| | | const maxX = 200; // 终点X坐标 |
| | | const maxY = -75; // 终点Y坐标 |
| | | const maxX2 = 313; // 终点X坐标 |
| | | const maxY2 = -165; // 终点Y坐标 |
| | | const maxX3 = 95; // 终点X坐标 |
| | | const maxY3 = -85; // 终点Y坐标 |
| | | const maxX4 = 60; // 终点X坐标 |
| | | const maxY4 = 0; // 终点Y坐标 |
| | | const delayFrames = 600; // 每个 div 的延迟帧数 |
| | | const boxes = ref([]); |
| | | const boxes2 = ref([]); |
| | | const boxes3 = ref([]); |
| | | const boxes4 = ref([]); |
| | | // 初始化 div 数据 |
| | | const boxStart = () => { |
| | | boxes.value = []; |
| | | for (let i = 0; i < numBoxes.value; i++) { |
| | | boxes.value.push({ |
| | | x: 0, |
| | | y: 0, // 初始位置在底部 |
| | | direction: 'up', |
| | | delay: i * delayFrames, |
| | | style: { |
| | | width: '15px', |
| | | height: '15px', |
| | | backgroundColor: i % 2 === 0 ? '#911005' : '#911005', |
| | | position: 'absolute', |
| | | transform: `translate(0px, 0px)` |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | const boxStart2 = () => { |
| | | boxes2.value = []; |
| | | for (let i = 0; i < numBoxes2.value; i++) { |
| | | boxes2.value.push({ |
| | | x: 0, |
| | | y: 0, // 初始位置在底部 |
| | | direction: 'up', |
| | | delay: i * delayFrames, |
| | | style: { |
| | | width: '15px', |
| | | height: '15px', |
| | | backgroundColor: i % 2 === 0 ? '#911005' : '#911005', |
| | | position: 'absolute', |
| | | transform: `translate(0px, 0px)` |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | const boxStart3 = () => { |
| | | boxes3.value = []; |
| | | for (let i = 0; i < numBoxes3.value; i++) { |
| | | boxes3.value.push({ |
| | | x: 0, |
| | | y: 0, // 初始位置在底部 |
| | | direction: 'left', |
| | | delay: i * delayFrames, |
| | | style: { |
| | | width: '15px', |
| | | height: '15px', |
| | | backgroundColor: i % 2 === 0 ? '#911005' : '#911005', |
| | | position: 'absolute', |
| | | transform: `translate(0px, 0px)` |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | const boxStart4 = () => { |
| | | boxes4.value = []; |
| | | for (let i = 0; i < numBoxes4.value; i++) { |
| | | boxes4.value.push({ |
| | | x: 0, |
| | | y: 0, // 初始位置在底部 |
| | | direction: 'right', |
| | | delay: i * delayFrames, |
| | | style: { |
| | | width: '15px', |
| | | height: '15px', |
| | | backgroundColor: i % 2 === 0 ? '#911005' : '#911005', |
| | | position: 'absolute', |
| | | transform: `translate(0px, 0px)` |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | const animate = () => { |
| | | boxes.value.forEach((box) => { |
| | | if (box.delay > 0) { |
| | | box.delay--; |
| | | return; |
| | | const delayFrames = 600; |
| | | |
| | | const maxCoords = { |
| | | box1: { x: 250, y: -165 }, |
| | | box2: { x: 190, y: -75 }, |
| | | box3: { x: 95, y: -85 }, |
| | | box4: { x: 60, y: 0 }, |
| | | }; |
| | | |
| | | let boxes = ref([]); |
| | | let boxes2 = ref([]); |
| | | let boxes3 = ref([]); |
| | | let boxes4 = ref([]); |
| | | |
| | | const boxRefs = []; |
| | | const boxRefs2 = []; |
| | | const boxRefs3 = []; |
| | | const boxRefs4 = []; |
| | | let rafId = null; |
| | | |
| | | // ✅ 初始化 boxes,去除 style,保留 el |
| | | const initBoxes = (arr, countRef, direction) => { |
| | | const count = countRef.value; |
| | | const existing = arr.value; |
| | | |
| | | for (let i = 0; i < count; i++) { |
| | | if (!existing[i]) { |
| | | existing.push({ |
| | | x: 0, |
| | | y: 0, |
| | | direction, |
| | | delay: i * delayFrames, |
| | | frameCount: 0, |
| | | el: null |
| | | }); |
| | | } else { |
| | | // 重置已有的 box 数据 |
| | | // existing[i].x = 0; |
| | | // existing[i].y = 0; |
| | | // existing[i].direction = direction; |
| | | // existing[i].delay = i * delayFrames; |
| | | // existing[i].frameCount = 0; |
| | | } |
| | | if (box.direction === 'up') { |
| | | } |
| | | if (existing.length > count) { |
| | | existing.length = count; |
| | | } |
| | | }; |
| | | |
| | | // ✅ 动画函数 |
| | | const animateBox = (box, maxX, maxY) => { |
| | | if (box.delay > 0) { |
| | | box.delay--; |
| | | return; |
| | | } |
| | | |
| | | switch (box.direction) { |
| | | case 'firstup': |
| | | box.y -= speed; |
| | | if (box.y <= maxY) { |
| | | // box.y = 0; // 确保不会超出界限 |
| | | box.direction = 'left'; |
| | | } |
| | | } else if (box.direction === 'left') { |
| | | if (box.y <= maxY) box.direction = 'firstleft'; |
| | | break; |
| | | case 'firstleft': |
| | | box.x -= speed; |
| | | if (box.x <= -maxX) { |
| | | box.x = 0; |
| | | box.y = 0; // 重新回到底部 |
| | | box.direction = 'up'; |
| | | box.y = 0; |
| | | box.direction = 'firstup'; |
| | | } |
| | | } |
| | | box.style = { |
| | | ...box.style, |
| | | transform: `translate(${box.x}px, ${box.y}px)` |
| | | }; |
| | | }); |
| | | boxes2.value.forEach((box) => { |
| | | if (box.delay > 0) { |
| | | box.delay--; |
| | | return; |
| | | } |
| | | if (box.direction === 'up') { |
| | | break; |
| | | case 'secondup': |
| | | box.y -= speed; |
| | | if (box.y <= maxY2) { |
| | | // box.y = 0; // 确保不会超出界限 |
| | | box.direction = 'left'; |
| | | } |
| | | } else if (box.direction === 'left') { |
| | | box.x -= speed; |
| | | if (box.x <= -maxX2) { |
| | | if (box.y <= maxY) { |
| | | box.x = 0; |
| | | box.y = 0; // 重新回到底部 |
| | | box.direction = 'up'; |
| | | box.y = 0; |
| | | box.direction = 'secondleft'; |
| | | } |
| | | } |
| | | box.style = { |
| | | ...box.style, |
| | | transform: `translate(${box.x}px, ${box.y}px)` |
| | | }; |
| | | }); |
| | | boxes3.value.forEach((box) => { |
| | | if (box.delay > 0) { |
| | | box.delay--; |
| | | return; |
| | | } |
| | | if (box.direction === 'up') { |
| | | box.y -= speed; |
| | | if (box.y <= maxY3) { |
| | | // box.y = 0; // 确保不会超出界限 |
| | | box.direction = 'left'; |
| | | box.x = 0; |
| | | box.y = 0; // 重新回到底部 |
| | | } |
| | | } else if (box.direction === 'left') { |
| | | break; |
| | | case 'secondleft': |
| | | box.x -= speed; |
| | | if (box.x <= -maxX3) { |
| | | |
| | | box.direction = 'up'; |
| | | if (box.x <= -maxX) { |
| | | box.direction = 'secondup'; |
| | | } |
| | | } |
| | | box.style = { |
| | | ...box.style, |
| | | transform: `translate(${box.x}px, ${box.y}px)` |
| | | }; |
| | | }); |
| | | boxes4.value.forEach((box) => { |
| | | if (box.delay > 0) { |
| | | box.delay--; |
| | | return; |
| | | } |
| | | if (box.direction === 'right') { |
| | | break; |
| | | case 'right': |
| | | box.x += speed; |
| | | if (box.x >= maxX4) { |
| | | // box.y = 0; // 确保不会超出界限 |
| | | if (box.x >= maxX) { |
| | | box.x = 0; |
| | | box.y = 0; // 重新回到底部 |
| | | box.y = 0; |
| | | } |
| | | break; |
| | | } |
| | | |
| | | box.frameCount++; |
| | | if (box.frameCount % 2 === 0 && box.el) { |
| | | box.el.style.top = `${box.y}px`; |
| | | if (box.x > 0) { |
| | | |
| | | if(box.direction=="right"){ |
| | | box.el.style.right = `-${box.x}px`; |
| | | |
| | | }else{ |
| | | box.el.style.right = `${box.x}px`; |
| | | } |
| | | box.el.style.left = ''; |
| | | } else { |
| | | box.el.style.left = `${box.x}px`; |
| | | box.el.style.right = ''; |
| | | } |
| | | box.style = { |
| | | ...box.style, |
| | | transform: `translate(${box.x}px, ${box.y}px)` |
| | | }; |
| | | }); |
| | | requestAnimationFrame(animate); |
| | | } |
| | | }; |
| | | |
| | | const animate = () => { |
| | | boxes.value.forEach(box => animateBox(box, maxCoords.box1.x, maxCoords.box1.y)); |
| | | boxes2.value.forEach(box => animateBox(box, maxCoords.box2.x, maxCoords.box2.y)); |
| | | boxes3.value.forEach(box => animateBox(box, maxCoords.box3.x, maxCoords.box3.y)); |
| | | boxes4.value.forEach(box => animateBox(box, maxCoords.box4.x, maxCoords.box4.y)); |
| | | |
| | | rafId = requestAnimationFrame(animate); |
| | | }; |
| | | |
| | | const boxStart = () => { |
| | | initBoxes(boxes, numBoxes, 'firstup'); |
| | | initBoxes(boxes2, numBoxes2, 'firstup'); |
| | | initBoxes(boxes3, numBoxes3, 'secondleft'); |
| | | initBoxes(boxes4, numBoxes4, 'right'); |
| | | }; |
| | | |
| | | watch( |
| | | () => boxes.value, |
| | | async (newVal) => { |
| | | await nextTick(); |
| | | newVal.forEach((box, i) => { |
| | | box.el = boxRefs[i]; |
| | | }); |
| | | }, |
| | | { deep: true, immediate: true } |
| | | |
| | | ); |
| | | watch( |
| | | () => boxes2.value, |
| | | async (newVal) => { |
| | | await nextTick(); |
| | | newVal.forEach((box, i) => { |
| | | box.el = boxRefs2[i]; |
| | | }); |
| | | }, |
| | | { deep: true, immediate: true } |
| | | ); |
| | | |
| | | watch( |
| | | () => boxes3.value, |
| | | async (newVal) => { |
| | | await nextTick(); |
| | | newVal.forEach((box, i) => { |
| | | box.el = boxRefs3[i]; |
| | | }); |
| | | }, |
| | | { deep: true, immediate: true } |
| | | ); |
| | | |
| | | watch( |
| | | () => boxes4.value, |
| | | async (newVal) => { |
| | | await nextTick(); |
| | | newVal.forEach((box, i) => { |
| | | box.el = boxRefs4[i]; |
| | | }); |
| | | }, |
| | | { deep: true, immediate: true } |
| | | ); |
| | | onMounted(() => { |
| | | boxStart(); |
| | | animate(); |
| | | }); |
| | | |
| | | onBeforeUnmount(() => { |
| | | cancelAnimationFrame(rafId); |
| | | rafId = null; |
| | | boxes.value.length = 0; |
| | | boxes2.value.length = 0; |
| | | boxes3.value.length = 0; |
| | | boxes4.value.length = 0; |
| | | }); |
| | | onUnmounted(() => { |
| | | if (rafId) { |
| | | cancelAnimationFrame(rafId); // 停止动画,防止内存泄漏 |
| | | } |
| | | }); |
| | | // onBeforeUnmount(() => { |
| | | // cancelAnimationFrame(rafId); |
| | | // }); |
| | | |
| | | //嵌入历史任务 |
| | | const iframeUrl1 = ref(''); |
| | | const iframe1 = ref(false); |
| | |
| | | const handlehistorical10 = () => { |
| | | iframe10.value = true; |
| | | iframeUrl10.value = `${window.location.origin}/#/largescreendisplay/statistics`; |
| | | }; |
| | | const iframeUrl11 = ref(''); |
| | | const iframe11 = ref(false); |
| | | const handlehistorical11 = () => { |
| | | iframe11.value = true; |
| | | iframeUrl11.value = `${window.location.origin}/#/largescreendisplay/productionstatistics`; |
| | | }; |
| | | const transposedData = computed(() => { |
| | | const keys = Object.keys(fieldNames); // 按 fieldNames 的顺序 |
| | |
| | | <iframe :src="iframeUrl10" marginwidth="2000px" marginheight="2000px" width="100%" height="750px" |
| | | frameborder="0"></iframe> |
| | | </el-dialog> |
| | | <el-dialog v-model="iframe11" top="5vh" width="95%" @close="iframeUrl11 = ''"> |
| | | <iframe :src="iframeUrl11" marginwidth="2000px" marginheight="2000px" width="100%" height="750px" |
| | | frameborder="0"></iframe> |
| | | </el-dialog> |
| | | |
| | | <div class="awatch" style="display: flex;"> |
| | | <!-- 生产统计 --> |
| | |
| | | <div ref="chartRef" style="width: 600px; height: 400px;" @dblclick="handlehistorical10()"></div> |
| | | </div> |
| | | <div style="width: 100%;height: 245px;display: flex;"> |
| | | <div ref="chartOne" style="width: 100%;"></div> |
| | | <div ref="chartLoad" style="width: 100%;"></div> |
| | | </div> |
| | | <div style="width: 100%;height: 245px;display: flex;"> |
| | | <div ref="chartTwo" style="width: 100%;"></div> |
| | | <div ref="chartEdg" style="width: 100%;"></div> |
| | | </div> |
| | | </div> |
| | | <div style="width: 50%;"> |
| | | <div class="img-screen" alt="Screen"> |
| | | <div> |
| | | <el-button type="primary" style="top:40px;left:670px;position: absolute;" @click="exportToExcel()">{{ |
| | | $t('large.statistics') }}</el-button> |
| | | </div> |
| | | <!-- 钢化半透明色块 --> |
| | | <div |
| | | style="width: 80px;height: 40px;top: 315px;left: 130px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOut : 0 }}{{ $t('large.slice') }}</div> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOut : 0 }}{{ |
| | | $t('large.slice') }}</div> |
| | | <div>{{ $t('large.are') }}:{{ productionVO.length > 0 ? productionVO[6].totalAreaOut : 0 }}m²</div> |
| | | </div> |
| | | <!-- 中空一线半透明色块 --> |
| | | <div |
| | | style="width: 80px;height: 40px;top: 315px;left: 450px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].hollowCountOutOne : 0 }}{{ $t('large.slice') }}</div> |
| | | style="width: 80px;height: 40px;top: 235px;left: 450px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].hollowCountOutOne : 0 }}{{ |
| | | $t('large.slice') }}</div> |
| | | <div>{{ $t('large.are') }}:{{ productionVO.length > 0 ? productionVO[6].hollowTotalAreaOutOne : 0 }}m²</div> |
| | | </div> |
| | | <!-- 中空二线半透明色块 --> |
| | | <div |
| | | style="width: 80px;height: 40px;top: 230px;left: 450px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].hollowCountOutTwo : 0 }}{{ $t('large.slice') }}</div> |
| | | style="width: 80px;height: 40px;top: 130px;left: 450px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].hollowCountOutTwo : 0 }}{{ |
| | | $t('large.slice') }}</div> |
| | | <div>{{ $t('large.are') }}:{{ productionVO.length > 0 ? productionVO[6].hollowTotalAreaOutTwo : 0 }}m²</div> |
| | | </div> |
| | | <!-- 切割二线半透明色块 --> |
| | | <div |
| | | style="width: 80px;height: 40px;top: 542px;left: 410px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOutOne : 0 }}{{ $t('large.slice') }}</div> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOutOne : 0 }}{{ |
| | | $t('large.slice') }}</div> |
| | | <div>{{ $t('large.are') }}:{{ productionVO.length > 0 ? productionVO[6].totalAreaOutOne : 0 }}m²</div> |
| | | </div> |
| | | <!-- 切割一线半透明色块 --> |
| | | <div |
| | | style="width: 80px;height: 40px;top: 490px;left: 410px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOutTwo : 0 }}{{ $t('large.slice') }}</div> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOutTwo : 0 }}{{ |
| | | $t('large.slice') }}</div> |
| | | <div>{{ $t('large.are') }}:{{ productionVO.length > 0 ? productionVO[6].totalAreaOutTwo : 0 }}m²</div> |
| | | </div> |
| | | <!-- 磨边一线半透明色块 --> |
| | | <div |
| | | style="width: 80px;height: 40px;top: 369px;left: 450px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOutOne : 0 }}{{ $t('large.slice') }}</div> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOutOne : 0 }}{{ |
| | | $t('large.slice') }}</div> |
| | | <div>{{ $t('large.are') }}:{{ productionVO.length > 0 ? productionVO[6].totalAreaOutOne : 0 }}m²</div> |
| | | </div> |
| | | <!-- 磨边二线半透明色块 --> |
| | | <div |
| | | style="width: 80px;height: 40px;top: 410px;left: 450px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOutTwo : 0 }}{{ $t('large.slice') }}</div> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countOutTwo : 0 }}{{ |
| | | $t('large.slice') }}</div> |
| | | <div>{{ $t('large.are') }}:{{ productionVO.length > 0 ? productionVO[6].totalAreaOutTwo : 0 }}m²</div> |
| | | </div> |
| | | <!-- 钢化前大理{{ $t('large.slice') }}半透明色块 --> |
| | | <div |
| | | style="width: 80px;height: 40px;top: 380px;left: 290px;position: absolute;background-color: rgba(0, 0, 0, 0.5);color: white;font-size: 12px;z-index: 999;"> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countIn : 0 }}{{ $t('large.slice') }}</div> |
| | | <div>{{ $t('large.quantity') }}:{{ productionVO.length > 0 ? productionVO[6].countIn : 0 }}{{ |
| | | $t('large.slice') }}</div> |
| | | <div>{{ $t('large.are') }}:{{ productionVO.length > 0 ? productionVO[6].totalAreaIn : 0 }}m²</div> |
| | | </div> |
| | | |
| | |
| | | <!-- 磨边色块 --> |
| | | <div class="container" |
| | | style="position: relative;width: 15px;height: 15px;top: 500px;left: 638px;position: absolute;"> |
| | | <div v-for="(box, index) in boxes2" :key="index" class="box" :style="box.style"></div> |
| | | <div v-for="(box, i) in boxes2" :key="`b1-${i}`" class="moving-rect" :ref="el => boxRefs2[i] = el" /> |
| | | </div> |
| | | <div class="container" |
| | | style="position: relative;width: 15px;height: 15px;top: 548px;left: 690px;position: absolute;"> |
| | | <div v-for="(box, index) in boxes" :key="index" class="box" :style="box.style"></div> |
| | | <div v-for="(box, i) in boxes" :key="`b1-${i}`" class="moving-rect" :ref="el => boxRefs[i] = el" /> |
| | | </div> |
| | | <!-- 钢化运动色块 --> |
| | | <div class="container" |
| | | style="position: relative;width: 15px;height: 15px;top: 370px;left: 195px;position: absolute;background-color: red;"> |
| | | <div v-for="(box, index) in boxes3" :key="index" class="box" :style="box.style"></div> |
| | | style="position: relative;width: 15px;height: 15px;top: 370px;left: 195px;position: absolute;"> |
| | | <div v-for="(box, i) in boxes3" :key="`b1-${i}`" class="moving-rect" :ref="el => boxRefs3[i] = el" /> |
| | | </div> |
| | | <div class="container" |
| | | style="position: relative;width: 15px;height: 15px;top: 284px;left: 489px;position: absolute;"> |
| | | <div v-for="(box, index) in boxes4" :key="index" class="box" :style="box.style"></div> |
| | | <div v-for="(box, i) in boxes4" :key="`b1-${i}`" class="moving-rect" :ref="el => boxRefs4[i] = el" /> |
| | | </div> |
| | | <!-- <div class="moving-rect lipiana" v-show="true">1111111111</div> --> |
| | | <!-- 钢化前大理片色块 --> |
| | | <div class="container" v-for="(item, index) in bigStorageCageUsage.slice(0, 1)" :key="index" |
| | | :style='"position: relative;width: " + (37 * item.percentage / 100) + "px;height: 13px;top: 374px;left: 309px;position: absolute;background-color: #911005;"'> |
| | |
| | | <div class="clickable-area" @click="handlehistorical" |
| | | style="position: relative;width: 108px;height: 134px;top: 478px;left: 290px;"></div> |
| | | </div> |
| | | <div style="height: 190px;width: 100%;float: right;"> |
| | | <el-table height="190" ref="table" :data="orderDTOS" |
| | | <div style="height: 175px;width: 100%;float: right;"> |
| | | <el-table height="175" ref="table" :data="orderDTOS" |
| | | :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"> |
| | | <el-table-column prop="orderId" align="center" :label="$t('large.orderId')" min-width="50" /> |
| | | <el-table-column prop="customerName" align="center" :show-overflow-tooltip="true" |
| | |
| | | <div ref="chartRef2" style="width: 600px; height: 400px;" @dblclick="handlehistorical10()"></div> |
| | | </div> |
| | | <div style="width: 100%;height: 245px;display: flex;"> |
| | | <div ref="chartThree" style="width: 100%;"></div> |
| | | <div ref="chartTemp" style="width: 100%;"></div> |
| | | </div> |
| | | <div style="width: 100%;height: 245px;display: flex;"> |
| | | <div ref="chartFour" style="width: 100%;"></div> |
| | | <div ref="chartHollow" style="width: 100%;"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | .box { |
| | | transition: transform 0.016s linear; |
| | | } |
| | | |
| | | .lipiana { |
| | | width: 15px; |
| | | height: 9px; |
| | | background-color: #529b2e; |
| | | top: 190px; |
| | | right: 530px; |
| | | transform: translateX(-50%); |
| | | animation: move-lipiana 1s infinite; |
| | | } |
| | | |
| | | @keyframes move-lipiana { |
| | | 0% { |
| | | right: 530px; |
| | | } |
| | | |
| | | 100% { |
| | | right: calc(100% - 350px); |
| | | } |
| | | } |
| | | |
| | | .moving-rect { |
| | | width: 15px; |
| | | height: 15px; |
| | | background-color: #911005; |
| | | position: absolute; |
| | | } |
| | | </style> |