| | |
| | | <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]; |
| | | edgTwoTasks.value = data.edgTwoTasks[0]; |
| | | edgOneTasks.value = data.edgOneCount[0]; |
| | | edgTwoTasks.value = data.edgOneCount[0]; |
| | | engineeringOne.value = data.engineeringOne[0]; |
| | | engineeringTwo.value = data.engineeringTwo[0]; |
| | | if (numBoxes.value != edgOneTasks.value.length) { |
| | | numBoxes.value = edgOneTasks.value.length; |
| | | boxStart(); |
| | | } |
| | | if (numBoxes2.value != edgTwoTasks.value.length) { |
| | | numBoxes2.value = edgTwoTasks.value.length; |
| | | boxStart2(); |
| | | } |
| | | const pieChartVOS = ref([]); |
| | | pieChartVOS.value = data.pieChartVOS[0]; |
| | | if (numBoxes.value != edgOneTasks.value) { |
| | | numBoxes.value = edgOneTasks.value; |
| | | initBoxes(boxes, numBoxes, 'firstup'); |
| | | |
| | | let oneFinish = ref(); |
| | | let twoFinish = ref(); |
| | | let oneunFinish = ref(); |
| | | let twounFinish = ref(); |
| | | if (pieChartVOS.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; |
| | | } |
| | | if (numBoxes2.value != edgTwoTasks.value) { |
| | | numBoxes2.value = edgTwoTasks.value; |
| | | initBoxes(boxes2, numBoxes2, 'firstup'); |
| | | } |
| | | timeAxisCreate(t('large.cuttingState'), chartLoad.value, myChartLoad, tableDataTime(false, data.loadRunTimes[0])); |
| | | timeAxisCreate(t('large.edgingState'), chartEdg.value, myChartEdg, tableDataTime(false, data.loadRunTimes[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); |
| | | }; |
| | | 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.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.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(t('large.temperingState'), chartTemp.value, myChartTemp, tableDataTime(false, 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 tableDataTime = (result, tableDatax) => { |
| | | const tableData = []; |
| | | if (tableDatax.length > 0) { |
| | | tableDatax.forEach((item, index) => { |
| | | tableData.push({ |
| | | firstTimestamp: index == 0 ? item.startTimestamp : tableDatax[index - 1].secondTimestamp, |
| | | secondTimestamp: index == tableDatax.length - 1 ? item.endTimestamp : item.firstTimestamp, |
| | | diffMinutes: item.diffMinutes, |
| | | startTimestamp: item.startTimestamp, |
| | | endTimestamp: item.endTimestamp, |
| | | state: 1 |
| | | }); |
| | | if (result) { |
| | | tableData.push({ |
| | | firstTimestamp: item.firstTimestamp, |
| | | secondTimestamp: item.secondTimestamp, |
| | | diffMinutes: item.diffMinutes, |
| | | startTimestamp: item.startTimestamp, |
| | | endTimestamp: item.endTimestamp, |
| | | state: 2 |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return tableData; |
| | | }; |
| | | |
| | | const chartDomOne = chartTwo.value; |
| | | if (!chartDomOne) { |
| | | const timeAxisCreate = (title, chartDom, mychart, RunTimes) => { |
| | | if (!chartDom) { |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | const myChartOne = echarts.init(chartDomOne); |
| | | const optionOne = { |
| | | title: { |
| | | text: t('large.edg'), |
| | | subtext: '', |
| | | left: 'right' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'vertical', |
| | | left: 'left' |
| | | }, |
| | | series: [ |
| | | |
| | | 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; |
| | | } |
| | | |
| | | // 构建线段数组 |
| | | const segments = RunTimes.map(item => ({ |
| | | type: 'line', |
| | | symbol: 'none', |
| | | data: [ |
| | | { |
| | | 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)' |
| | | } |
| | | value: [item.firstTimestamp, 0], |
| | | extra: { |
| | | start: item.firstTimestamp, |
| | | end: item.secondTimestamp |
| | | } |
| | | }, |
| | | { |
| | | value: [item.secondTimestamp, 0], |
| | | extra: { |
| | | start: item.firstTimestamp, |
| | | end: item.secondTimestamp |
| | | } |
| | | } |
| | | ], |
| | | graphic: [ |
| | | { |
| | | type: 'rect', |
| | | left: 'center', |
| | | top: 0, |
| | | shape: { |
| | | width: 80, |
| | | height: 30 |
| | | }, |
| | | style: { |
| | | text: edg.value == true ? t('large.quantity') : t('large.are'), |
| | | fill: '#5470C6', |
| | | stroke: '#000', |
| | | lineWidth: 1 |
| | | }, |
| | | onclick: function () { |
| | | edg.value = !edg.value; |
| | | } |
| | | lineStyle: { |
| | | color: 'red', // 支持不同颜色 |
| | | width: 4 |
| | | }, |
| | | z: 1 |
| | | })); |
| | | |
| | | |
| | | const optionOne = { |
| | | title: { |
| | | text: title, |
| | | left: 'center', |
| | | top: '5%', |
| | | textStyle: { |
| | | fontSize: 16, |
| | | fontWeight: 'bold', |
| | | color: '#333' |
| | | } |
| | | }, |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { type: 'line' }, |
| | | backgroundColor: 'rgba(50,50,50,0.7)', |
| | | textStyle: { color: '#fff' }, |
| | | formatter: (params) => { |
| | | const seen = new Set(); |
| | | const items = params |
| | | .filter(p => { |
| | | const key = p.data?.extra?.start + '|' + p.data?.extra?.end; |
| | | if (seen.has(key)) return false; |
| | | seen.add(key); |
| | | return true; |
| | | }) |
| | | .map(p => { |
| | | const start = p.data?.extra?.start; |
| | | const end = p.data?.extra?.end; |
| | | const timeStr = p.axisValueLabel; |
| | | if (start && end) { |
| | | return `开始时间:${start}<br/>结束时间:${end}`; |
| | | } |
| | | return `时间:${timeStr}`; |
| | | }) |
| | | .filter(Boolean); |
| | | return items.join('<br/>'); |
| | | } |
| | | }, |
| | | 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: [ |
| | | // 主时间线(蓝色渐变,稍微加粗) |
| | | { |
| | | type: 'line', |
| | | symbol: 'none', |
| | | data: [ |
| | | [firstTime, 0], |
| | | [secondTime, 0] |
| | | ], |
| | | lineStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [ |
| | | { offset: 0, color: 'red' }, |
| | | { offset: 1, color: 'red' } |
| | | ]), |
| | | width: 5, |
| | | shadowColor: 'rgba(0,0,0,0.2)', |
| | | shadowBlur: 8 |
| | | }, |
| | | z: 0 |
| | | }, |
| | | // 小段时间线(统一柔和的黄色) |
| | | ...segments.map(seg => ({ |
| | | ...seg, |
| | | lineStyle: { |
| | | color: '#4facfe', |
| | | width: 3, |
| | | shadowColor: 'rgba(255,204,0,0.5)', |
| | | shadowBlur: 5 |
| | | } |
| | | })), |
| | | ] |
| | | }; |
| | | |
| | | myChartOne.setOption(optionOne); |
| | | mychart.setOption(optionOne, true); |
| | | }; |
| | | |
| | | 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.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(t('large.hollowState'), chartHollow.value, myChartHollow, tableDataTime(false, data.hollowRunTimes[0])); |
| | | }; |
| | | let socket5 = null; |
| | | let myChart = null; |
| | | let myChart2 = null; |
| | | const switchNoorAreaLeft = ref(true) |
| | | const switchNoorAreaRight = ref(true) |
| | | const productionVO = ref([]) |
| | | const socketUrl5 = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/largenScreenProduction`; |
| | | const handleMessage5 = (data) => { |
| | | productionVO.value = data.productionVO[0]; |
| | | // 将原始数据转换为 ECharts 图表所需格式 |
| | | const createchart = (productionVO) => { |
| | | categories = productionVO.value.map(item => item.date); // 获取日期作为 x 轴 |
| | | totalAreaOutOne = productionVO.value.map(item => item.totalAreaOutOne); |
| | | countIn = productionVO.value.map(item => item.countIn); |
| | |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | if (!myChart) { |
| | | myChart = echarts.init(chartDom); |
| | | } |
| | | let loadOneData; |
| | | let loadTwoData; |
| | | let tempfontData; |
| | | if (switchNoorAreaLeft.value) { |
| | | loadOneData = countOutOne; |
| | | loadTwoData = countOutTwo; |
| | | tempfontData = countIn; |
| | | } else { |
| | | loadOneData = totalAreaOutOne; |
| | | loadTwoData = totalAreaOutTwo; |
| | | tempfontData = totalAreaIn; |
| | | } |
| | | |
| | | const myChart = echarts.init(chartDom); |
| | | |
| | | |
| | | |
| | | const option = { |
| | |
| | | legend: { |
| | | data: [ |
| | | t('large.countOutOne'), |
| | | t('large.totalAreaOutOne'), |
| | | // t('large.totalAreaOutOne'), |
| | | t('large.countOutTwo'), |
| | | t('large.totalAreaOutTwo'), |
| | | // t('large.totalAreaOutTwo'), |
| | | t('large.countIn'), |
| | | t('large.totalAreaIn') |
| | | // t('large.totalAreaIn') |
| | | ] |
| | | }, |
| | | grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, |
| | | toolbox: { feature: { saveAsImage: {} } }, |
| | | grid: { top: '20%', left: '3%', right: '4%', bottom: '3%', containLabel: true }, |
| | | toolbox: { |
| | | feature: { |
| | | saveAsImage: {}, |
| | | myTool1: { |
| | | show: true, |
| | | title: t('large.switch'), |
| | | icon: 'path://M512 0C229.234 0 0 229.234 0 512s229.234 512 512 512 512-229.234 512-512S794.766 0 512 0z m0 960C264.602 960 64 759.398 64 512S264.602 64 512 64s448 200.602 448 448-200.602 448-448 448z m0-768c-176.448 0-320 143.552-320 320s143.552 320 320 320 320-143.552 320-320-143.552-320-320-320z', // 圆形按钮图标(可换) |
| | | onclick: function () { |
| | | switchNoorAreaLeft.value = !switchNoorAreaLeft.value; |
| | | createchart(productionVO); |
| | | // customButtonClick(); // 调用你自定义的方法 |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | boundaryGap: false, |
| | | boundaryGap: true, |
| | | data: categories // 这是日期数据 |
| | | }, |
| | | yAxis: { type: 'value' }, |
| | | yAxis: { |
| | | type: 'value', |
| | | name: switchNoorAreaLeft.value==true?t('large.quantity'):t('large.are'), // 坐标轴名称 |
| | | axisLabel: { |
| | | formatter: '{value}' |
| | | } |
| | | }, |
| | | series: [ |
| | | { name: t('large.countOutOne'), type: 'bar', data: countOutOne }, |
| | | { name: t('large.totalAreaOutOne'), type: 'bar', data: totalAreaOutOne }, |
| | | { name: t('large.countOutTwo'), type: 'bar', data: countOutTwo }, |
| | | { name: t('large.totalAreaOutTwo'), type: 'bar', data: totalAreaOutTwo }, |
| | | { name: t('large.countIn'), type: 'bar', data: countIn }, |
| | | { name: t('large.totalAreaIn'), type: 'bar', data: totalAreaIn } |
| | | { name: t('large.countOutOne'), type: 'bar', data: loadOneData }, |
| | | // { name: t('large.totalAreaOutOne'), type: 'bar', data: totalAreaOutOne }, |
| | | { name: t('large.countOutTwo'), type: 'bar', data: loadTwoData }, |
| | | // { name: t('large.totalAreaOutTwo'), type: 'bar', data: totalAreaOutTwo }, |
| | | { name: t('large.countIn'), type: 'bar', data: tempfontData }, |
| | | // { name: t('large.totalAreaIn'), type: 'bar', data: totalAreaIn } |
| | | ] |
| | | }; |
| | | |
| | | myChart.setOption(option); |
| | | myChart.setOption(option, true); |
| | | |
| | | |
| | | const chartDom2 = chartRef2.value; |
| | | if (!chartDom2) { |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | const myChart2 = echarts.init(chartDom2); |
| | | // myChart2 = echarts.init(chartDom2); |
| | | if (!myChart2) { |
| | | myChart2 = echarts.init(chartDom2); |
| | | } |
| | | // else { |
| | | // myChart2.clear(); |
| | | // } |
| | | let tempData; |
| | | let hollowOneData; |
| | | let hollowTwoData; |
| | | if (switchNoorAreaRight.value) { |
| | | tempData = countOut; |
| | | hollowOneData = hollowCountOutOne; |
| | | hollowTwoData = hollowCountOutTwo; |
| | | } else { |
| | | tempData = totalAreaOut; |
| | | hollowOneData = hollowTotalAreaOutOne; |
| | | hollowTwoData = hollowTotalAreaOutTwo; |
| | | } |
| | | const option2 = { |
| | | title: { text: '' }, |
| | | tooltip: { trigger: 'axis' }, |
| | | legend: { |
| | | data: [ |
| | | t('large.totalAreaOut'), |
| | | t('large.countOut'), |
| | | t('large.hollowTotalAreaOutOne'), |
| | | // t('large.totalAreaOut'), |
| | | t('large.hollowCountOutOne'), |
| | | // t('large.hollowTotalAreaOutOne'), |
| | | t('large.hollowCountOutTwo'), |
| | | t('large.hollowTotalAreaOutTwo') |
| | | // t('large.hollowTotalAreaOutTwo') |
| | | ] |
| | | }, |
| | | grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, |
| | | toolbox: { feature: { saveAsImage: {} } }, |
| | | toolbox: { |
| | | feature: { |
| | | saveAsImage: {}, |
| | | myTool1: { |
| | | show: true, |
| | | title: t('large.switch'), |
| | | icon: 'path://M512 0C229.234 0 0 229.234 0 512s229.234 512 512 512 512-229.234 512-512S794.766 0 512 0z m0 960C264.602 960 64 759.398 64 512S264.602 64 512 64s448 200.602 448 448-200.602 448-448 448z m0-768c-176.448 0-320 143.552-320 320s143.552 320 320 320 320-143.552 320-320-143.552-320-320-320z', // 圆形按钮图标(可换) |
| | | onclick: function () { |
| | | switchNoorAreaRight.value = !switchNoorAreaRight.value; |
| | | createchart(productionVO); |
| | | // customButtonClick(); // 调用你自定义的方法 |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | boundaryGap: false, |
| | | boundaryGap: true, |
| | | data: categories // 这是日期数据 |
| | | }, |
| | | yAxis: { type: 'value' }, |
| | | yAxis: { |
| | | type: 'value', |
| | | name: switchNoorAreaRight.value==true?t('large.quantity'):t('large.are'), // 坐标轴名称 |
| | | axisLabel: { |
| | | formatter: '{value}' |
| | | } |
| | | }, |
| | | series: [ |
| | | { name: t('large.totalAreaOut'), type: 'bar', data: totalAreaOut }, |
| | | { name: t('large.countOut'), type: 'bar', data: countOut }, |
| | | { name: t('large.hollowTotalAreaOutOne'), type: 'bar', data: hollowTotalAreaOutOne }, |
| | | { name: t('large.hollowCountOutOne'), type: 'bar', data: hollowCountOutOne }, |
| | | { name: t('large.hollowCountOutTwo'), type: 'bar', data: hollowCountOutTwo }, |
| | | { name: t('large.hollowTotalAreaOutTwo'), type: 'bar', data: hollowTotalAreaOutTwo } |
| | | // { name: t('large.totalAreaOut'), type: 'bar', data: tempData }, |
| | | { name: t('large.countOut'), type: 'bar', data: tempData }, |
| | | // { name: t('large.hollowTotalAreaOutOne'), type: 'bar', data: hollowOneData }, |
| | | { name: t('large.hollowCountOutOne'), type: 'bar', data: hollowOneData }, |
| | | // { name: t('large.hollowTotalAreaOutTwo'), type: 'bar', data: hollowTwoData }, |
| | | { name: t('large.hollowCountOutTwo'), type: 'bar', data: hollowTwoData } |
| | | ] |
| | | }; |
| | | |
| | | myChart2.setOption(option2); |
| | | myChart2.setOption(option2, true); |
| | | } |
| | | const handleMessage5 = (data) => { |
| | | productionVO.value = data.productionVO[0]; |
| | | createchart(productionVO); |
| | | }; |
| | | // 将原始数据转换为 ECharts 图表所需格式 |
| | | let categories = ref([]); // 获取日期作为 x 轴 |
| | |
| | | } else { |
| | | ElMessage.error(response.message); |
| | | } |
| | | } |
| | | catch (error) { |
| | | console.error(error); |
| | | } |
| | | } |
| | | |
| | | const exportToExcel = async () => { |
| | | try { |
| | | window.open(`http://${WebSocketHost}:10011/largenScreen/exportDailyProduction`, '_blank'); |
| | | } |
| | | catch (error) { |
| | | console.error(error); |
| | |
| | | }; |
| | | 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) |
| | | |
| | | const cleanupWebSocketData = (completeCleanup) => { |
| | | if (completeCleanup) { |
| | | // 完全清理 |
| | | rawGlassStorageDetailList.value = []; |
| | | orderDTOS.value = []; |
| | | // ...其他数组 |
| | | } else { |
| | | // 部分清理 - 保留最近数据 |
| | | const MAX_ITEMS = 50; |
| | | rawGlassStorageDetailList.value = rawGlassStorageDetailList.value.slice(-MAX_ITEMS); |
| | | orderDTOS.value = orderDTOS.value.slice(-MAX_ITEMS); |
| | | // ...其他数组 |
| | | } |
| | | |
| | | // 清理图表 |
| | | [myChart, myChart2, myChartLoad, myChartEdg, myChartTemp, myChartHollow].forEach(chart => { |
| | | if (chart) { |
| | | chart.clear(); |
| | | // 如果需要,可以重新初始化图表 |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // 在组件挂载时设置默认时间范围 |
| | | 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); |
| | |
| | | // 设置时间范围为 [开始时间, 结束时间] |
| | | // timeRange.value = [startTime.format('YYYY-MM-DD HH:mm:ss'), endTime.format('YYYY-MM-DD HH:mm:ss')]; |
| | | |
| | | const cleanupInterval = setInterval(() => { |
| | | cleanupWebSocketData(true); // 完全清理 |
| | | }, 300000); |
| | | |
| | | // 每次收到消息时检查数据量 |
| | | const originalHandleMessage = handleMessage; |
| | | handleMessage = (data) => { |
| | | originalHandleMessage(data); |
| | | cleanupWebSocketData(false); // 部分清理 |
| | | }; |
| | | |
| | | onUnmounted(() => { |
| | | clearInterval(cleanupInterval); |
| | | cleanupWebSocketData(true); // 组件卸载时完全清理 |
| | | }); |
| | | }); |
| | | // onMounted(() => { |
| | | // socket = initializeWebSocket(socketUrl, handleMessage); |
| | |
| | | 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); |
| | |
| | | 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 iframeUrl12 = ref(''); |
| | | const iframe12 = ref(false); |
| | | const handlehistorical12 = (key) => { |
| | | iframe12.value = true; |
| | | const params = new URLSearchParams({ |
| | | key: key, |
| | | }); |
| | | iframeUrl12.value = `${window.location.origin}/#/largescreendisplay/timeaxis?${params.toString()}`; |
| | | }; |
| | | |
| | | const transposedData = computed(() => { |
| | | const keys = Object.keys(fieldNames); // 按 fieldNames 的顺序 |
| | | return keys.map(key => { |
| | |
| | | frameborder="0"></iframe> |
| | | </el-dialog> |
| | | <el-dialog v-model="iframe10" top="5vh" width="95%" @close="iframeUrl10 = ''"> |
| | | <iframe :src="iframeUrl10" marginwidth="2000px" marginheight="2000px" width="100%" height="750px" |
| | | <iframe :src="iframeUrl10" marginwidth="2000px" marginheight="2000px" width="100%" height="700px" |
| | | 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> |
| | | <el-dialog v-model="iframe12" top="5vh" width="95%" @close="iframeUrl12 = ''"> |
| | | <iframe :src="iframeUrl12" marginwidth="2000px" marginheight="2000px" width="100%" height="750px" |
| | | frameborder="0"></iframe> |
| | | </el-dialog> |
| | | <div class="awatch" style="display: flex;"> |
| | | <!-- 生产统计 --> |
| | | <div style="height: 100px;width: 25%;float: right;"> |
| | | <div id="ss" style="width: 100%; display: flex; justify-content: center;"> |
| | | <div ref="chartRef" style="width: 600px; height: 400px;"></div> |
| | | <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%;" @dblclick="handlehistorical12(1)"></div> |
| | | </div> |
| | | <div style="width: 100%;height: 245px;display: flex;"> |
| | | <div ref="chartTwo" style="width: 100%;"></div> |
| | | <div ref="chartEdg" style="width: 100%;" @dblclick="handlehistorical12(2)"></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: 130px;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 }}片</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.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 }}片</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 }}片</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 }}片</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 }}片</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: 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].countOutOne : 0 }}片</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.are') }}:{{ productionVO.length > 0 ? productionVO[6].totalAreaOutOne : 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].countOutTwo : 0 }}片</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.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 }}片</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> |
| | | |
| | |
| | | style="width: 53px;height: 22px;top: 282px;left: 282px;position: absolute;background-color: #911005;"></div> |
| | | <!-- 切割台色块 --> |
| | | <div v-if="engineeringOne.length > 1" class="slicing" |
| | | style="width: 45px;height: 20px;top: 500px;left: 496px;position: absolute;background-color: #911005;"></div> |
| | | <div v-if="engineeringTwo.length > 1" class="slicing" |
| | | style="width: 45px;height: 20px;top: 550px;left: 496px;position: absolute;background-color: #911005;"></div> |
| | | <div v-if="engineeringTwo.length > 1" class="slicing" |
| | | style="width: 45px;height: 20px;top: 500px;left: 496px;position: absolute;background-color: #911005;"></div> |
| | | <!-- 原片仓储色块 --> |
| | | <div class="raw" style="width: 27px;height: 30px;top: 497px;left: 296px;position: absolute;"> |
| | | <div v-for="(item, index) in rawGlassStorageDetailList.slice(0, 7)" :key="index" |
| | |
| | | <!-- 磨边色块 --> |
| | | <div class="container" |
| | | style="position: relative;width: 15px;height: 15px;top: 500px;left: 638px;position: absolute;"> |
| | | <div v-for="(box, index) in boxes" :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 boxes2" :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" |
| | |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="height: 100px;width: 25%;float: right;"> |
| | | <div id="ss" style="width: 100%; display: flex; justify-content: center;"> |
| | | <div ref="chartRef2" style="width: 600px; height: 400px;"></div> |
| | | <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%;" @dblclick="handlehistorical12(3)"></div> |
| | | </div> |
| | | <div style="width: 100%;height: 245px;display: flex;"> |
| | | <div ref="chartFour" style="width: 100%;"></div> |
| | | <div ref="chartHollow" style="width: 100%;" @dblclick="handlehistorical12(4)"></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> |