This commit is contained in:
luoshiwen 2024-03-11 15:11:41 +08:00
commit e0aaa4aa8f
5 changed files with 336 additions and 292 deletions

47
src/api/carbonEmission.js Normal file
View File

@ -0,0 +1,47 @@
import http from '@/utils/http'
//总览
export function getCarbonOverview(params) {
return http({
url: '/api/GetCarbonOverview',
method: 'get',
params
})
}
//碳流图
export function getCarbonFlux() {
return http({
url: '/api/GetCarbonFlux',
method: 'get',
})
}
//碳排放趋势
export function getCarbonTrend(params) {
return http({
url: '/api/GetCarbonTrend',
method: 'get',
params
})
}
//碳排放强度
export function getCarbonIntensity() {
return http({
url: '/api/GetCarbonIntensity',
method: 'get',
})
}
//各系统碳排放统计
export function getSystemPurge() {
return http({
url: '/api/GetSystemPurge',
method: 'get',
})
}
//碳中和
export function getCarbonNeutral() {
return http({
url: '/api/GetCarbonNeutral',
method: 'get',
})
}

17
src/api/screen.js Normal file
View File

@ -0,0 +1,17 @@
import http from '@/utils/http'
//故障报警
export function getBigScreen(){
return http({
url:'/api/GetBigScreen',
method:'get',
})
}
// 运行状态
export function getOperatingState(){
return http({
url:'/api/GetOperatingState',
method:'get',
})
}

View File

@ -27,7 +27,7 @@ const getPie3D = (
}); });
// 为每一个饼图数据,生成一个 series-surface 配置 // 为每一个饼图数据,生成一个 series-surface 配置
for (let i = 0; i < pieData.length; i++) { for (let i = 0; i < pieData.length; i++) {
sumValue += pieData[i].value; sumValue += Number(pieData[i].value);
const seriesItem = { const seriesItem = {
name: name:
typeof pieData[i].name === "undefined" ? `series${i}` : pieData[i].name, typeof pieData[i].name === "undefined" ? `series${i}` : pieData[i].name,
@ -117,32 +117,32 @@ const getPie3D = (
position: "outside", position: "outside",
formatter: "{b} \n{c} {d}%", formatter: "{b} \n{c} {d}%",
}, },
tooltip: { // tooltip: {
backgroundColor: "#033b77", // backgroundColor: "#033b77",
borderColor: "#21f2c4", // borderColor: "#21f2c4",
textStyle: { // textStyle: {
color: "#fff", // color: "#fff",
fontSize: 13, // fontSize: 13,
}, // },
formatter: (params) => { // formatter: (params) => {
if ( // if (
params.seriesName !== "mouseoutSeries" && // params.seriesName !== "mouseoutSeries" &&
params.seriesName !== "信用评价" // params.seriesName !== "信用评价"
) { // ) {
// console.log(option.series,params.seriesName,'option.series[params.seriesIndex].pieData'); // // console.log(option.series,params.seriesName,'option.series[params.seriesIndex].pieData');
const bfb = ( // const bfb = (
(option.series[params.seriesIndex].pieData.endRatio - // (option.series[params.seriesIndex].pieData.endRatio -
option.series[params.seriesIndex].pieData.startRatio) * // option.series[params.seriesIndex].pieData.startRatio) *
100 // 100
).toFixed(2); // ).toFixed(2);
return ( // return (
`${params.seriesName}<br/>` + // `${params.seriesName}<br/>` +
`<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>` + // `<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>` +
`${bfb}%` // `${bfb}%`
); // );
} // }
}, // },
}, // },
xAxis3D: { xAxis3D: {
min: -1, min: -1,
max: 1, max: 1,

View File

@ -88,7 +88,14 @@ import { ref, onMounted } from "vue";
import * as echarts from "echarts"; import * as echarts from "echarts";
import "echarts-gl"; import "echarts-gl";
import { getPie3D, getParametricEquation } from "@/utils/carbonNeutrality"; import { getPie3D, getParametricEquation } from "@/utils/carbonNeutrality";
import {
getCarbonOverview,
getCarbonFlux,
getCarbonTrend,
getCarbonIntensity,
getSystemPurge,
getCarbonNeutral,
} from "@/api/carbonEmission";
const overviewDate = ref([ const overviewDate = ref([
{ {
name: "年", name: "年",
@ -119,10 +126,12 @@ const overviewList = ref([
// //
function switchDate(index) { function switchDate(index) {
activeDate.value = index; activeDate.value = index;
getOverview();
} }
// //
function trandSwitchDate(index) { function trandSwitchDate(index) {
trendActiveDate.value = index; trendActiveDate.value = index;
carboEmissionTrends();
} }
// //
const trendActiveDate = ref(0); const trendActiveDate = ref(0);
@ -135,11 +144,22 @@ const trendDate = ref([
}, },
]); ]);
// //
function getCarbonTrends() { function getCarbonTrends(params) {
let xData = [];
let yData = [];
params.forEach((item) => {
xData.push(item.time);
yData.push(item.EH);
});
let myChart = echarts.init(document.getElementById("carbonTrends")); let myChart = echarts.init(document.getElementById("carbonTrends"));
const option = { const option = {
// backgroundColor: "#05224d", // backgroundColor: "#05224d",
tooltip: {}, tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
},
grid: { grid: {
top: "18%", top: "18%",
left: "4%", left: "4%",
@ -169,7 +189,7 @@ function getCarbonTrends() {
axisTick: { show: false }, axisTick: { show: false },
boundaryGap: true, boundaryGap: true,
data: ["1月", "2月", "3月", "4月", "5月", "6月", "7月"], data: xData,
}, },
], ],
yAxis: [ yAxis: [
@ -202,7 +222,7 @@ function getCarbonTrends() {
], ],
series: [ series: [
{ {
name: "异常流量", name: "碳排放量",
type: "line", type: "line",
smooth: true, //线 smooth: true, //线
// symbol:'circle', // // symbol:'circle', //
@ -229,7 +249,7 @@ function getCarbonTrends() {
shadowColor: "rgba(53,142,215, 0.9)", // shadowColor: "rgba(53,142,215, 0.9)", //
shadowBlur: 20, //shadowBlurshadowColor,shadowOffsetX/Y, shadowBlur: 20, //shadowBlurshadowColor,shadowOffsetX/Y,
}, },
data: [200, 300, 400, 500, 600, 700, 800], data: yData,
}, },
], ],
}; };
@ -240,7 +260,13 @@ function getCarbonTrends() {
}); });
} }
// //
const getCarbonIntensity = () => { const getCarbonIntensityChat = (params) => {
let xData = [];
let yData = [];
params.forEach((item) => {
xData.push(item.time);
yData.push(item.CarbonIntensity);
});
const offsetX = 10; //bar const offsetX = 10; //bar
const offsetY = 5; // const offsetY = 5; //
// //
@ -274,7 +300,7 @@ const getCarbonIntensity = () => {
const xAxisPoint = shape.xAxisPoint; const xAxisPoint = shape.xAxisPoint;
const c1 = [shape.x + 7, shape.y]; const c1 = [shape.x + 7, shape.y];
const c2 = [xAxisPoint[0] + 7, xAxisPoint[1]]; const c2 = [xAxisPoint[0] + 7, xAxisPoint[1]];
const c3 = [xAxisPoint[0] + 7 + 7, xAxisPoint[1] - 10]; const c3 = [xAxisPoint[0] + 7 + 7, xAxisPoint[1] - 5];
const c4 = [shape.x + 7 + 7, shape.y - 5]; const c4 = [shape.x + 7 + 7, shape.y - 5];
ctx ctx
.moveTo(c1[0], c1[1]) .moveTo(c1[0], c1[1])
@ -309,8 +335,8 @@ const getCarbonIntensity = () => {
echarts.graphic.registerShape("CubeLeft", CubeLeft); echarts.graphic.registerShape("CubeLeft", CubeLeft);
echarts.graphic.registerShape("CubeRight", CubeRight); echarts.graphic.registerShape("CubeRight", CubeRight);
echarts.graphic.registerShape("CubeTop", CubeTop); echarts.graphic.registerShape("CubeTop", CubeTop);
let xAxisData = ["1月", "2月", "3月", "4月", "5月", "6月", "7月"]; let xAxisData = xData;
let seriesData = [100, 200, 400, 250, 360, 250, 340]; let seriesData = yData;
// 绿 // 绿
// let colorArr = [["#12D5AF"], ["#0BC19D", "rgba(13,8,16,0)"], ["#68EFD4", "rgba(14,185,151,0)"]] // let colorArr = [["#12D5AF"], ["#0BC19D", "rgba(13,8,16,0)"], ["#68EFD4", "rgba(14,185,151,0)"]]
// //
@ -545,7 +571,13 @@ const getCarbonIntensity = () => {
}); });
}; };
// //
const getCarbonEmissionStatistics = () => { const getCarbonEmissionStatistics = (params) => {
let xData = [];
let yData = [];
params.forEach((item) => {
xData.push(item.name);
yData.push(item.CarbonEmission);
});
let myChart = echarts.init( let myChart = echarts.init(
document.getElementById("carbonEmissionStatistics") document.getElementById("carbonEmissionStatistics")
); );
@ -603,7 +635,7 @@ const getCarbonEmissionStatistics = () => {
axisLine: { axisLine: {
show: false, show: false,
}, },
data: ["空调系统", "照明系统", "消防系统", "电梯系统", "展陈系统"], data: xData,
}, },
{ {
type: "category", type: "category",
@ -633,7 +665,7 @@ const getCarbonEmissionStatistics = () => {
}, },
}, },
}, },
data: [50000000, 22000000, 10000000, 5000000, 1], data: yData,
}, },
], ],
series: [ series: [
@ -654,7 +686,7 @@ const getCarbonEmissionStatistics = () => {
]), ]),
}, },
barWidth: 8, barWidth: 8,
data: [50000000, 22000000, 10000000, 5000000, 200], data: yData,
}, },
{ {
name: "背景", name: "背景",
@ -675,18 +707,18 @@ const getCarbonEmissionStatistics = () => {
}); });
}; };
const optionData = ref([ const optionData = ref([
{ // {
name: "CCER", // name: "CCER",
value: 176, // value: 176,
}, // },
{ // {
name: "绿电", // name: "绿",
value: 288, // value: 288,
}, // },
{ // {
name: "绿证", // name: "绿",
value: 88, // value: 88,
}, // },
]); ]);
const color = [ const color = [
"rgba(0, 140, 255, 1)", "rgba(0, 140, 255, 1)",
@ -751,8 +783,7 @@ const setLabel = () => {
const getCarbonNeutrality = () => { const getCarbonNeutrality = () => {
setLabel(); setLabel();
let myChart = echarts.init(document.getElementById("carbonNeutrality")); let myChart = echarts.init(document.getElementById("carbonNeutrality"));
let option = getPie3D(optionData.value, 0, 270, 26, 40, 1); let option = getPie3D(optionData.value, 0, 270, 26, 30, 1);
// myChart.setOption(option); // myChart.setOption(option);
// label线2d使labelLine3dsetOption // label线2d使labelLine3dsetOption
option.series.push({ option.series.push({
@ -765,7 +796,7 @@ const getCarbonNeutrality = () => {
lineHeight: 20, lineHeight: 20,
}, },
startAngle: -40, // [0, 360] startAngle: -40, // [0, 360]
clockwise: false, // 3d clockwise: true, // 3d
radius: ["20%", "60%"], radius: ["20%", "60%"],
center: ["50%", "50%"], center: ["50%", "50%"],
data: optionData.value, data: optionData.value,
@ -778,35 +809,34 @@ const getCarbonNeutrality = () => {
window.addEventListener("resize", function () { window.addEventListener("resize", function () {
myChart.resize(); // resize myChart.resize(); // resize
}); });
// bindListen(myChart);
}; };
// //
const drawEnergyFlow = () => { const drawEnergyFlow = (params) => {
let myChart = echarts.init(document.getElementById("energyFlow")); let myChart = echarts.init(document.getElementById("energyFlow"));
let sourceData = [ let sourceData = [
{ {
name: "电", name: "电",
nameValue: 1562, nameValue: params[0].Amount,
valueUnit: "万tCO₂", valueUnit: "万tCO₂",
}, },
{ {
name: "空调", name: "空调",
nameValue: 562, nameValue: params[0].data[0].AirConditioner,
valueUnit: "万tCO₂", valueUnit: "万tCO₂",
}, },
{ {
name: "照明", name: "照明",
nameValue: 490, nameValue: params[0].data[0].Lighting,
valueUnit: "万tCO₂", valueUnit: "万tCO₂",
}, },
{ {
name: "电梯", name: "电梯",
nameValue: 510, nameValue: params[0].data[0].Elevator,
valueUnit: "万tCO₂", valueUnit: "万tCO₂",
}, },
{ {
name: "其他", name: "其他",
nameValue: 320, nameValue: params[0].data[0].Other,
valueUnit: "万tCO₂", valueUnit: "万tCO₂",
}, },
]; ];
@ -937,18 +967,113 @@ const drawEnergyFlow = () => {
myChart.resize(); // resize myChart.resize(); // resize
}); });
}; };
//
function getOverview() {
let date = activeDate.value == 0 ? "年" : "月";
getCarbonOverview({ date })
.then((res) => {
if (res.code == 200) {
overviewList.value[0].num = res.data[0].TotalRelease;
overviewList.value[1].num = res.data[0].CarbonOffset;
overviewList.value[2].num = res.data[0].CarbonReduction;
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function carbonFlowChart(params) {
getCarbonFlux()
.then((res) => {
if (res.code == 200) {
//
drawEnergyFlow(res.data);
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function carboEmissionTrends() {
let date = trendActiveDate.value == 0 ? "月" : "日";
getCarbonTrend({ date })
.then((res) => {
if (res.code == 200) {
//
getCarbonTrends(res.data);
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function carbonStrength() {
getCarbonIntensity()
.then((res) => {
if (res.code == 200) {
getCarbonIntensityChat(res.data);
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function eachSystem() {
getSystemPurge()
.then((res) => {
if (res.code == 200) {
getCarbonEmissionStatistics(res.data);
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//
function neutralization(params) {
getCarbonNeutral()
.then((res) => {
if (res.code == 200) {
optionData.value = Object.keys(res.data).map((item, index) => {
return { name: res.data[index].name, value: res.data[index].CarbonNeutral };
});
getCarbonNeutrality();
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
//dom //dom
onMounted(() => { onMounted(() => {
// //
getCarbonTrends(); getOverview();
//
carbonFlowChart();
//
carboEmissionTrends();
// //
getCarbonIntensity(); carbonStrength();
// //
getCarbonEmissionStatistics(); eachSystem();
// //
getCarbonNeutrality(); neutralization();
//
drawEnergyFlow();
}); });
</script> </script>

View File

@ -1,231 +1,84 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { getOperatingState, getBigScreen } from "@/api/screen";
const faultAlarmList = ref([ const faultAlarmList = ref([]);
{ const runTimeList = ref([]);
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED1",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED2",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED3",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
{
location: "1楼中庭",
time: "2023-11-28 16:58:02",
name: "LED4",
},
]);
const runTimeList = ref([
{
name: "西大厅1",
value: false,
},
{
name: "西大厅2",
value: true,
},
{
name: "西大厅3",
value: true,
},
{
name: "西大厅4",
value: true,
},
{
name: "西大厅5",
value: false,
},
{
name: "西大厅6",
value: true,
},
{
name: "西大厅7",
value: true,
},
{
name: "西大厅8",
value: true,
},
{
name: "西大厅9",
value: false,
},
{
name: "西大厅10",
value: true,
},
{
name: "西大厅11",
value: true,
},
{
name: "西大厅12",
value: true,
},
{
name: "西大厅13",
value: false,
},
{
name: "西大厅14",
value: true,
},
{
name: "西大厅15",
value: true,
},
{
name: "西大厅16",
value: true,
},
{
name: "西大厅17",
value: false,
},
{
name: "西大厅18",
value: true,
},
{
name: "西大厅19",
value: true,
},
{
name: "西大厅20",
value: true,
},
{
name: "西大厅21",
value: false,
},
{
name: "西大厅22",
value: true,
},
{
name: "西大厅23",
value: true,
},
{
name: "西大厅24",
value: true,
},
]);
// //
const floorList = ref( const floorList = ref([
[{ {
name: '一层' name: "一层",
}, },
{ {
name: '二层' name: "二层",
}, },
{ {
name: '三层' name: "三层",
} },
] ]);
) const floorIndex = ref(-1);
const floorIndex = ref(-1) const emit = defineEmits(["sendVal"]);
const emit = defineEmits(["sendVal"])
// //
const toggleFloor = (item,index) => { const toggleFloor = (item, index) => {
if(item.name==="一层"){ if (item.name === "一层") {
emit('sendVal',10) emit("sendVal", 10);
}else if(item.name === "二层"){ } else if (item.name === "二层") {
emit('sendVal',11) emit("sendVal", 11);
}else if(item.name === "三层"){ } else if (item.name === "三层") {
emit('sendVal',12) emit("sendVal", 12);
} }
floorIndex.value = index floorIndex.value = index;
};
//
function faultalarm() {
getBigScreen().then((res)=>{
if (res.code == 200) {
faultAlarmList.value = res.data
}else{
return false
}
}).catch((err)=>{
console.log(err);
})
} }
//
function runningState() {
getOperatingState()
.then((res) => {
if (res.code == 200) {
res.data.forEach((item) => {
if (item.State == "1") {
item.State = true;
} else {
item.State = false;
}
});
runTimeList.value = res.data;
} else {
return false;
}
})
.catch((err) => {
console.log(err);
});
}
onMounted(() => {
//
faultalarm()
//
runningState();
});
</script> </script>
<template> <template>
<div class="page m100"> <div class="page m100">
<!-- 层级控制 --> <!-- 层级控制 -->
<div class="floor"> <div class="floor">
<div v-for="(item,index) in floorList" :class="index===floorIndex?'floor-select':'floor-default'" <div
@click="toggleFloor(item,index)">{{ item.name }} v-for="(item, index) in floorList"
:class="index === floorIndex ? 'floor-select' : 'floor-default'"
@click="toggleFloor(item, index)"
>
{{ item.name }}
</div> </div>
</div> </div>
<div class="page-left-box"> <div class="page-left-box">
@ -242,9 +95,9 @@ const toggleFloor = (item,index) => {
v-for="(item, index) in faultAlarmList" v-for="(item, index) in faultAlarmList"
:key="index" :key="index"
> >
<span class="name">{{ item.name }}</span> <span class="name">{{ item.Device }}</span>
<div class="content"> <div class="content">
<span class="location">地点{{ item.location }}</span> <span class="location">地点{{ item.Place }}</span>
<span class="time">时间{{ item.time }}</span> <span class="time">时间{{ item.time }}</span>
</div> </div>
</div> </div>
@ -267,8 +120,8 @@ const toggleFloor = (item,index) => {
v-for="(item, index) in runTimeList" v-for="(item, index) in runTimeList"
:key="index" :key="index"
> >
<span>{{ item.name }}</span> <span>{{ item.Name }}</span>
<el-switch v-model="item.value" style="left: 8px" /> <el-switch v-model="item.State" style="left: 8px" />
</div> </div>
</div> </div>
</div> </div>
@ -335,7 +188,7 @@ const toggleFloor = (item,index) => {
width: 100%; width: 100%;
height: 4.5%; height: 4.5%;
display: flex; display: flex;
justify-content: space-around; justify-content: space-evenly;
align-items: center; align-items: center;
font-size: 16px; font-size: 16px;
} }
@ -343,12 +196,14 @@ const toggleFloor = (item,index) => {
width: 100%; width: 100%;
height: calc(100% - 4.5%); height: calc(100% - 4.5%);
overflow: auto; overflow: auto;
display: flex;
flex-direction: column;
scrollbar-width: none; /* firefox */ scrollbar-width: none; /* firefox */
-ms-overflow-style: none; /* IE 10+ */ -ms-overflow-style: none; /* IE 10+ */
.tableBoby { .tableBoby {
background: url("../../assets/images/overview/runTime.png") no-repeat; background: url("../../assets/images/overview/runTime.png") no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
width: 100%; width: 88%;
height: 3.5%; height: 3.5%;
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;