Files
tunnel-cloud-web/src/components/content/usedEle/UsedEle.vue

587 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div id="used-ele" :style="{ backgroundColor: bgImage }" @click="handleOpenChart">
<div v-if="electricityConsumptionMonthly===0||monthlySavings===0" class="showNull ">
<div class="loading" v-if="loading===0"></div>
{{ loading === 0 ? '加载中...' : '暂无数据~' }}
</div>
<div v-else class="content">
<div class="item">
<div class="container" ref="length">
<div class="value" ref="valueA"></div>
</div>
<div>
<div class="icon"></div>
<span>当月用电量{{ electricityConsumptionMonthly }}kwh</span>
</div>
</div>
<div class="item">
<div class="container" ref="length">
<div class="value" ref="valueB"></div>
</div>
<div>
<div class="icon"></div>
<span>当月节省量{{ monthlySavings }}kwh</span>
</div>
</div>
<div class="ele-left-bottom-icon"></div>
<div class="ele-right-bottom-icon"></div>
</div>
</div>
<div class="digital-tunnel">
<el-dialog :close-on-click-modal="false" v-model="isVisited" width="2175px" :modal="false">
<div class="left-top-icon"></div>
<div class="right-top-icon"></div>
<div class="user-select">
<el-select
v-model="chooseChartFan"
filterable
placeholder="请选择风机"
:fit-input-width="true"
:teleported="false"
@change="changeFanData"
>
<el-option
v-for="item in fanList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="top-tag">
<div class="allUsedEle">
<div class="use-title">
月总用电量
</div>
<div class="value">{{ totalElectricityConsumption }}kwh</div>
</div>
<div class="allUsedEle">
<div class="use-title">
月节省量
</div>
<div class="value">{{ saveElectricity }}kwh</div>
</div>
</div>
<div class="loading-block" v-if="showLoading">
<div class="loading" v-if="loadingText==='加载中...'"></div>
<span>{{ loadingText }}</span>
</div>
<div class="chat-dialog" v-else>
<div id="containerEle"></div>
<div style="width: 1px;"></div>
</div>
<div class="time-select">
<choose-month v-if="selectTimeButton===1" ref="chooseMonthRef" @select="monthSelect"/>
<time-range-btn
:buttonList="timeList"
v-model="selectTimeButton"
@select="timeSelect"
/>
</div>
<div class="left-bottom-icon"></div>
<div class="right-bottom-icon"></div>
</el-dialog>
</div>
</template>
<script setup>
import * as echarts from 'echarts';
import TimeRangeBtn from "@/components/timeRangeBtn/index.vue"
import ChooseMonth from "@/components/chooseMonth/index.vue"
import {getEleEchartsInfo} from "@/api/largeScreen";
const props = defineProps({
list: Array,
eleData: Array,
loading: Number
});
const loadingText = ref('加载中...')
const timeList = ref(["年", "月"]);
const selectTimeButton = ref(1);
const chooseMonthRef = ref();
const monthValue = ref('');
const chooseChartFan = ref('');
let myEcharts = reactive({});
const isVisited = ref(false);
const showLoading = ref(false)
const electricityConsumptionMonthly = ref(0)
const monthlySavings = ref(0)
const totalElectricityConsumption = ref(0)
const saveElectricity = ref(0)
const openEquipmentId = ref(0)
const length = ref(null);
const valueA = ref();
const fanList = ref([]);
const valueB = ref(monthlySavings.value);
const bgImage = computed(() =>
isVisited.value
? "#2E5589"
: "rgba(6,34,71,0.78)"
);
watch(() => props.loading, (now) => {
props.loading = now
}, {deep: true});
watch(() => props.eleData, (now) => {
if (now) {
let fanObj = {}
now.frequencyChangerList.forEach(item => {
if (item.equipmentId === 22 || item.equipmentId === 23) {
fanObj = {
value: item.equipmentId,
label: changeNum(item.equipmentId)
}
}
fanList.value.push(fanObj)
})
getBasicData(now.largeScreenElectricity)
}
nextTick(() => {
setValueA()
setValueB()
})
}, {deep: true});
// watch(() => props.list, (now) => {
// console.log(now,props.eleData,'大V大V')
// props.eleData.frequencyChangerList.forEach(item => {
// now.forEach(newItem => {
// if (item.equipmentId === newItem.equipmentId) {
// if (newItem.electricityConsumptionDay) {
// electricityConsumptionMonthly.value = newItem.electricityConsumptionMonthly
// }
// }
// })
// })
// setValueA()
// setValueB()
// }, {deep: true});
const changeNum = (item) => {
switch (item) {
case 22:
return '一号风机';
case 23:
return '二号风机';
}
}
const setValueA = () => {
if (electricityConsumptionMonthly.value === 0 || length.value === null) {
valueA.value.style.height = `0px`;
}
let width = (electricityConsumptionMonthly.value * length.value?.offsetHeight) / 40000;
valueA.value.style.height = `${width}px`;
}
const setValueB = () => {
if (monthlySavings.value === 0 || length.value === null) {
valueB.value.style.height = `0px`;
}
let width = (monthlySavings.value * length.value?.offsetHeight) / 40000;
valueB.value.style.height = `${width}px`;
}
const getBasicData = (data) => {
electricityConsumptionMonthly.value = data.electricityConsumptionCount
monthlySavings.value = data.conserveElectricityCount
}
const monthSelect = (val) => {
monthValue.value = val
getFanInfo(openEquipmentId.value, 'month', val)
}
const changeDate = (index) => {
switch (index) {
case 0:
return 'years'
case 1:
return 'month'
}
}
const timeSelect = (index) => {
monthValue.value = ''
getFanInfo(openEquipmentId.value, changeDate(index))
};
const changeFanData = (val) => {
selectTimeButton.value = 1
openEquipmentId.value = val
getFanInfo(val, 'month', monthValue.value)
}
const getFanInfo = (equipmentId, type = 'month', time = '') => {
isVisited.value = true
showLoading.value = true
getEleEchartsInfo(equipmentId, time, type).then(res => {
if (res?.code === 1000) {
showLoading.value = false
totalElectricityConsumption.value = res.data.totalElectricityConsumption
saveElectricity.value = res.data.saveElectricity
nextTick(() => {
initChart(res.data.dates, res.data.consumptionValues, res.data.saveElectricityValues)
})
}
})
nextTick(() => {
loadingText.value = '加载中...'
})
}
const handleOpenChart = () => {
selectTimeButton.value = 1
isVisited.value = true
openEquipmentId.value = fanList.value[0].value
chooseChartFan.value = fanList.value[0].value
nextTick(() => {
chooseMonthRef.value.clearData()
})
getFanInfo(openEquipmentId.value, 'month')
}
/**
* 初始化echarts实例方法
*/
const initChart = (type, valueA, valueB) => {
//3.初始化container容器
myEcharts = echarts.init(document.getElementById('containerEle'));
//5.传入数据
let option = {
//图例
legend: {
left: 0,
textStyle: {
color: '#60DDDE',
fontSize: 45
},
itemWidth: 30,
itemHeight: 30,
icon: "circle",
},
//离容器四侧的距离
grid: {
left: 0, // 左边距
right: 20, // 右边距
top: 80, // 顶边距
bottom: 110, // 底边距
containLabel: true,
},
//提示框组件
tooltip: {
show: true,
trigger: 'axis',
backgroundColor: "transparent", // 设置背景颜色为透明
borderColor: "transparent", // 设置边框颜色为透明
padding: 0, // 设置内边距为0
textStyle: {
fontSize: 40
},
formatter: function (params) {
let content = `
<div style="background: linear-gradient(180deg, #254062 0%, rgba(20,36,51,0.3) 100%);border: 2px solid #6087BA;border-radius: 4px;padding: 8px 16px;">
<div style="font-size: 52px;font-family: PingFang SC-Regular, PingFang SC;font-weight: 400;color: #EFEEEE;margin-bottom: 8px;">${params[0].name}日</div>
<div style="font-size: 48px;line-height: 48px;font-family: Bebas Neue-Regular, Bebas Neue;font-weight: 400;"><span style="color: #FFFFFF">日用电量: </span><span style="background: linear-gradient(180deg, #F5B85F 0%, #FFFFFF 100%);background-clip: text;-webkit-background-clip: text;-webkit-text-fill-color: transparent;">${params[0].value}</span></div>
<div style="font-size: 48px;line-height: 48px;font-family: Bebas Neue-Regular, Bebas Neue;font-weight: 400;margin-top: 30px"><span style="color: #FFFFFF">日节省量: </span><span style="background: linear-gradient(180deg, #F5B85F 0%, #FFFFFF 100%);background-clip: text;-webkit-background-clip: text;-webkit-text-fill-color: transparent;">${params[1].value}</span></div>
</div>`;
return content;
},
},
toolbox: {
show: false,
right: 10,
feature: {
dataZoom: {
yAxisIndex: 'none'
}
}
},
dataZoom: [{
type: 'inside'
},
{
type: 'slider',
top: 900,
height: 100,
textStyle: {
fontSize: 45,
color: '#fffff'
}
}],
//X轴
xAxis: {
type: 'category',
// data: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31'],
data: type,
axisLabel: {
textStyle: {
fontSize: 45,
color: '#D6F1FA'
},
},
},
//Y轴
yAxis: {
type: 'value',
axisLabel: {
textStyle: {
fontSize: 45,
color: '#D6F1FA'
},
},
},
//配置项
series: [
{
name: '日用电量',
// data: [120, 200, 150, 80, 70, 110, 130, 100, 140, 130, 160, 150, 90, 130, 110, 120, 150, 140, 130, 120, 110, 100, 90, 80, 100, 140, 130, 160, 150, 24, 50],
data: valueA,
type: 'bar'
},
{
name: '日节省量',
// data: [140, 130, 160, 150, 90, 130, 110, 120, 150, 140, 130, 120, 110, 100, 90, 80, 100, 140, 130, 160, 150, 24, 50, 120, 200, 150, 80, 70, 110, 130, 100,],
data: valueB,
type: 'bar'
},
]
}
myEcharts.setOption(option);
//图表大小自适应窗口大小变化
window.onresize = () => {
myEcharts.resize();
}
}
</script>
<style lang="scss">
.user-select {
margin-bottom: 126px;
.el-select {
width: 476px;
}
.el-input {
width: 476px;
.el-input__wrapper {
background-color: transparent;
box-shadow: none;
border-radius: 10px;
border: 2px solid #0F82AF;
.el-input__inner {
height: 80px;
font-size: 40px;
color: #FFFFFF;
}
}
}
.el-select__placeholder {
height: 54px;
line-height: 54px;
color: #FFFFFF;
}
.el-select__placeholder.is-transparent {
height: 54px;
line-height: 54px;
}
.el-select__selected-item {
//height: 54px;
//line-height: 54px;
.el-tag {
max-width: none !important;
height: 55px;
font-size: 43px;
.el-icon {
font-size: 51px;
width: auto;
height: auto;
}
}
}
.el-select__caret {
font-size: 35px !important;
}
.el-select-dropdown__item.is-hovering {
background-color: #064B66 !important;
}
.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after {
width: 42px;
height: 42px;
}
.el-input {
min-height: 75px;
height: auto !important;
}
.el-form-item.is-error .el-input__wrapper {
box-shadow: none;
}
.el-select__wrapper {
min-height: 75px;
height: auto !important;
background-color: transparent;
border: 1px solid #08B7B8;
font-size: 35px;
width: 476px !important;
}
.el-select__popper {
margin-top: -12px !important;
background: #072247 !important;
border: 1px solid #0F82AF !important;
//width: 476px!important;
inset: 86px auto auto 0 !important;
.el-select-dropdown {
width: auto;
}
}
.el-popper {
width: auto;
min-width: auto;
margin-left: 0;
box-sizing: border-box;
}
.el-popper__arrow::before {
display: none;
}
.el-select-dropdown__item {
font-size: 38px !important;
height: 60px !important;
line-height: 60px !important;
> span {
color: #FFFFFF;
}
}
.el-select .el-input .el-select__caret {
font-size: 35px !important;
}
.el-select-dropdown__item.hover, .el-select-dropdown__item:hover {
background-color: #064B66 !important;
}
.el-select-dropdown.is-multiple .el-select-dropdown__item.selected {
background-color: #064B66 !important;
}
.el-select-tags-wrapper {
.el-tag {
padding: 28px 20px !important;
font-size: 35px;
.el-icon {
width: 40px;
height: 40px;
font-size: 40px !important;
}
}
}
}
</style>
<style lang="scss" scoped>
:deep(.el-dialog__header) {
padding: 0 !important;
}
#used-ele {
margin-top: 40px;
cursor: pointer;
width: 830px;
//height: 373px;
color: aliceblue;
border: 2px solid #0f82af;
background: rgba(6, 34, 71, 0.78);
border-radius: 20px;
padding: 21px 62px 35px 62px;
position: relative;
.ele-left-bottom-icon {
position: absolute;
bottom: -3px;
left: -3px;
width: 41px;
height: 41px;
background-image: url(@/assets/images/badGasInfo/sp_jz.png);
transform: rotate(-90deg);
}
.ele-right-bottom-icon {
position: absolute;
bottom: -3px;
right: -3px;
width: 41px;
height: 41px;
background-image: url(@/assets/images/badGasInfo/sp_jz.png);
transform: rotate(180deg);
}
.title {
width: 96px;
height: 42px;
font-size: 32px;
font-family: MicrosoftYaHei, MicrosoftYaHei;
font-weight: bold;
color: #38cafb;
line-height: 42px;
}
.content {
margin-top: 4px;
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
.item {
margin-top: 44px;
font-size: 28px;
color: #38CAFB;
display: flex;
flex-direction: column;
align-items: center;
.container {
width: 60px;
height: 210px;
-webkit-border-radius: 31px;
border: 1px solid rgba(105, 231, 253, 1);
position: relative;
margin-bottom: 20px;
padding: 1px;
.value {
position: absolute;
bottom: 0;
width: 100%;
height: inherit;
background: linear-gradient(180deg, #38CAFB 0%, #2775E7 100%);
-webkit-border-radius: 31px;
//transition: width 0.5s linear 0s;
-webkit-transition: width 1s ease-in-out;
}
}
> div:nth-child(2) {
display: flex;
.icon {
margin-right: 10px;
width: 29px;
height: 33px;
background-image: url(../../../assets/images/usedEle/white-ele.png);
}
}
}
}
}
</style>