<!-- * @Author: zhp * @Date: 2024-05-23 15:50:44 * @LastEditTime: 2024-06-06 15:13:06 * @LastEditors: zhp * @Description: --> <template> <chart-container class="bar-chart-base"> <div class="legend"> <span v-for="(item,index) in legend" :key="index" class="legend-item" :style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }">{{ item.label }}</span> </div> <div ref="oeeChart" style="height:94%;width:100%"></div> </chart-container> </template> <script> import screenfull from "screenfull"; import ChartContainer from "../../../../components/ChartContainer.vue"; // import chartMixin from "@/mixins/chart.js"; import { debounce } from "@/utils/debounce"; import * as echarts from "echarts"; export default { name: "barChartBaseoee", components: { ChartContainer, }, // mixins: [chartMixin], props: { vHeight: { type: Number, default: 36, }, legend: { type: Array, required: true, }, xAxis: { type: Array, required: true, }, series: { type: Array, required: true, }, in: { type: String, default: "", }, }, data() { return { width: '100%', isFullscreen: false, actualOptions: null, options: { grid: { left: "5%", right: "0%", bottom: "3%", top: "15%", containLabel: true, }, tooltip: {}, xAxis: { axisTick: { show: false, }, axisLine: { lineStyle: { color: "#4561AE", }, }, axisLabel: { color: "#fff", fontSize: 12, }, data: this.xAxis, }, yAxis: { name: "单位/%", nameTextStyle: { color: "#fff", fontSize: 12, }, axisTick: { show: false, }, axisLabel: { color: "#fff", fontSize: 12, }, axisLine: { show: true, lineStyle: { color: "#4561AE", }, }, splitLine: { lineStyle: { color: "#4561AE", }, }, }, series: [ { name: "", // this.series[0].name, type: "bar", barWidth: 12, itemStyle: { borderRadius: [10, 10, 0, 0], color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, colorStops: [ { offset: 0, color: "#12f7f1", // 0% 处的颜色 }, { offset: 0.35, color: "#12f7f177", // 100% 处的颜色 }, { offset: 0.75, color: "#12f7f133", // 100% 处的颜色 }, { offset: 1, color: "transparent", // 100% 处的颜色 }, ], global: false, // 缺省为 false }, }, data: [], // this.series[0].data, }, { name: "", // this.series[1].name, type: "bar", barWidth: 12, // tooltip: { // valueFormatter: function (value) { // return value + " ml"; // }, // }, itemStyle: { borderRadius: [10, 10, 0, 0], color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, colorStops: [ { offset: 0, color: "#57abf8", // 0% 处的颜色 }, { offset: 1, color: "#364BFE66", // 100% 处的颜色 }, ], global: false, // 缺省为 false }, }, data: [], // this.series[1].data, }, { name: "", // "2024年目标值", type: "line", lineStyle: { color: "#f3c000", }, itemStyle: { color: "#f3c000", }, areaStyle: { color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, colorStops: [ { offset: 0, color: "#f3c000", // 0% 处的颜色 }, { offset: 0.55, color: "#f3c00033", }, { offset: 1, color: "transparent", // 100% 处的颜色 }, ], global: false, // 缺省为 false }, }, data: [], // this.series[0].data, }, ], }, }; }, computed: { isOpen() { return this.$store.getters.sidebar.opened }, }, watch: { isOpen(val) { this.canvasReset() }, /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */ isFullscreen(val) { // this.actualOptions.series.map((item) => { // item.barWidth = val ? 18 : 12; // }); // this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12; // if (val === false && this.isOpen === true) { // console.log(val) // this.width = 97 + '%' // this.canvasReset() // } else if (val === false && this.isOpen === false) { // this.width = 100 + '%' // this.canvasReset() // } // this.actualOptions.series.map((item) => { // item.barWidth = val ? 18 : 12; // }); // this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12; this.initChart(this.actualOptions) this.canvasReset() }, series(val) { if (!val) { this.initChart(this.options); return; } console.log(val) const actualOptions = JSON.parse(JSON.stringify(this.options)) actualOptions.series[0].data = val[0].data; actualOptions.series[0].name = val[0].name; actualOptions.series[1].data = val?.[1]?.data || []; actualOptions.series[1].name = val?.[1]?.name || ""; actualOptions.series[2].data = val?.[2]?.data || []; actualOptions.series[2].name = val?.[2]?.name || ""; this.actualOptions = actualOptions; this.initChart(actualOptions); }, }, mounted() { // if (screenfull.isEnabled) { // screenfull.on("change", () => { // this.isFullscreen = screenfull.isFullscreen; // }); // } if (screenfull.isEnabled) { screenfull.on("change", () => { this.isFullscreen = screenfull.isFullscreen; }); } this.actualOptions = this.options this.canvasReset(); window.addEventListener("resize", this.canvasReset); }, beforeDestroy() { if (this.chart) { this.chart.dispose(); } }, destroyed() { window.removeEventListener("resize", this.canvasReset); }, methods: { canvasReset() { debounce(() => { this.initChart(); }, 500)(); }, initChart() { if (this.chart) { this.chart.dispose(); } this.chart = echarts.init(this.$refs.oeeChart); this.chart.setOption(this.actualOptions); }, }, }; </script> <style scoped lang="scss"> .bar-chart-base { // position: relative; .legend { position: absolute; top: 5.2vh; right: 1vw; } .legend-item { position: relative; // font-size: 12px; margin-right:1.3vw; &::before { content: ""; display: inline-block; width: 0.531vw; height: 0.531vw; background-color: #ccc; border-radius: 2px; margin-right: 0.22vw; } } .legend-item:nth-child(3) { margin-left: 1vw; } .legend-item:nth-child(1):before { background-color: #12f7f1; } .legend-item:nth-child(2):before { background-color: #58adfa; } .legend-item:nth-child(3):before { // width: 12px; // height: 2px; width: 1vw; height: 0.1064vw; background-color: #f3c000; position: absolute; top: 50%; // left: -16px; left: -0.951vw; transform: translateY(-50%); } .legend-item:nth-child(3):after { background-color: #f3c000; content: ""; display: inline-block; position: absolute; // width: 6px; // height: 6px; width: 0.3191vw; height: 0.3191vw; border-radius: 100%; top: 50%; left: -0.851vw; // left: -16px; transform: translateY(-50%) translateX(50%); } } </style>