ah_jjzhgd_webscreen/pages/newDataAnalysis/energySavingAnalysis.html

529 lines
17 KiB
HTML
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.

<!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="progress-container" class="space-y-4"></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'));
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)
selectLatestAll(data)
// 这里可以写你想监听后做的操作
}
});
let data = {
"startDate": range.startDate,
"endDate": range.endDate,
"proId": parent.parent.$('#bidPro').val()
}
selectEnergyStatsByDateRange(data)
selectDeviceEnergyByDateRange(data)
selectAnomalyByDateRange(data)
selectLatestAll(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)
} 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 selectLatestAll(data) {
const url = commonUrl + 'screen/largeScreen/deviceEnergyAnalysis/selectLatestAll';
ajaxRequest(url, "post", JSON.stringify(data), true, function () {
}, function (result) {
if (result.code === 200) {
insetLatest(result.data)
} else if (result.code === 500) {
console.error('数据分析应用' + result.msg);
} else if (result.code === 401) {
}
}, function (xhr, status, error) {
}, "application/json", aqEnnable);
}
function insetLatest(data) {
const container = document.getElementById('progress-container');
container.innerHTML = ''; // 🔄 清空原有内容
data.map(item => {
const block = document.createElement('div');
block.innerHTML = `
<div class="flex justify-between mb-1">
<span>${item.measureName}</span>
<span class="font-bold">${item.coverageRate * 100}%</span>
</div>
<div class="h-2 bg-gray-200 rounded-full">
<div class="h-2 bg-primary rounded-full" style="width: ${item.coverageRate * 100}%"></div>
</div>
`;
container.appendChild(block);
})
}
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(item.consumptionKwh);
renewableUsedKwh.push(item.renewableUsedKwh);
})
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 deviceName = [];
let consumptionKwh = []
data.map(item => {
deviceName.push(item.deviceName);
consumptionKwh.push(item.consumptionKwh);
})
deviceChart.setOption({
animation: false,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
textStyle: {
color: '#FFFFFF'
},
xAxis: {
type: 'value'
},
yAxis: {
type: 'category',
data: deviceName
},
series: [{
type: 'bar',
data: consumptionKwh,
itemStyle: {
color: '#008781'
},
label: {
show: true, // 开启显示
position: 'right', // 数值显示在柱状图右侧(柱子尾部)
color: '#FFFFFF', // 设置字体颜色,根据背景可调整
fontSize: 12,
formatter: '{c}' // 显示对应的数值
}
}]
});
}
window.addEventListener('resize', function () {
trendChart.resize();
deviceChart.resize();
});
</script>
</body>
</html>