|
@@ -4,116 +4,314 @@
|
|
|
@date 2023年2月8日
|
|
|
-->
|
|
|
<template>
|
|
|
- <div class="doubleCarbon-main-box flexColumn">
|
|
|
+ <div class="doubleCarbon-main-box flexColumn" v-loading="searchLoading">
|
|
|
<!-- 头部搜索区域 -->
|
|
|
- <div>
|
|
|
- <div class="flex flex_between">
|
|
|
+ <div class="borderColor">
|
|
|
+ <div class="flex flex_between margin5rem">
|
|
|
<div class="flex">
|
|
|
- <div class="mr1rem">单位名称:<a-select style="width:200px;" :options="options.nameOfUnit"></a-select></div>
|
|
|
- <div>时间范围:<a-range-picker style="width:200px;"></a-range-picker></div>
|
|
|
+ <div class="mr1rem">
|
|
|
+ 单位名称:
|
|
|
+ <el-select v-model="searchParam.nameOfUnit" clearable placeholder="全部">
|
|
|
+ <el-option v-for="item in options.nameOfUnit" :key="item.value" :label="item.label" :value="item.value">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ 时间范围:
|
|
|
+ <el-date-picker
|
|
|
+ v-model="searchParam.timeRange"
|
|
|
+ type="monthrange"
|
|
|
+ align="right"
|
|
|
+ unlink-panels
|
|
|
+ range-separator="-"
|
|
|
+ start-placeholder="开始时间"
|
|
|
+ end-placeholder="结束时间"
|
|
|
+ :picker-options="$constant.PICKER_OPTIONS"
|
|
|
+ >
|
|
|
+ </el-date-picker>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div>
|
|
|
- <a-button class="mr1rem">重置</a-button>
|
|
|
- <a-button type="primary">查询</a-button>
|
|
|
+ <a-button class="mr1rem" @click="reset">重置</a-button>
|
|
|
+ <a-button type="primary" @click="search">查询</a-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="cardTitle">核心指标</div>
|
|
|
- <div class="flex flex_around coreListBox">
|
|
|
+ <div class="cardTitle margin5rem">核心指标</div>
|
|
|
+ <div v-if="coreList.length > 0" class="flex flex_around coreListBox margin5rem">
|
|
|
<div v-for="(item, index) in coreList" :key="'coreList' + index">
|
|
|
- <div>{{ item.title }}</div>
|
|
|
+ <div class="core_title">{{ item.title }}</div>
|
|
|
<div class="core_value">
|
|
|
{{ item.value ? item.value : "--" }}<span class="core_unit">{{ item.unit ? item.unit : "" }}</span
|
|
|
- ><span class="core_leavel" v-if="item.leavel" :style="{ color: colorLeavel[item.leavel] }">!</span>
|
|
|
+ ><span class="core_leavel" v-if="item.leavel" :style="{ color: $constant.COLOR_LEAVEL[item.leavel] }">!</span>
|
|
|
</div>
|
|
|
<div v-if="item.info" class="core_info">
|
|
|
- {{ item.info.title
|
|
|
- }}<span class="core_info_value" :style="{ color: colorLeavel[item.info.status] }">{{ item.info.value }}</span>
|
|
|
+ <span class="core_info_title">{{ item.info.title }}</span
|
|
|
+ ><span class="core_info_value" :style="{ color: $constant.COLOR_LEAVEL[item.info.leavel] }"
|
|
|
+ >{{ item.info.value
|
|
|
+ }}<i
|
|
|
+ v-if="item.info.leavel && (item.info.leavel == 1 || item.info.leavel == 3)"
|
|
|
+ :class="item.info.leavel == 3 ? 'el-icon-caret-top' : 'el-icon-caret-bottom'"
|
|
|
+ /></span>
|
|
|
</div>
|
|
|
- <a-divider v-if="index < coreList.length - 1" type="vertical" />
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="flex flex_around coreListBox margin5rem">
|
|
|
+ <el-empty v-if="coreList.length == 0" description="暂无数据"></el-empty>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<!-- 碳排放分析和碳配额构成 -->
|
|
|
- <div>碳排放分析和碳配额构成</div>
|
|
|
- <div>双碳新闻和碳排放占比</div>
|
|
|
+ <div class="flex" style="height:400px;">
|
|
|
+ <div class="echartBox_left borderColor">
|
|
|
+ <div class="cardTitle margin5rem">碳排放分析</div>
|
|
|
+ <div class="margin5rem chartDomBox">
|
|
|
+ <LineChart v-if="chartData.LineChartData" :echartData="chartData.LineChartData" />
|
|
|
+ <el-empty v-else description="暂无数据"></el-empty>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="echartBox_right borderColor">
|
|
|
+ <div class="cardTitle margin5rem">碳配额构成</div>
|
|
|
+ <div class="margin5rem chartDomBox">
|
|
|
+ <BarChart v-if="chartData.BarChartData" :echartData="chartData.BarChartData" />
|
|
|
+ <el-empty v-else description="暂无数据"></el-empty>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 双碳新闻和碳排放占比 -->
|
|
|
+ <div class="flex" style="height:300px;">
|
|
|
+ <div class="echartBox_left borderColor">
|
|
|
+ <el-dialog title="双碳新闻" :visible.sync="showModalStatus" width="60%" :before-close="onCancel">
|
|
|
+ <p>{{ showModalInfo.title }}</p>
|
|
|
+ <div class="flex flex_between">
|
|
|
+ <div>{{ showModalInfo.author }}</div>
|
|
|
+ <div>{{ showModalInfo.pushTime }}</div>
|
|
|
+ </div>
|
|
|
+ <p>{{ showModalInfo.content }}</p>
|
|
|
+ </el-dialog>
|
|
|
+ <div class="cardTitle margin5rem">双碳新闻</div>
|
|
|
+ <div class="margin5rem" v-if="DoubleCarbonNewsInfoList.length > 0" style="overflow-y:auto;height: calc(100% - 53px);">
|
|
|
+ <div
|
|
|
+ class="flex flex_between DoubleCarbonNews"
|
|
|
+ v-for="(item, index) in DoubleCarbonNewsInfoList"
|
|
|
+ :key="index"
|
|
|
+ @click="showModal(item)"
|
|
|
+ >
|
|
|
+ <div>{{ item.title }}</div>
|
|
|
+ <div>{{ item.content }}</div>
|
|
|
+ <div>{{ item.author }}</div>
|
|
|
+ <div>{{ item.pushTime }}</div>
|
|
|
+ <div>>></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class="margin5rem flex_center"
|
|
|
+ v-if="DoubleCarbonNewsInfoList.length == 0"
|
|
|
+ style="overflow-y:auto;height: calc(100% - 53px);"
|
|
|
+ >
|
|
|
+ <el-empty description="暂无数据"></el-empty>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="echartBox_right borderColor">
|
|
|
+ <div class="cardTitle margin5rem">碳排放占比</div>
|
|
|
+ <div class="margin5rem chartDomBox">
|
|
|
+ <PieChart v-if="chartData.PieChartData" :echartData="chartData.PieChartData" />
|
|
|
+ <el-empty v-else description="暂无数据"></el-empty>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
+import LineChart from "../../echart/LineChart.vue";
|
|
|
+import BarChart from "../../echart/BarChart.vue";
|
|
|
+import PieChart from "../../echart/PieChart.vue";
|
|
|
export default {
|
|
|
+ components: {
|
|
|
+ LineChart,
|
|
|
+ BarChart,
|
|
|
+ PieChart
|
|
|
+ },
|
|
|
data() {
|
|
|
return {
|
|
|
+ // loading状态
|
|
|
+ searchLoading: true,
|
|
|
// 单位名称option可选值
|
|
|
options: {
|
|
|
- nameOfUnit: [{ value: "1", label: "type1" }, { value: "2", label: "type2" }]
|
|
|
+ nameOfUnit: []
|
|
|
},
|
|
|
// 头部搜索条件中绑定值
|
|
|
searchParam: {
|
|
|
nameOfUnit: "",
|
|
|
- timeRange: ""
|
|
|
- },
|
|
|
- // 核心指标中的碳配额存量中的不同等级对应的icon颜色
|
|
|
- colorLeavel: {
|
|
|
- 1: "#67C23A",
|
|
|
- 2: "#E6A23C",
|
|
|
- 3: "#F56C6C"
|
|
|
+ timeRange: []
|
|
|
},
|
|
|
// 头部核心指标循环显示数据
|
|
|
- coreList: [
|
|
|
- {
|
|
|
- title: "碳配额存量",
|
|
|
- value: "60%",
|
|
|
- leavel: 1
|
|
|
- },
|
|
|
- {
|
|
|
- title: "碳排放存量",
|
|
|
- value: 500,
|
|
|
- unit: "tCO2e",
|
|
|
- info: {
|
|
|
- title: "同比上升",
|
|
|
- status: 1,
|
|
|
- value: "0.4%"
|
|
|
- }
|
|
|
- },
|
|
|
- {
|
|
|
- title: "单位面积碳排放",
|
|
|
- value: 380,
|
|
|
- unit: "tCO2e/m²",
|
|
|
- info: {
|
|
|
- title: "同比上升",
|
|
|
- status: 1,
|
|
|
- value: "0.4%"
|
|
|
+ coreList: [],
|
|
|
+ // 双碳新闻模拟数据
|
|
|
+ DoubleCarbonNewsInfoList: [],
|
|
|
+ // 双碳新闻弹窗打开状态
|
|
|
+ showModalStatus: false,
|
|
|
+ // 弹窗暂存数据对象
|
|
|
+ showModalInfo: {
|
|
|
+ title: "--",
|
|
|
+ content: "--",
|
|
|
+ author: "--",
|
|
|
+ pushTime: "--"
|
|
|
+ },
|
|
|
+ // chart暂存数据对象
|
|
|
+ chartData: []
|
|
|
+ };
|
|
|
+ },
|
|
|
+ created() {},
|
|
|
+ mounted() {
|
|
|
+ // 页面初始化
|
|
|
+ this.init();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ init() {
|
|
|
+ // 初始化加载[单位名称列表、核心指标、碳排放分析、碳配额构成、双碳新闻、碳排放占比]
|
|
|
+ setTimeout(() => {
|
|
|
+ this.options.nameOfUnit = [
|
|
|
+ { value: "1", label: "中讯邮电咨询设计院有限公司" },
|
|
|
+ { value: "2", label: "北京电信规划设计院" }
|
|
|
+ ];
|
|
|
+ this.chartData = {
|
|
|
+ BarChartData: {
|
|
|
+ yAxisData: ["中讯", "北京规划院", "郑分", "广分", "上分"],
|
|
|
+ seriesData: {
|
|
|
+ 碳配额存量: [120, 132, 101, 134, 90, 230, 210],
|
|
|
+ 碳配额消耗: [220, 182, 191, 234, 290, 330, 310]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ LineChartData: {
|
|
|
+ xAxisData: ["1月", "2月", "3月", "4月", "5月", "6月", "7月"],
|
|
|
+ seriesData: {
|
|
|
+ 中讯: [120, 132, 101, 134, 90, 230, 210],
|
|
|
+ 北京规划院: [220, 182, 191, 234, 290, 330, 310],
|
|
|
+ 郑分: [150, 232, 201, 154, 190, 330, 410],
|
|
|
+ 广分: [320, 332, 301, 334, 390, 330, 320],
|
|
|
+ 上分: [820, 932, 901, 934, 1290, 1330, 1320]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ PieChartData: {
|
|
|
+ seriesName: "碳排放占比",
|
|
|
+ seriesData: [
|
|
|
+ { value: 1048, name: "汽油" },
|
|
|
+ { value: 735, name: "柴油" },
|
|
|
+ { value: 580, name: "天然气" },
|
|
|
+ { value: 484, name: "热力" },
|
|
|
+ { value: 300, name: "电力" },
|
|
|
+ { value: 199, name: "其他" }
|
|
|
+ ]
|
|
|
}
|
|
|
- },
|
|
|
- {
|
|
|
- title: "人均碳排放",
|
|
|
- value: 80,
|
|
|
- unit: "tCO2e/人",
|
|
|
- info: {
|
|
|
- title: "同比上升",
|
|
|
- status: 1,
|
|
|
- value: "0.4%"
|
|
|
+ };
|
|
|
+ this.DoubleCarbonNewsInfoList = [
|
|
|
+ {
|
|
|
+ title: "【减碳小妙招】",
|
|
|
+ content: "xxxxxxxxxxxxxxxxxxxxxxx",
|
|
|
+ author: "中讯邮电设计院-张三",
|
|
|
+ pushTime: "2021-08-09"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "【减碳小妙招】",
|
|
|
+ content: "xxxxxxxxxxxxxxxxxxxxxxx",
|
|
|
+ author: "中讯邮电设计院-张三",
|
|
|
+ pushTime: "2021-08-09"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "【减碳小妙招】",
|
|
|
+ content: "xxxxxxxxxxxxxxxxxxxxxxx",
|
|
|
+ author: "中讯邮电设计院-张三",
|
|
|
+ pushTime: "2021-08-09"
|
|
|
}
|
|
|
- },
|
|
|
- {
|
|
|
- title: "光伏减排",
|
|
|
- value: 40,
|
|
|
- unit: "tCO2e",
|
|
|
- info: {
|
|
|
- title: "同比上升",
|
|
|
- status: 1,
|
|
|
- value: "0.4%"
|
|
|
+ ];
|
|
|
+ this.coreList = [
|
|
|
+ {
|
|
|
+ title: "碳配额存量",
|
|
|
+ value: "60%",
|
|
|
+ leavel: 1
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "碳排放存量",
|
|
|
+ value: 500,
|
|
|
+ unit: "tCO2e",
|
|
|
+ info: {
|
|
|
+ title: "同比上升",
|
|
|
+ leavel: 3,
|
|
|
+ value: "0.4%"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "单位面积碳排放",
|
|
|
+ value: 380,
|
|
|
+ unit: "tCO2e/m²",
|
|
|
+ info: {
|
|
|
+ title: "同比上升",
|
|
|
+ leavel: 3,
|
|
|
+ value: "0.4%"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "人均碳排放",
|
|
|
+ value: 80,
|
|
|
+ unit: "tCO2e/人",
|
|
|
+ info: {
|
|
|
+ title: "同比上升",
|
|
|
+ leavel: 3,
|
|
|
+ value: "0.4%"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "光伏减排",
|
|
|
+ value: 40,
|
|
|
+ unit: "tCO2e",
|
|
|
+ info: {
|
|
|
+ title: "同比上升",
|
|
|
+ leavel: 3,
|
|
|
+ value: "0.4%"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "值得关注",
|
|
|
+ value: "减少2辆车出行一周"
|
|
|
}
|
|
|
- },
|
|
|
- {
|
|
|
- title: "值得关注",
|
|
|
- value: "减少2辆车出行一周"
|
|
|
- }
|
|
|
- ]
|
|
|
- };
|
|
|
- },
|
|
|
- mounted() {},
|
|
|
- methods: {}
|
|
|
+ ];
|
|
|
+ this.searchLoading = false;
|
|
|
+ }, 1000);
|
|
|
+ },
|
|
|
+ // 查询事件
|
|
|
+ search() {
|
|
|
+ this.searchLoading = true;
|
|
|
+ console.log(
|
|
|
+ "查询条件:",
|
|
|
+ this.searchParam.nameOfUnit,
|
|
|
+ this.searchParam.timeRange[0] ? this.$dayjs(this.searchParam.timeRange[0]).format("YYYY-MM-DD 00:00:00") : "",
|
|
|
+ this.searchParam.timeRange[1] ? this.$dayjs(this.searchParam.timeRange[1]).format("YYYY-MM-DD 00:00:00") : ""
|
|
|
+ );
|
|
|
+ setTimeout(() => {
|
|
|
+ this.searchLoading = false;
|
|
|
+ }, 1000);
|
|
|
+ },
|
|
|
+ // 重置事件
|
|
|
+ reset() {
|
|
|
+ this.searchParam = {
|
|
|
+ nameOfUnit: "",
|
|
|
+ timeRange: []
|
|
|
+ };
|
|
|
+ },
|
|
|
+ // 弹窗显示事件
|
|
|
+ showModal(item) {
|
|
|
+ this.showModalStatus = true;
|
|
|
+ this.showModalInfo = item;
|
|
|
+ },
|
|
|
+ // 弹窗隐藏事件
|
|
|
+ onCancel() {
|
|
|
+ this.$confirm("确认关闭?")
|
|
|
+ .then(_ => {
|
|
|
+ this.showModalStatus = false;
|
|
|
+ })
|
|
|
+ .catch(_ => {});
|
|
|
+ }
|
|
|
+ }
|
|
|
};
|
|
|
</script>
|
|
|
|
|
@@ -129,28 +327,57 @@ export default {
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
align-content: center;
|
|
|
+ align-items: center;
|
|
|
&_center {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ align-content: center;
|
|
|
+ align-items: center;
|
|
|
justify-content: center;
|
|
|
}
|
|
|
&_between {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ align-content: center;
|
|
|
+ align-items: center;
|
|
|
justify-content: space-between;
|
|
|
}
|
|
|
&_around {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ align-content: center;
|
|
|
+ align-items: center;
|
|
|
justify-content: space-around;
|
|
|
}
|
|
|
}
|
|
|
+.borderColor {
|
|
|
+ border: 1px solid #e7eaf1;
|
|
|
+}
|
|
|
+.margin5rem {
|
|
|
+ margin: 0.5rem;
|
|
|
+}
|
|
|
+.padding5rem {
|
|
|
+ padding: 0.5rem;
|
|
|
+}
|
|
|
// 页面主题样式
|
|
|
.doubleCarbon-main-box {
|
|
|
width: calc(100% - 16px);
|
|
|
height: calc(100% - 16px);
|
|
|
+ & * {
|
|
|
+ user-select: none;
|
|
|
+ -moz-user-select: none;
|
|
|
+ -webkit-user-select: none;
|
|
|
+ -ms-user-select: none;
|
|
|
+ ::-webkit-scrollbar {
|
|
|
+ width: 0 !important;
|
|
|
+ }
|
|
|
+ -ms-overflow-style: none;
|
|
|
+ overflow: -moz-scrollbars-none;
|
|
|
+ }
|
|
|
& > div {
|
|
|
- padding: 5px 10px;
|
|
|
+ // padding: 5px 10px;
|
|
|
border-radius: 2px;
|
|
|
- border: 1px solid #e7eaf1;
|
|
|
margin-bottom: 10px;
|
|
|
- & > div {
|
|
|
- margin: 0.5rem;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
// 头部搜索框和(重置、查询)按钮之间的间距样式
|
|
@@ -162,27 +389,47 @@ export default {
|
|
|
padding-left: 5px;
|
|
|
font-size: 14px;
|
|
|
font-weight: bold;
|
|
|
- border-left: 5px solid #56c1ff;
|
|
|
+ border-left: 5px solid @primary-color;
|
|
|
}
|
|
|
+// 核心指标
|
|
|
.coreListBox {
|
|
|
border-radius: 0.5rem;
|
|
|
background-color: rgb(233, 246, 253);
|
|
|
- padding: 0.5rem;
|
|
|
& > div {
|
|
|
- padding: 0.5rem;
|
|
|
+ position: relative;
|
|
|
+ // border-left: 1px solid #909399;
|
|
|
+ padding: 10px;
|
|
|
+ margin: 10px;
|
|
|
cursor: pointer;
|
|
|
border-radius: 0.5rem;
|
|
|
&:hover {
|
|
|
background-color: rgb(210, 239, 255);
|
|
|
}
|
|
|
+ // &::before {
|
|
|
+ // content: "";
|
|
|
+ // position: absolute;
|
|
|
+ // left: -10px;
|
|
|
+ // height: calc(100% - 20px);
|
|
|
+ // width: 1px;
|
|
|
+ // background: #c9c9c9;
|
|
|
+ // }
|
|
|
}
|
|
|
}
|
|
|
// 核心指标中value的样式
|
|
|
.core {
|
|
|
- &_value {
|
|
|
- font-size: 14px;
|
|
|
+ &_title {
|
|
|
+ font-size: 12px;
|
|
|
+ padding-bottom: 10px;
|
|
|
+ }
|
|
|
+ &_leavel {
|
|
|
+ font-size: 16px;
|
|
|
font-weight: bold;
|
|
|
}
|
|
|
+ &_value {
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #000;
|
|
|
+ }
|
|
|
&_unit {
|
|
|
padding-left: 0.5rem;
|
|
|
font-size: 12px;
|
|
@@ -190,8 +437,44 @@ export default {
|
|
|
color: #909399;
|
|
|
}
|
|
|
&_info {
|
|
|
+ padding-top: 10px;
|
|
|
font-size: 12px;
|
|
|
- color: #909399;
|
|
|
+ &_title {
|
|
|
+ color: #afafaf;
|
|
|
+ }
|
|
|
+ &_value {
|
|
|
+ padding-left: 0.5rem;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+// echartBox样式
|
|
|
+.echartBox {
|
|
|
+ &_left {
|
|
|
+ width: calc(100% - 300px - 10px);
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+ &_right {
|
|
|
+ margin-left: 10px;
|
|
|
+ width: 300px;
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+}
|
|
|
+.chartDomBox {
|
|
|
+ position: relative;
|
|
|
+ width: calc(100% - 20px);
|
|
|
+ height: calc(100% - 41px);
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+.DoubleCarbonNews {
|
|
|
+ padding: 10px 0;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #000;
|
|
|
+ cursor: pointer;
|
|
|
+ border-bottom: 1px solid #c9c9c9;
|
|
|
+ &:hover {
|
|
|
+ color: @primary-color;
|
|
|
}
|
|
|
}
|
|
|
</style>
|