hb_zhgd_screen/pages/newDataAnalysis/energySavingAnalysis.html

537 lines
17 KiB
HTML
Raw Permalink 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.

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>节能减排分析</title>
<script src="../../js/publics/tailwindcss.min.js"></script>
<link rel="stylesheet" href="../../css/font.css">
<link rel="stylesheet" href="../../plugin/layui-v2.9.7/layui/css/layui.css">
<link rel="stylesheet" href="../../css/dataAnalysis/commonStyle.css">
<link rel="stylesheet" href="../../css/shuiYin/shuiYin.css">
<link rel="stylesheet" href="../../css/coreTable.css"/>
<link href="../../css/all.min.css" rel="stylesheet">
<script src="../../js/publics/echarts.js"></script>
<script src="../../js/publics/sm4.js" type="text/javascript"></script>
<script src="../../js/publics/jquery-3.6.0.min.js" type="text/javascript"></script>
<script src="../../js/publics/public.js"></script>
<script src="../../plugin/layui-v2.9.7/layui/layui.js"></script>
<script src="../../js/publics/aescbc.js"></script>
<script src="../../js/publics/sm3.js"></script>
<script src="../../api/commonRequest.js"></script>
<style>
html {
width: 100%;
height: 90%;
margin-top: 3%;
color: #009B94
}
.layui-icon-close:before {
color: #009B94
}
.layui-form-select dl dd {
cursor: pointer;
background-color: #008781;
}
/*.shadow {
background-color: #FFFFFF;
}*/
.layui-laydate {
background-color: #009B94;
color: #FFFFFF;
}
.layui-laydate-content td {
color: #FFFFFF;
}
.layui-laydate-header i {
color: #FFFFFF;
}
.shadow {
background: linear-gradient(
135deg,
rgba(22, 186, 170, 0.1) 0%,
rgba(22, 186, 170, 0.05) 100%
);
}
.layui-layer {
background-image: url("../../img/video/child-back.png");
background-size: 100% 100%;
background-color: transparent;
}
.layui-laydate-footer span {
background-color: transparent;
}
.layui-laydate-preview {
color: #FFFFFF;
}
.layui-layer-title {
border-bottom: 1px solid #008781;
}
.layui-laydate-preview {
color: #FFFFFF !important;
}
#alarm-container {
overflow-x: auto; /* 或 overflow-y: auto根据需要 */
/* Firefox */
scrollbar-width: none;
/* IE 10+ */
-ms-overflow-style: none;
}
/* Chrome, Edge, Safari */
#alarm-container::-webkit-scrollbar {
display: none;
}
</style>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#009B94',
secondary: '#009B94'
},
borderRadius: {
'none': '0px',
'sm': '2px',
DEFAULT: '4px',
'md': '8px',
'lg': '12px',
'xl': '16px',
'2xl': '20px',
'3xl': '24px',
'full': '9999px',
'button': '4px'
}
}
}
}
</script>
</head>
<body style="width: 100%;height: 100%;color: #FFFFFF">
<div class="max-w-[1440px] mx-auto px-4">
<div class="flex items-center justify-between mb-1">
<form class="layui-form" style="color: #009B94" action="">
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-inline" id="ID-laydate-range">
<div class="layui-input-inline">
<input type="text" autocomplete="off" id="ID-laydate-start-date" class="layui-input"
placeholder="开始日期">
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="text" autocomplete="off" id="ID-laydate-end-date" class="layui-input"
placeholder="结束日期">
</div>
</div>
</div>
</div>
</form>
</div>
<div class="grid grid-cols-2 gap-4 mb-2">
<div class=" border border-[#004446] p-4 rounded-lg shadow">
<h3 class="text-lg font-bold mb-1">能耗趋势分析</h3>
<div id="trendChart" style="height: 300px;"></div>
</div>
<div class=" border border-[#004446] p-4 rounded-lg shadow">
<h3 class="text-lg font-bold mb-1">设备能耗占比</h3>
<div id="deviceChart" style="height: 300px;width: 100%;"></div>
</div>
</div>
<div class="grid grid-cols-2 gap-4 mb-2">
<div class=" border border-[#004446] p-4 rounded-lg shadow">
<h3 class="text-lg font-bold mb-2">设备节能占比</h3>
<div id="renewableUsedKwh" style="height: 270px;width: 100%;"></div>
</div>
<div class=" p-4 rounded-lg shadow border border-[#004446]">
<h3 class="text-lg font-bold mb-2">能耗异常分析</h3>
<div id="alarm-container" class="space-y-4"
style="height: 270px; overflow-y: auto;"></div>
</div>
</div>
</div>
<script>
const trendChart = echarts.init(document.getElementById('trendChart'));
const deviceChart = echarts.init(document.getElementById('deviceChart'));
const renewableUsedKwhChart = echarts.init(document.getElementById('renewableUsedKwh'));
let table, layer, form, laydate;
layui.use(["layer", "table", "form"], function () {
layer = layui.layer;
table = layui.table;
form = layui.form;
laydate = layui.laydate;
let range = getDateRangeOneWeek();
range.startDate = "2024-09-17"
range.endDate = "2024-09-24"
laydate.render({
elem: '#ID-laydate-range',
range: ['#ID-laydate-start-date', '#ID-laydate-end-date'],
btns: ['confirm'],
value: range.startDate + ' - ' + range.endDate,
done: function (value) {
// value 是选择的字符串,比如 '2025-06-23 - 2025-07-23'
const [startDateStr, endDateStr] = value.split(" - ");
const startDate = new Date(startDateStr);
const endDate = new Date(endDateStr);
// 计算两个日期相差的天数
const diffDays = (endDate - startDate) / (1000 * 60 * 60 * 24);
if (diffDays > 7) {
layer.msg('起止时间不能超过7天', {icon: 0});
// 重置日期为上一次合法范围(或你预设的默认值)
this.elem.val(range.startDate + ' - ' + range.endDate);
return;
}
let data = {
"startDate": startDateStr,
"endDate": endDateStr,
"proId": parent.parent.$('#bidPro').val()
}
selectEnergyStatsByDateRange(data)
selectDeviceEnergyByDateRange(data)
selectAnomalyByDateRange(data)
// 这里可以写你想监听后做的操作
}
});
let data = {
"startDate": range.startDate,
"endDate": range.endDate,
"proId": parent.parent.$('#bidPro').val()
}
selectEnergyStatsByDateRange(data)
selectDeviceEnergyByDateRange(data)
selectAnomalyByDateRange(data)
});
// 获取今天和一个月前日期,格式 yyyy-MM-dd
function getDateRangeOneWeek() {
let today = new Date();
// 复制一个日期减去7天
let oneWeekAgo = new Date(today);
oneWeekAgo.setDate(today.getDate() - 7);
function formatDate(d) {
let m = d.getMonth() + 1;
let day = d.getDate();
return d.getFullYear() + '-' + (m < 10 ? '0' + m : m) + '-' + (day < 10 ? '0' + day : day);
}
return {
startDate: formatDate(oneWeekAgo),
endDate: formatDate(today)
};
}
/* 加载数据分析应用 */
function selectEnergyStatsByDateRange(data) {
const url = commonUrl + 'screen/largeScreen/deviceEnergyAnalysis/selectEnergyStatsByDateRange';
ajaxRequest(url, "post", JSON.stringify(data), true, function () {
}, function (result) {
if (result.code === 200) {
trendChartFn(result.data)
} else if (result.code === 500) {
console.error('数据分析应用' + result.msg);
} else if (result.code === 401) {
}
}, function (xhr, status, error) {
}, "application/json", aqEnnable);
}
/* 加载数据分析应用 */
function selectDeviceEnergyByDateRange(data) {
const url = commonUrl + 'screen/largeScreen/deviceEnergyAnalysis/selectDeviceEnergyByDateRange';
ajaxRequest(url, "post", JSON.stringify(data), true, function () {
}, function (result) {
if (result.code === 200) {
deviceChartFn(result.data)
renewableUsedKwhFn(result.data)
} else if (result.code === 500) {
console.error('数据分析应用' + result.msg);
} else if (result.code === 401) {
}
}, function (xhr, status, error) {
}, "application/json", aqEnnable);
}
function selectAnomalyByDateRange(data) {
const url = commonUrl + 'screen/largeScreen/deviceEnergyAnalysis/selectAnomalyByDateRange';
ajaxRequest(url, "post", JSON.stringify(data), true, function () {
}, function (result) {
if (result.code === 200) {
insertAlarm(result.data)
} else if (result.code === 500) {
console.error('数据分析应用' + result.msg);
} else if (result.code === 401) {
}
}, function (xhr, status, error) {
}, "application/json", aqEnnable);
}
function insertAlarm(data) {
const container = document.getElementById('alarm-container');
container.innerHTML = ''; // 🔄 清空原有内容
const colorMap = {
info: {
bg: 'bg-blue-100',
icon: 'fa-info-circle',
iconColor: 'text-blue-500',
titleColor: 'text-blue-900',
timeColor: 'text-blue-700'
},
warning: {
bg: 'bg-yellow-100',
icon: 'fa-exclamation-triangle',
iconColor: 'text-yellow-500',
titleColor: 'text-yellow-900',
timeColor: 'text-yellow-700'
},
danger: {
bg: 'bg-red-100',
icon: 'fa-exclamation-circle',
iconColor: 'text-red-500',
titleColor: 'text-red-900',
timeColor: 'text-red-700'
}
};
data.map(item => {
const cfg = colorMap[item.anomalyLevel];
const div = document.createElement('div');
div.onclick = () => goDetail(item);
div.className = `flex items-start gap-3 p-4 ${cfg.bg} rounded-lg`;
div.innerHTML = `
<i class="fas ${cfg.icon} ${cfg.iconColor} mt-1"></i>
<div>
<div class="font-medium ${cfg.titleColor}" style="font-size: 16px">${item.deviceName}</div>
<div class="flex font-medium gap-2 p-1 ${cfg.titleColor}" style="width: 100%"><span>${item.anomalyDesc}</span><span style="float: right">${item.statDate}</span></div>
</div>`;
container.appendChild(div);
})
}
function goDetail(date) {
let layerIndex = layer.open({
type: 2, // page 层类型
area: ['600px', '400px'],
title: [`${date.deviceName} 异常详情`, 'font-size: 20px;color: #009B94;'],
shade: 0.6, // 遮罩透明度
shadeClose: true, // 点击遮罩区域,关闭弹层
anim: 0, // 0-6 的动画形式,-1 不开启
content: 'exception-detail.html',
success: function () {
if (date) {
let iframeWin = window["layui-layer-iframe" + layerIndex];
iframeWin.setParams(JSON.stringify(date));
}
}
});
}
function trendChartFn(data) {
let statDate = [];
let consumptionKwh = [];
let renewableUsedKwh = [];
data.map(item => {
statDate.push(item.statDate);
consumptionKwh.push(Number(parseFloat(item.consumptionKwh).toFixed(2)));
renewableUsedKwh.push(Number(parseFloat(item.renewableUsedKwh).toFixed(2)));
})
trendChart.setOption({
animation: false,
tooltip: {
trigger: 'axis'
},
textStyle: {
color: '#FFFFFF'
},
legend: {
data: ['能源消耗量', '节能减排量'],
textStyle: {
color: '#FFFFFF'
}
},
xAxis: {
type: 'category',
data: statDate
},
yAxis: [{
type: 'value',
name: '能源消耗量(kWh)',
}, {
type: 'value',
name: '节能减排量(kgCO₂)',
splitLine: {
show: false
}
}],
series: [{
name: '能源消耗量',
type: 'line',
data: consumptionKwh,
label: {
show: true,
position: 'top',
color: '#FFFFFF',
fontSize: 12,
formatter: '{c}'
}
}, {
name: '节能减排量',
type: 'line',
yAxisIndex: 1,
data: renewableUsedKwh,
label: {
show: true,
position: 'top',
color: '#FFFFFF',
fontSize: 12,
formatter: '{c}'
}
},]
});
}
function deviceChartFn(data) {
let pieData = data.map(item => ({
name: item.deviceName,
value: Number(parseFloat(item.consumptionKwh).toFixed(2))
}));
deviceChart.setOption({
animation: false,
tooltip: {
trigger: 'item',
formatter: '{b}: {c} kWh ({d}%)'
},
textStyle: { color: '#FFFFFF' },
legend: {
orient: 'vertical',
left: 'left',
textStyle: { color: '#FFFFFF' }
},
series: [{
name: '能耗占比',
type: 'pie',
radius: '55%',
center: ['50%', '50%'],
data: pieData,
label: {
show: true,
formatter: '{b}: {d}%',
color: '#FFFFFF',
fontSize: 12
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}]
});
}
function renewableUsedKwhFn(data) {
let pieData = data.map(item => ({
name: item.deviceName,
value: Number(parseFloat(item.renewableUsedKwh).toFixed(2))
}));
renewableUsedKwhChart.setOption({
animation: false,
tooltip: {
trigger: 'item',
formatter: '{b}: {c} kWh ({d}%)'
},
textStyle: { color: '#FFFFFF' },
legend: {
orient: 'vertical',
left: 'left',
textStyle: { color: '#FFFFFF' }
},
series: [{
name: '可再生能源使用占比',
type: 'pie',
radius: '55%',
center: ['50%', '50%'],
data: pieData,
label: {
show: true,
formatter: '{b}: {d}%',
color: '#FFFFFF',
fontSize: 12
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}]
});
}
window.addEventListener('resize', function () {
trendChart.resize();
deviceChart.resize();
renewableUsedKwhChart.resize();
});
</script>
</body>
</html>