能效诊断

This commit is contained in:
jiangyinzhi
2024-07-10 10:25:32 +08:00
parent b7aa6f87f1
commit 04f0606430
262 changed files with 58693 additions and 1 deletions
@@ -0,0 +1,984 @@
<template>
<div class="energyReport-template">
<!-- <reportHeader v-if="show" title="能耗定额指标"></reportHeader> -->
<div class="energyReport-quota">
<div class="bar-title">
<img src="@/assets/energyReport-left.png" alt="" />
<div class="bar-title-color">能耗定额指标</div>
<img src="@/assets/energyReport-right.png" alt="" />
</div>
<!--能源消耗量表格 -->
<div class="quota">
<div class="quota-div">
<img class="quota-img" src="@/assets/summarize.png" alt="" />
<h1>能源消耗量</h1>
</div>
<!-- 柱状图 -->
<div class="barChart"></div>
</div>
</div>
<!-- 标准折算煤及占比饼图 -->
<div class="sameStyle">
<div class="sameStyle-div">
<img class="sameStyle-img" src="@/assets/summarize.png" alt="" />
<h1>标准折算煤及占比</h1>
</div>
<div class="pieChart"></div>
</div>
<!-- 电源消耗量折线图 -->
<div class="lineChartStyle">
<div class="lineChartStyle-div">
<img class="lineChartStyle-img" src="@/assets/summarize.png" alt="" />
<h1>电能消耗量</h1>
</div>
<div class="lineChart"></div>
<div class="lineChart-detail">
<h1>用能情况分析:</h1>
<div>
贵单位消耗的主要能源种类为:{{
EnergyReportInfo.buildEnergyType
}}。近1年建筑能源消耗折合标煤{{
EnergyReportInfo.standardCoal
}}吨折煤,其中(电折合标煤量{{
EnergyReportInfo.standardCoalPower
}}吨折煤、燃气折合{{
EnergyReportInfo.standardCoalGas
}}吨折煤、柴油折合{{
EnergyReportInfo.standardCoalDieselGas
}}吨折煤),统计期电能折合标煤量约占总能耗的{{
EnergyReportInfo.standardCoalConsumption
}}%。购电方式为{{ EnergyReportInfo.purchasePower }},{{
EnergyReportInfo.basicCharge
}}基本电费,{{ EnergyReportInfo.valleyElectricityPrices }}峰谷平电价。
</div>
</div>
<div class="lineChart-both" v-if="EnergyConsumeSituation">
<div class="lineChart-box" style="flex: 1">
<div class="lineChart-both-div">
<div>引导值:{{ EnergyConsumeSituation.buildQuota.guideValue }}</div>
<div>基准值:{{ EnergyConsumeSituation.buildQuota.baseValue }}</div>
<div>约束值:{{ EnergyConsumeSituation.buildQuota.constraintValue }}</div>
</div>
<div class="bothPie1">
<div class="bothPiefirst" style="width: 170px; height: 100px"></div>
<img class="bothPie1-img1" src="@/assets/能耗定额4.png" alt="" />
<img class="bothPie1-img2" src="@/assets/能耗定额2.png" alt="" />
<img class="bothPie1-img3" src="@/assets/能耗定额3.png" alt="" />
<img class="bothPie1-img4" src="@/assets/能耗定额5.png" alt="" />
<div class="lineChart-both-text">单位面积能耗定额</div>
</div>
</div>
<div
class="lineChart-box"
style="flex: 1"
v-if="hidePerquotaRange == false"
>
<div class="lineChart-both-div">
<div>
引导值:{{ EnergyConsumeSituation.peopleQuota.guideValue }}
</div>
<div>基准值:{{ EnergyConsumeSituation.peopleQuota.baseValue }}</div>
<div>
约束值:{{ EnergyConsumeSituation.peopleQuota.constraintValue }}
</div>
</div>
<div class="bothPie1" v-if="situation">
<div
class="bothPiesecond"
style="width: 170px; height: 100px"
></div>
<!-- <van-circle
v-model="currentRate1"
:rate="currentRate1"
:clockwise="false"
:speed="100"
size="150px"
color="#eac166"
layer-color="#ebedf0"
:text="text1"
/> -->
<img class="bothPie1-img1" src="@/assets/能耗定额4.png" alt="" />
<img class="bothPie1-img2" src="@/assets/能耗定额2.png" alt="" />
<img class="bothPie1-img3" src="@/assets/能耗定额3.png" alt="" />
<img class="bothPie1-img4" src="@/assets/能耗定额5.png" alt="" />
<div class="lineChart-both-text">人均能耗定额</div>
</div>
</div>
</div>
<!-- 贵单位属于{{
EnergyReportInfo.buildName
}}建筑 -->
<div class="lineChartStyle-end">
<span v-if="false">{{ EnergyReportInfo.buildName }}</span>
根据定额计算,贵单位属于{{ EnergyReportInfo.buildName }},单位面积能耗定额为{{ EnergyReportInfo.energyConsumptionQuota }}千克折煤/平方米,{{ EnergyReportInfo.areaquotaRange }}。
<span v-if="renjun" >人均能耗定额为{{ EnergyReportInfo.perConsumptionQuota }} 千克折煤/人,{{ EnergyReportInfo.perquotaRange }}。</span>
</div>
</div>
</div>
</template>
<script>
// import * as echarts from 'echarts'
// import reportHeader from './report-header.vue'
import { mapState, mapMutations } from 'vuex'
import { setTitle } from '@/utils/dsbridge.js'
import { Notify } from 'vant'
import { getLoginCustomerAPI,getReport } from '@/api/energyReport.js'
export default {
data() {
return {
// 柱状图配置项
barOption: {
xAxis: {
type: 'category',
data: [],
},
yAxis: {
type: 'value',
},
tooltip: {
},
legend: {
itemStype: {
borderWidth: 1.5,
},
},
grid: {
top: 90,
x: 60,
x2: 40,
y2: 40,
bottom: 25,
},
series: [
{
data: [],
name: '',
type: 'bar',
label: {
show: true,
position: 'top',
},
tooltip: {
show: true,
// formatter: function(BarData) {
// console.log(this.barOption.xAxis.data, );
// },
}
},
],
},
// 折线图配置项
lineOption: {
tooltip: {
trigger: 'axis',
},
legend: {
type: 'plain',
right: 0,
top: 10,
data: [
{
name: '',
icon: 'roundRect',
textStyle: {
color: '#939393',
},
},
{
name: '',
icon: 'roundRect',
textStyle: {
color: '#939393',
},
},
],
},
grid: {
top: '50', // 一下数值可为百分比也可为具体像素值
right: '5',
bottom: '50',
left: '50',
},
color: ['#007bfd', '#0dc7bc'],
xAxis: {
type: 'category',
axisTick: {
show: false,
},
axisLabel: {
interval: 0, //X轴数据太多,全部显示
color: '#707070',
fontSize: 11,
},
data: [],
// data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
},
yAxis: {
type: 'value',
axisLine: {
show: false,
},
axisLabel: {
color: '#707070',
fontSize: 11,
},
axisTick: {
show: false,
},
splitLine: {
lineStyle: {
type: 'dashed',
color: ['#e2e5e7'],
},
},
},
series: [
{
// data: [150, 230, 224, 218, 135, 147, 260],
data: [],
type: 'line',
name: '电',
symbol: 'none',
smooth: true,
},
{
// data: [200, 280, 274, 268, 185, 197, 310],
data: [],
type: 'line',
name: '光伏',
symbol: 'none',
smooth: true,
},
],
},
// 饼图配置项
pieOption: {
// color:['#FFBD1C','#13C2C2','#267CFF','#FF8C16','#13C2C2'],
title: {
left: '26%',
top: '47%',
subtext: "总标煤量",
subtextStyle: {
color: '#000',
fontSize: 13
}
},
// tooltip: {
// trigger: 'item',
// formatter: '37'
// },
legend: {
orient: 'vertical',
right: '-5px',
top: '30px',
},
tooltip: {
trigger: 'item',
},
series: [
{
name: '',
type: 'pie',
radius: ['30%', '40%'],
center: ['36%', '55%'],
labelLine: {
normal: {
length: 0, // 指示线长度
length2: 10,
lineStyle: {
// color: '#595959', // 指示线颜色
},
},
},
label: {
show: true,
position: 'outside',
formatter: ['{d}%', '{c}吨折煤'].join('\n'),
},
// data: []
data: [
// 各分区样式: value值,name模块文字、itemStyle模块样式
{
value: 40,
name: '20% \n 2000标准煤',
itemStyle: { color: '#FFBD1C' },
},
{
value: 10,
name: '25% \n 2500标准煤',
itemStyle: { color: '#13C2C2' },
},
{
value: 10,
name: '20% \n 2000标准煤',
itemStyle: { color: '#267CFF' },
},
{
value: 10,
name: '15% \n 1500标准煤',
itemStyle: { color: '#FF8C16' },
},
{
value: 30,
name: '20% \n 2000标准煤',
itemStyle: { color: '#13C2C2' },
},
],
},
],
},
// 扇形图1
bothPie1Option: {
tooltip: {
trigger: 'item',
},
title: {
text: '112',
x: 'center',
// top:'50%'
y: 'center',
},
series: [
{
// name: 'Access From',
type: 'pie',
radius: ['80%', '100%'],
// adjust the start angle
startAngle: 225,
endAngle: -45,
min: 0,
max: 100,
label: {
show: false,
formatter(param) {
// correct the percentage
return param.name + ' (' + param.percent * 2 + '%)'
},
},
data: [
{ value: 580, name: 'Email' },
{ value: 484, name: 'Union Ads' },
{ value: 300, name: 'Video Ads' },
{
// make an record to fill the bottom 50%
value: 580 + 484 + 300,
itemStyle: {
// stop the chart from rendering this piece
color: '',
decal: {
symbol: 'none',
},
},
label: {
show: false,
},
},
],
},
],
},
// 扇形图2
bothPie2Option: {
tooltip: {
trigger: 'item',
},
title: {
text: '112',
x: 'center',
// top:'50%'
y: 'center',
},
series: [
{
// name: 'Access From',
type: 'pie',
radius: ['80%', '100%'],
// adjust the start angle
startAngle: 225,
min: 0,
max: 100,
label: {
show: false,
formatter(param) {
// correct the percentage
return param.name + ' (' + param.percent * 2 + '%)'
},
},
data: [
{ value: 580, name: 'Email' },
{ value: 484, name: 'Union Ads' },
{ value: 300, name: 'Video Ads' },
{
// make an record to fill the bottom 50%
value: 580 + 484 + 300,
itemStyle: {
// stop the chart from rendering this piece
color: '',
decal: {
symbol: 'none',
},
},
label: {
show: false,
},
},
],
},
],
},
}
},
created() {
setTitle('能耗定额指标')
this.getEnergyReportInfo()
},
computed: {
...mapState('report', ['EnergyReportInfo']),
// eslint-disable-next-line vue/return-in-computed-property
renjun () {
if (this.EnergyConsumeSituation) {
return JSON.stringify(this.EnergyConsumeSituation.peopleQuota) === '{}'? false : true
}
},
// EnergyReportInfo() {
// return JSON.parse(localStorage.getItem('EnergyReportInfo'))
// },
situation() {
if (
this.EnergyConsumeSituation.peopleQuota.baseValue &&
this.EnergyConsumeSituation.peopleQuota.constraintValue &&
this.EnergyConsumeSituation.peopleQuota.guideValue
) {
return true
}
return false
},
hidePerquotaRange() {
return JSON.parse(this.EnergyReportInfo.hidePerquotaRange)
},
EnergyConsumeSituation() {
if (!this.EnergyReportInfo.EnergyConsumeSituation) {
return false
}
return JSON.parse(this.EnergyReportInfo.EnergyConsumeSituation)
},
show() {
return localStorage.getItem('show') === 'true'
},
},
mounted() {
var that = this
var timer = setTimeout(function () {
// 判断页面所有资源已加载完毕
if (document.readyState === 'complete') {
that.createChart()
window.clearTimeout(timer)
}
}, 1000)
// this.createChart()
},
methods: {
...mapMutations('report', ['setEnergyReportInfo']),
// echarts图表赋值
createChart() {
// 柱状图配置
// console.log(JSON.parse(res.data.energySituation));
if (this.EnergyReportInfo?.energySituation) {
this.barOption.xAxis.data = JSON.parse(this.EnergyReportInfo.energySituation).category
let BarData = []
JSON.parse(this.EnergyReportInfo.energySituation).series.map((v) => {
BarData.push({
data: v.dataList,
name: v.name,
type: 'bar',
barWidth: 20,
label: {
show: true,
position: 'top',
},
})
})
this.barOption.series = BarData
this.barOption.tooltip = {
trigger: 'axis',
confine: true,
formatter:function(params){
let str=''
params.forEach(item => {
if(item.seriesName == '电(千瓦时)'){
str+=`${item.axisValue}<br />`
str +=`电:${item.value}千瓦时<br />`
}
if(item.seriesName == '天然气(立方米)'){
str += `天然气:${item.value}立方米<br />`
}
if(item.seriesName == '饱和蒸汽(吨)'){
str += `饱和蒸汽:${item.value}吨<br />`
}
if(item.seriesName == '柴油(升)'){
str += `柴油:${item.value}升<br />`
}
if(item.seriesName == '用水(吨)'){
str += `用水:${item.value}吨<br />`
}
if(item.seriesName == '光伏(千瓦时)'){
str += `光伏:${item.value}千瓦时<br />`
}
if(item.seriesName == '液化石油气(吨)'){
str += `液化石油气:${item.value}吨<br />`
}
if(item.seriesName == '汽油(升)'){
str += `汽油:${item.value}升<br />`
}
if(item.seriesName == '其他'){
str += `其他:${item.value}<br />`
}
})
return str
}
}
console.log(this.barOption);
this.createBarChart()
}
// 折线图
if (this.EnergyReportInfo.powerSituation) {
const powerSituation = JSON.parse(this.EnergyReportInfo.powerSituation)
if(powerSituation.category) {
this.lineOption.xAxis.data = powerSituation.category
}
if(powerSituation.series.length == 1 && powerSituation.series[0].name == '电' ) {
this.lineOption.series[0].data = powerSituation.series[0].dataList
this.lineOption.legend.data[0].name = powerSituation.series[0].name
} else if(powerSituation.series.length == 1 && powerSituation.series[0].name == '光伏' ) {
this.lineOption.series[1].data = powerSituation.series[1].dataList
this.lineOption.legend.data[1].name = powerSituation.series[1].name
} else {
this.lineOption.series[0].data = powerSituation.series.length !=0 ? powerSituation.series[0].dataList : []
this.lineOption.series[1].data = powerSituation.series.length !=0 ? powerSituation.series[1].dataList : []
this.lineOption.legend.data[0].name = powerSituation.series.length !=0 ? powerSituation.series[0].name : ''
this.lineOption.legend.data[1].name = powerSituation.series.length !=0 ? powerSituation.series[1].name : ''
}
this.createLineChart()
}
// 环形图
// console.log(JSON.parse(res.data.coalSituation));
if (this.EnergyReportInfo?.coalSituation) {
this.pieOption.series[0].data = JSON.parse(
this.EnergyReportInfo.coalSituation
)
this.pieOption.series[0].type = 'pie'
this.createPieChart()
}
// 扇形图
if (this.EnergyReportInfo?.EnergyConsumeSituation) {
let val = {}
let data = []
// 扇形图1
if (this.EnergyConsumeSituation.buildQuota.constraintValue > this.EnergyConsumeSituation.buildQuota.buildQuotaSet) {
val = {
value: 100,
itemStyle: {
color: '#ff7e51',
},
}
data = [
{
value:
(this.EnergyConsumeSituation.buildQuota.buildQuotaSet/this.EnergyConsumeSituation.buildQuota.constraintValue)*100,
itemStyle: {
color: '#54c2fa',
},
}
]
} else {
val = {
value: 100,
itemStyle: {
color: '#54c2fa',
},
}
data = [
{
value:
(this.EnergyConsumeSituation.buildQuota.constraintValue/this.EnergyConsumeSituation.buildQuota.buildQuotaSet)*100,
itemStyle: {
color: '#ff7e51',
},
}
]
}
data.push(val)
this.bothPie1Option.title.text =
`${this.EnergyConsumeSituation.buildQuota.buildQuotaSet}\n${((this.EnergyConsumeSituation.buildQuota.buildQuotaSet/this.EnergyConsumeSituation.buildQuota.constraintValue)*100).toFixed(2)}%`
this.bothPie1Option.series[0].data = data
this.createBothPiefirst()
// 扇形图2
let val2 = {}
let data2 = []
if (this.EnergyConsumeSituation.peopleQuota.constraintValue > this.EnergyConsumeSituation.peopleQuota.peopleQuotaSet) {
val2 = {
value: 100,
itemStyle: {
color: '#ff7e51',
},
}
data2 = [
{
value:
(this.EnergyConsumeSituation.peopleQuota.peopleQuotaSet/this.EnergyConsumeSituation.peopleQuota.constraintValue)*100,
itemStyle: {
color: '#54c2fa',
},
}
]
} else {
val2 = {
value: 100,
itemStyle: {
color: '#54c2fa',
},
}
data2 = [
{
value:
(this.EnergyConsumeSituation.peopleQuota.constraintValue/this.EnergyConsumeSituation.peopleQuota.peopleQuotaSet)*100,
itemStyle: {
color: '#ff7e51',
},
}
]
}
data2.push(val2)
this.bothPie2Option.title.text =
`${this.EnergyConsumeSituation.peopleQuota.peopleQuotaSet}\n${((this.EnergyConsumeSituation.peopleQuota.peopleQuotaSet/this.EnergyConsumeSituation.peopleQuota.constraintValue)*100).toFixed(2)}%`
this.bothPie2Option.series[0].data = data2
this.createBothPiesecond()
}
},
// 柱状图
createBarChart() {
let barChart = document.querySelector('.barChart')
let myChart = this.$echarts.init(barChart)
myChart.setOption(this.barOption)
},
//饼图
createPieChart() {
let pieChart = document.querySelector('.pieChart')
let myChart = this.$echarts.init(pieChart)
myChart.setOption(this.pieOption)
},
//折线图
createLineChart() {
let lineChart = document.querySelector('.lineChart')
console.log(this.lineOption);
let myChart = this.$echarts.init(lineChart)
myChart.setOption(this.lineOption)
},
//扇形图1
createBothPiefirst() {
let bothPie1 = document.querySelector('.bothPiefirst')
let myChart = this.$echarts.init(bothPie1)
myChart.setOption(this.bothPie1Option)
},
//扇形图2
createBothPiesecond() {
let bothPie2 = document.querySelector('.bothPiesecond')
if (bothPie2) {
let myChart = this.$echarts.init(bothPie2)
myChart.setOption(this.bothPie2Option)
}
},
//不同角色,不同id传参不同
getEnergyReportInfo() {
const level = sessionStorage.getItem('level')
// this.energyData = JSON.parse(sessionStorage.getItem('tidCid'))
if(level != 2) {
this.getLoginCustomer()
}
},
// getLoginCustomerAPI获取登录客户信息
async getLoginCustomer() {
this.loading2 = true
try {
const res = await getLoginCustomerAPI()
// console.log(res.data.customerId);
if (res.code == 0) {
localStorage.setItem('reportCustomerId', res.data.customerId)
const data = {
customerId: res.data.customerId,
ai: this.$route.query.ai? this.$route.query.ai: sessionStorage.getItem('saikey')
}
this.getReport(data)
} else {
Notify({ type: 'danger', message: res.msg })
}
}
finally{
this.loading2 = false
}
},
//客户角色调用此接口
async getReport(data) {
this.loading2 = true
const res = await getReport(data)
try {
if(res.code == 0) {
this.saveData(res)
} else {
Notify({ type: 'danger', message: res.msg })
}
// this.getTime()
} finally{
this.loading2 = false
}
},
//数据保存
saveData(res) {
// this.EnergyReportInfo = res.data
this.setEnergyReportInfo(res.data)
},
},
}
</script>
<style lang="less" scoped>
.energyReport-template {
background-color: #f5f5f5;
.energyReport-quota {
background-color: #fff;
border-radius: 10px;
padding: 10px;
box-sizing: border-box;
margin-top: 10px;
.bar-title {
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 700;
img {
// height: 10px;
width: 100px !important;
}
.bar-title-color {
// width: 280px;
color: #146660;
font-size: 15px;
}
}
.quota {
.quota-div {
margin: 10px 0;
display: flex;
.quota-img {
width: 30px;
height: 20px;
margin-right: 10px;
}
h1 {
color: #40aba2;
}
}
.barChart {
width: 350px;
height: 300px;
}
}
}
.sameStyle {
background-color: #fff;
border-radius: 10px;
margin-top: 10px;
padding: 10px;
box-sizing: border-box;
.sameStyle-div {
margin: 10px 0;
display: flex;
.sameStyle-img {
width: 30px;
height: 20px;
margin-right: 10px;
}
h1 {
color: #40aba2;
}
}
.pieChart {
width: 9rem;
height: 300px;
margin-top: -30px;
// margin-left: 10px;
margin-bottom: -30px;
padding: 10px;
box-sizing: border-box;
}
}
.lineChartStyle {
background-color: #fff;
border-radius: 10px;
margin-top: 10px;
padding: 10px;
box-sizing: border-box;
.lineChartStyle-div {
margin: 10px 0;
display: flex;
.lineChartStyle-img {
width: 30px;
height: 20px;
margin-right: 10px;
}
h1 {
color: #40aba2;
}
}
.lineChart {
width: 350px;
height: 300px;
margin-top: -30px;
margin-left: -15px;
margin-bottom: -30px;
padding: 20px;
box-sizing: border-box;
}
.lineChart-detail {
background-color: #f5f5f5;
padding: 10px;
border-radius: 10px;
box-sizing: border-box;
h1 {
margin-top: 0px;
margin-bottom: 10px;
color: #4d4d4d;
}
}
.lineChart-both {
display: flex;
justify-content: center;
.lineChart-box {
display: flex;
flex-direction: column;
align-items: center;
}
.lineChart-both-div {
margin-left: 3px;
display: flex;
justify-content: center;
text-align: center;
margin-top: 10px;
margin-bottom: 20px;
div {
font-size: 13px;
padding: 3px 2px;
border-radius: 5px;
color: #fff;
}
div:nth-child(1) {
background-color: #11b8ae;
}
div:nth-child(2) {
background-color: #265ea9;
margin: 0px 3px;
}
div:nth-child(3) {
background-color: #ff7e51;
}
}
.bothPie1 {
text-align: center;
position: relative;
.bothPie1-img1 {
width: 80px;
position: absolute;
bottom: 15px;
left: 44px;
z-index: 99;
opacity: 0.5;
}
.bothPie1-img2 {
width: 70px;
position: absolute;
top: 100px;
left: 50px;
}
.bothPie1-img3 {
width: 75px;
position: absolute;
top: 13px;
left: 44px;
}
.bothPie1-img4 {
width: 70px;
position: absolute;
bottom: 20px;
left: 50px;
z-index: 9999;
}
.lineChart-both-text {
color: #9bb6d4;
}
}
.bothPie2 {
text-align: center;
position: relative;
.bothPie2-img1 {
width: 80px;
position: absolute;
bottom: 15px;
left: 44px;
z-index: 99;
opacity: 0.5;
}
.bothPie2-img2 {
width: 100px;
position: absolute;
top: 100px;
left: 36px;
}
.bothPie2-img3 {
width: 122px;
position: absolute;
top: 14px;
left: 25px;
}
.bothPie2-img4 {
width: 80px;
position: absolute;
bottom: 20px;
left: 50px;
z-index: 9999;
}
.lineChart-both-text {
color: #9bb6d4;
}
}
}
.lineChartStyle-end {
background-color: #f5f5f5;
padding: 10px;
border-radius: 10px;
box-sizing: border-box;
margin-top: 10px;
}
}
}
</style>