From 4037c71a2e622e83735e8aecad71b77aae007b3a Mon Sep 17 00:00:00 2001 From: ZengTao <2773468879@qq.com> Date: 星期一, 12 五月 2025 18:21:32 +0800 Subject: [PATCH] 提交大屏时间轴代码 --- UI-Project/src/views/largescreendisplay/screendisplay.vue | 1002 +++++++++++++++++++++++++++------------------------------- 1 files changed, 473 insertions(+), 529 deletions(-) diff --git a/UI-Project/src/views/largescreendisplay/screendisplay.vue b/UI-Project/src/views/largescreendisplay/screendisplay.vue index c34154e..6cfe1e4 100644 --- a/UI-Project/src/views/largescreendisplay/screendisplay.vue +++ b/UI-Project/src/views/largescreendisplay/screendisplay.vue @@ -1,5 +1,5 @@ <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" @@ -32,7 +32,10 @@ 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]; @@ -41,100 +44,15 @@ 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([]) @@ -146,287 +64,250 @@ 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 (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) => { @@ -452,8 +333,13 @@ console.error('鍥捐〃瀹瑰櫒鏈壘鍒�'); return; } - - const myChart = echarts.init(chartDom); + // myChart = echarts.init(chartDom); + if (!myChart) { + myChart = echarts.init(chartDom); + } + // else { + // myChart.clear(); + // } const option = { @@ -494,7 +380,13 @@ 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' }, @@ -609,20 +501,19 @@ }; 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); @@ -648,194 +539,197 @@ closeWebSocket(socket5); } }); -onBeforeUnmount(() => { - closeWebSocket(); -}); -const numBoxes = ref(5); -const numBoxes2 = ref(5); -const numBoxes3 = ref(5); +const numBoxes = ref(1); +const numBoxes2 = ref(1); +const numBoxes3 = ref(1); const numBoxes4 = ref(1); 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) { + 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); @@ -896,6 +790,12 @@ 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 鐨勯『搴� @@ -968,6 +868,10 @@ <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;"> <!-- 鐢熶骇缁熻 --> @@ -976,60 +880,72 @@ <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="handlehistorical11()">{{ + $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: 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.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: 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.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> @@ -1073,21 +989,22 @@ <!-- 纾ㄨ竟鑹插潡 --> <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;"'> @@ -1145,10 +1062,10 @@ <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> @@ -1287,4 +1204,31 @@ .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> \ No newline at end of file -- Gitblit v1.8.0