| | |
| | | <template> |
| | | <div> |
| | | <div style="display: flex;width: 1770px;"> |
| | | <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" |
| | | :start-placeholder="$t('reportmanage.starttime')" style="margin-left: 15px;" value-format="YYYY-MM-DD hh:mm:ss" |
| | | :end-placeholder="$t('reportmanage.endtime')"> |
| | | <el-date-picker v-model="timeRange" type="daterange" range-separator="至" |
| | | :start-placeholder="$t('reportmanage.starttime')" :end-placeholder="$t('reportmanage.endtime')" |
| | | value-format="YYYY-MM-DD" style="margin-left: 15px;"> |
| | | </el-date-picker> |
| | | <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" |
| | | @click="sethistorical()">{{ $t('reportmanage.inquire') }}</el-button> |
| | | <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="sethistorical()">{{ |
| | | $t('reportmanage.inquire') }}</el-button> |
| | | <el-button type="primary" @click="exportToExcel">{{$t('large.ExporttoExcel')}}</el-button> |
| | | <el-button type="primary" @click="showchart=!showchart" style="margin-left: 10px;">{{ $t('large.switch') }}</el-button> |
| | | </div> |
| | | <el-table ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax" |
| | | <el-table v-show="!showchart" ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax" |
| | | :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"> |
| | | <el-table-column prop="date" align="center" :label="$t('large.date')" min-width="70" /> |
| | | <el-table-column prop="countOutOne" align="center" :label="$t('large.countOutOne')" min-width="40" /> |
| | | <el-table-column prop="totalAreaOutOne" align="center" :label="$t('large.totalAreaOutOne')" min-width="40" /> |
| | | <el-table-column prop="countOutTwo" align="center" :label="$t('large.countOutTwo')" min-width="50" /> |
| | | <el-table-column prop="totalAreaOutTwo" align="center" :label="$t('large.totalAreaOutTwo')" min-width="40" /> |
| | | <el-table-column prop="countIn" align="center" :label="$t('large.countIn')" min-width="40" /> |
| | | <el-table-column prop="totalAreaIn" align="center" :label="$t('large.totalAreaIn')" min-width="40" /> |
| | | <el-table-column prop="totalAreaOutTwo" align="center" :label="$t('large.totalAreaOutTwo')" min-width="50" /> |
| | | <el-table-column prop="countIn" align="center" :label="$t('large.countIn')" min-width="50" /> |
| | | <el-table-column prop="totalAreaIn" align="center" :label="$t('large.totalAreaIn')" min-width="50" /> |
| | | <el-table-column prop="countOut" align="center" :label="$t('large.countOut')" min-width="40" /> |
| | | <el-table-column prop="totalAreaOut" align="center" :label="$t('large.totalAreaOut')" min-width="40" /> |
| | | <el-table-column prop="hollowCountOutOne" align="center" :label="$t('large.hollowCountOutOne')" min-width="40" /> |
| | | <el-table-column prop="hollowTotalAreaOutOne" align="center" :label="$t('large.hollowTotalAreaOutOne')" |
| | | min-width="40" /> |
| | | <el-table-column prop="countOut" align="center" :label="$t('large.countOut')" min-width="40" /> |
| | | <el-table-column prop="hollowCountOutTwo" align="center" :label="$t('large.hollowCountOutTwo')" min-width="40" /> |
| | | <el-table-column prop="hollowTotalAreaOutTwo" align="center" :label="$t('large.hollowTotalAreaOutTwo')" |
| | | min-width="40" /> |
| | | </el-table> |
| | | <div style="margin-top: 20px;margin-left: 40%;"> |
| | | <div v-show="!showchart" style="margin-top: 20px;margin-left: 40%;"> |
| | | <el-pagination v-model:current-page="currentPage2" :page-size="pageSize" :size="large" :disabled="disabled" |
| | | layout="prev, pager, next, jumper" :total="totalRecords" @current-change="handlePageChange2" |
| | | style="margin-top: 10px;" /> |
| | | </div> |
| | | <div v-show="showchart" id="ss" style="width: 100%; display: flex; justify-content: center;"> |
| | | <div ref="chartRef" style="width: 1770px; height: 320px;"></div> |
| | | </div> |
| | | <div v-show="showchart" id="ss" style="width: 100%; display: flex; justify-content: center;"> |
| | | <div ref="chartRef2" style="width: 1770px; height: 320px;"></div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | import { useRouter } from "vue-router" |
| | | import request from "@/utils/request" |
| | | import { host, WebSocketHost } from '@/utils/constants' |
| | | import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref } from "vue"; |
| | | import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref , nextTick} from "vue"; |
| | | import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService'; |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import * as echarts from 'echarts'; |
| | | const { t } = useI18n() |
| | | let language = ref(localStorage.getItem('lang') || 'zh') |
| | | import { inject } from 'vue'; |
| | |
| | | })); |
| | | // tableDatax.value = response.data.records; |
| | | tableDatax.value = formattedData; |
| | | console.log(response.data.pages); |
| | | createchart(tableDatax); |
| | | totalRecords.value = response.data.total / 2 || 0 |
| | | } else { |
| | | ElMessage.error(response.message); |
| | |
| | | } |
| | | const handlePageChange2 = (newPage) => { |
| | | currentPage2.value = newPage; |
| | | console.log(currentPage2.value); |
| | | window.localStorage.setItem('pagenumber', currentPage2.value) |
| | | historicala(currentPage2.value); |
| | | }; |
| | |
| | | })); |
| | | // tableDatax.value = response.data.records; |
| | | tableDatax.value = formattedData; |
| | | createchart(tableDatax); |
| | | totalRecords.value = response.data.total / 2 || 0 |
| | | } else { |
| | | ElMessage.error(response.message); |
| | |
| | | } |
| | | let startTime = window.localStorage.getItem('startTime') |
| | | let page = window.localStorage.getItem('pagenumber') |
| | | console.log(page); |
| | | const response = await request.post("/loadGlass/largenScreen/queryDailyProduction", { |
| | | pageNo: 1, |
| | | pageSize: 20, |
| | |
| | | })); |
| | | // tableDatax.value = response.data.records; |
| | | tableDatax.value = formattedData; |
| | | createchart(tableDatax); |
| | | totalRecords.value = response.data.total / 2 || 0 |
| | | } else { |
| | | ElMessage.error(response.message); |
| | |
| | | function parseAndSetTime() { |
| | | const backendTime = new Date(getglobalDate); |
| | | const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天 |
| | | console.log(formatTimestamp(oneWeekAgo)); |
| | | console.log(oneWeekAgo); |
| | | oneWeekAgo.setHours(0, 0, 0, 0); |
| | | timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]; |
| | | window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo)) |
| | | } |
| | |
| | | return 'success'; |
| | | } |
| | | } |
| | | function getStatusTexta(taskRunning: number) { |
| | | switch (taskRunning) { |
| | | case 0: |
| | | return t('basicData.untask'); |
| | | case 1: |
| | | return t('basicData.up'); |
| | | } |
| | | } |
| | | onMounted(() => { |
| | | parseAndSetTime(); |
| | | historical(); |
| | | }); |
| | | |
| | | import * as XLSX from 'xlsx'; |
| | | import { saveAs } from 'file-saver'; |
| | | |
| | | const exportToExcel = () => { |
| | | // 表格数据(深拷贝防止污染) |
| | | const data = JSON.parse(JSON.stringify(tableDatax.value)); |
| | | |
| | | // 表头转换为中文或国际化文本 |
| | | const headerMap = { |
| | | date: t('large.date'), |
| | | countOutOne: t('large.countOutOne'), |
| | | totalAreaOutOne: t('large.totalAreaOutOne'), |
| | | countOutTwo: t('large.countOutTwo'), |
| | | totalAreaOutTwo: t('large.totalAreaOutTwo'), |
| | | countIn: t('large.countIn'), |
| | | totalAreaIn: t('large.totalAreaIn'), |
| | | countOut: t('large.countOut'), |
| | | totalAreaOut: t('large.totalAreaOut'), |
| | | hollowCountOutOne: t('large.hollowCountOutOne'), |
| | | hollowTotalAreaOutOne: t('large.hollowTotalAreaOutOne'), |
| | | hollowCountOutTwo: t('large.hollowCountOutTwo'), |
| | | hollowTotalAreaOutTwo: t('large.hollowTotalAreaOutTwo') |
| | | }; |
| | | |
| | | // 将数据中的 key 替换为中文表头 |
| | | const exportData = data.map(row => { |
| | | const newRow = {}; |
| | | for (const key in headerMap) { |
| | | newRow[headerMap[key]] = row[key]; |
| | | } |
| | | return newRow; |
| | | }); |
| | | |
| | | // 转换为工作表 |
| | | const worksheet = XLSX.utils.json_to_sheet(exportData); |
| | | const workbook = XLSX.utils.book_new(); |
| | | XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); |
| | | |
| | | // 导出为文件 |
| | | const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); |
| | | const blob = new Blob([excelBuffer], { type: 'application/octet-stream' }); |
| | | saveAs(blob, t('large.Productionsituation')); |
| | | }; |
| | | let categories = ref([]); // 获取日期作为 x 轴 |
| | | let totalAreaOutOne = ref([]); |
| | | let countIn = ref([]); |
| | | let totalAreaOutTwo = ref([]); |
| | | let totalAreaOut = ref([]); |
| | | let countOut = ref([]); |
| | | let hollowTotalAreaOutTwo = ref([]); |
| | | let hollowCountOutOne = ref([]); |
| | | let countOutTwo = ref([]); |
| | | let hollowCountOutTwo = ref([]); |
| | | let hollowTotalAreaOutOne = ref([]); |
| | | let totalAreaIn = ref([]); |
| | | let countOutOne = ref([]); |
| | | let myChart = null; |
| | | let myChart2 = null; |
| | | const chartRef = ref(null) |
| | | const chartRef2 = ref(null) |
| | | const showchart = ref(false) |
| | | const switchNoorAreaLeft = ref(true) |
| | | const switchNoorAreaRight = ref(true) |
| | | 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); |
| | | totalAreaOutTwo = productionVO.value.map(item => item.totalAreaOutTwo); |
| | | totalAreaOut = productionVO.value.map(item => item.totalAreaOut); |
| | | countOut = productionVO.value.map(item => item.countOut); |
| | | hollowTotalAreaOutTwo = productionVO.value.map(item => item.hollowTotalAreaOutTwo); |
| | | hollowCountOutOne = productionVO.value.map(item => item.hollowCountOutOne); |
| | | countOutTwo = productionVO.value.map(item => item.countOutTwo); |
| | | hollowCountOutTwo = productionVO.value.map(item => item.hollowCountOutTwo); |
| | | hollowTotalAreaOutOne = productionVO.value.map(item => item.hollowTotalAreaOutOne); |
| | | totalAreaIn = productionVO.value.map(item => item.totalAreaIn); |
| | | countOutOne = productionVO.value.map(item => item.countOutOne); |
| | | //图表 |
| | | nextTick() // 确保 DOM 加载完成 |
| | | const chartDom = chartRef.value; |
| | | if (!chartDom) { |
| | | 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 option = { |
| | | title: { text: '' }, |
| | | tooltip: { trigger: 'axis' }, |
| | | legend: { |
| | | data: [ |
| | | t('large.countOutOne'), |
| | | // t('large.totalAreaOutOne'), |
| | | t('large.countOutTwo'), |
| | | // t('large.totalAreaOutTwo'), |
| | | t('large.countIn'), |
| | | // t('large.totalAreaIn') |
| | | ] |
| | | }, |
| | | 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: true, |
| | | data: categories // 这是日期数据 |
| | | }, |
| | | yAxis: { type: 'value' }, |
| | | series: [ |
| | | { 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, true); |
| | | |
| | | |
| | | const chartDom2 = chartRef2.value; |
| | | if (!chartDom2) { |
| | | console.error('图表容器未找到'); |
| | | return; |
| | | } |
| | | // 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.countOut'), |
| | | // t('large.totalAreaOut'), |
| | | t('large.hollowCountOutOne'), |
| | | // t('large.hollowTotalAreaOutOne'), |
| | | t('large.hollowCountOutTwo'), |
| | | // t('large.hollowTotalAreaOutTwo') |
| | | ] |
| | | }, |
| | | grid: { 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 () { |
| | | switchNoorAreaRight.value = !switchNoorAreaRight.value; |
| | | createchart(productionVO); |
| | | // customButtonClick(); // 调用你自定义的方法 |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | boundaryGap: true, |
| | | data: categories // 这是日期数据 |
| | | }, |
| | | yAxis: { type: 'value' }, |
| | | series: [ |
| | | // { 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, true); |
| | | } |
| | | |
| | | |
| | | |
| | | </script> |
| | | <style scoped></style> |