Browse Source

添加ai策略控制建议

bl_ai
25604 1 week ago
parent
commit
3326753c5e
  1. 700
      src/views/ai/components/AirConditioningAISaving.vue
  2. 625
      src/views/ai/components/LightingAISaving.vue
  3. 6
      src/views/ai/components/index.js
  4. 48
      src/views/ai/index.vue
  5. 4
      src/views/newCenterairC/energyManage/energyEfficiencyCalendarViz/index.vue

700
src/views/ai/components/AirConditioningAISaving.vue

@ -0,0 +1,700 @@
<template>
<div class="air-conditioning-ai-saving report-wrapper">
<!-- 报表标题 -->
<div class="report-title-section">
<h1>{{ reportData.title }}</h1>
<p class="report-time">生成时间{{ reportData.generateTime }}</p>
</div>
<!-- 报表摘要 -->
<div class="report-summary">
<h3>AI空调节能策略报告</h3>
<p>{{ reportData.summary }}</p>
</div>
<!-- 策略配置区域 -->
<div class="strategy-config">
<h2>节能策略配置</h2>
<!-- 目标选择 -->
<div class="target-selection">
<h3>优化目标</h3>
<el-radio-group v-model="selectedTarget" size="small">
<el-radio label="cost">成本最低</el-radio>
<el-radio label="comfort">舒适度品质最优</el-radio>
<el-radio label="balanced">成本与品质均衡</el-radio>
</el-radio-group>
</div>
<!-- 系统选择 -->
<div class="system-selection">
<h3>适用系统</h3>
<el-checkbox-group v-model="selectedSystems">
<el-checkbox label="chiller">冷水机组</el-checkbox>
<el-checkbox label="pump">水泵系统</el-checkbox>
<el-checkbox label="terminal">空调末端</el-checkbox>
<el-checkbox label="heatPump">热泵系统</el-checkbox>
</el-checkbox-group>
</div>
<!-- 执行模式 -->
<div class="execution-mode">
<h3>执行方式</h3>
<el-radio-group v-model="executionMode" size="small">
<el-radio label="auto">自动执行动态调整</el-radio>
<el-radio label="suggestion">仅建议</el-radio>
</el-radio-group>
</div>
</div>
<!-- 系统参数优化 -->
<div class="system-optimization">
<h2>系统参数优化策略</h2>
<el-tabs v-model="activeSystemTab" type="card">
<!-- 冷水机组 -->
<el-tab-pane label="冷水机组" name="chiller">
<div class="system-parameters">
<h3>冷水机组参数优化</h3>
<el-form :inline="true" size="small" label-width="120px">
<el-form-item label="供水温度设定值">
<el-input-number
v-model="chillerParams.supplyTemp"
:min="5"
:max="15"
controls-position="right"
/> °C
</el-form-item>
<el-form-item label="回水温度设定值">
<el-input-number
v-model="chillerParams.returnTemp"
:min="10"
:max="20"
controls-position="right"
/> °C
</el-form-item>
<el-form-item label="运行台数">
<el-input-number
v-model="chillerParams.runningUnits"
:min="1"
:max="8"
controls-position="right"
/>
</el-form-item>
<el-form-item label="负载率优化">
<el-slider
v-model="chillerParams.loadOptimization"
:min="70"
:max="100"
show-input
/>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
<!-- 水泵系统 -->
<el-tab-pane label="水泵系统" name="pump">
<div class="system-parameters">
<h3>水泵系统参数优化</h3>
<el-form :inline="true" size="small" label-width="120px">
<el-form-item label="变频水泵频率">
<el-input-number
v-model="pumpParams.frequency"
:min="30"
:max="50"
controls-position="right"
/> Hz
</el-form-item>
<el-form-item label="供水压力设定">
<el-input-number
v-model="pumpParams.supplyPressure"
:min="0.2"
:max="0.6"
:step="0.1"
controls-position="right"
/> MPa
</el-form-item>
<el-form-item label="回水压力设定">
<el-input-number
v-model="pumpParams.returnPressure"
:min="0.1"
:max="0.4"
:step="0.1"
controls-position="right"
/> MPa
</el-form-item>
<el-form-item label="水泵运行模式">
<el-select v-model="pumpParams.operationMode" size="small">
<el-option label="恒压差" value="constantDiff"/>
<el-option label="变压差" value="variableDiff"/>
<el-option label="智能调度" value="smartSchedule"/>
</el-select>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
<!-- 空调末端 -->
<el-tab-pane label="空调末端" name="terminal">
<div class="system-parameters">
<h3>空调末端参数优化</h3>
<el-form :inline="true" size="small" label-width="120px">
<el-form-item label="风机转速">
<el-input-number
v-model="terminalParams.fanSpeed"
:min="20"
:max="100"
controls-position="right"
/> %
</el-form-item>
<el-form-item label="风阀开度">
<el-input-number
v-model="terminalParams.damperOpening"
:min="10"
:max="100"
controls-position="right"
/> %
</el-form-item>
<el-form-item label="室内温度设定">
<el-input-number
v-model="terminalParams.roomTemp"
:min="22"
:max="26"
controls-position="right"
/> °C
</el-form-item>
<el-form-item label="CO₂浓度阈值">
<el-input-number
v-model="terminalParams.co2Threshold"
:min="600"
:max="1000"
controls-position="right"
/> ppm
</el-form-item>
</el-form>
</div>
</el-tab-pane>
<!-- 热泵系统 -->
<el-tab-pane label="热泵系统" name="heatPump">
<div class="system-parameters">
<h3>热泵系统参数优化</h3>
<el-form :inline="true" size="small" label-width="120px">
<el-form-item label="制热供水温度">
<el-input-number
v-model="heatPumpParams.heatingTemp"
:min="35"
:max="55"
controls-position="right"
/> °C
</el-form-item>
<el-form-item label="制冷供水温度">
<el-input-number
v-model="heatPumpParams.coolingTemp"
:min="5"
:max="15"
controls-position="right"
/> °C
</el-form-item>
<el-form-item label="运行模式">
<el-select v-model="heatPumpParams.operationMode" size="small">
<el-option label="制热优先" value="heatingFirst"/>
<el-option label="制冷优先" value="coolingFirst"/>
<el-option label="平衡模式" value="balancedMode"/>
</el-select>
</el-form-item>
<el-form-item label="能效优化等级">
<el-slider
v-model="heatPumpParams.efficiencyLevel"
:min="1"
:max="5"
show-input
/>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
</el-tabs>
</div>
<!-- 区域策略配置 -->
<div class="area-strategy-config">
<h2>区域策略配置</h2>
<el-table :data="areaStrategies" size="small" border style="margin-bottom: 15px;">
<el-table-column prop="areaName" label="区域名称" width="120"/>
<el-table-column prop="temperatureRange" label="温度范围(°C)" width="120">
<template slot-scope="{row}">
<el-input-number
v-model="row.minTemp"
:min="18"
:max="28"
size="small"
style="width: 80px;"
/> -
<el-input-number
v-model="row.maxTemp"
:min="18"
:max="28"
size="small"
style="width: 80px;"
/>
</template>
</el-table-column>
<el-table-column prop="humidityRange" label="湿度范围(%)" width="120">
<template slot-scope="{row}">
<el-input-number
v-model="row.minHumidity"
:min="30"
:max="70"
size="small"
style="width: 80px;"
/> -
<el-input-number
v-model="row.maxHumidity"
:min="30"
:max="70"
size="small"
style="width: 80px;"
/>
</template>
</el-table-column>
<el-table-column prop="co2Threshold" label="CO₂阈值(ppm)" width="100">
<template slot-scope="{row}">
<el-input-number
v-model="row.co2Threshold"
:min="500"
:max="1200"
size="small"
style="width: 100px;"
/>
</template>
</el-table-column>
<el-table-column prop="priority" label="优先级" width="100">
<template slot-scope="{row}">
<el-select v-model="row.priority" size="small">
<el-option label="高" value="high"/>
<el-option label="中" value="medium"/>
<el-option label="低" value="low"/>
</el-select>
</template>
</el-table-column>
<el-table-column label="操作" width="80">
<template slot-scope="{row, $index}">
<el-button
type="text"
size="small"
@click="removeAreaStrategy($index)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button
type="primary"
size="small"
icon="el-icon-plus"
@click="addAreaStrategy"
>添加区域策略</el-button>
</div>
<!-- 效果预览与评估 -->
<div class="effect-preview">
<h2>策略效果预览</h2>
<div class="preview-metrics">
<div class="metric-card">
<div class="metric-value">{{ estimatedEnergySaving }}%</div>
<div class="metric-label">预计节能率</div>
</div>
<div class="metric-card">
<div class="metric-value">{{ comfortIndex }}</div>
<div class="metric-label">舒适度指数</div>
</div>
<div class="metric-card">
<div class="metric-value">{{ costReduction }}%</div>
<div class="metric-label">成本降低</div>
</div>
<div class="metric-card">
<div class="metric-value">{{ co2Reduction }}</div>
<div class="metric-label">CO₂减排</div>
</div>
</div>
<!-- 节能效果图表 -->
<div class="charts-container">
<div ref="energyTrendChart" class="chart-box"></div>
<div ref="comfortAnalysisChart" class="chart-box"></div>
</div>
</div>
<!-- 操作按钮 -->
<div class="action-buttons">
<el-button type="primary" @click="saveStrategy">保存策略</el-button>
<el-button type="success" @click="executeStrategy">立即执行</el-button>
<el-button @click="resetStrategy">重置</el-button>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: 'AirConditioningAISaving',
props: {
reportData: {
type: Object,
required: true
},
userName: {
type: String,
default: ''
}
},
data() {
return {
selectedTarget: 'balanced',
selectedSystems: ['chiller', 'pump', 'terminal', 'heatPump'],
executionMode: 'auto',
activeSystemTab: 'chiller',
//
chillerParams: {
supplyTemp: 7,
returnTemp: 12,
runningUnits: 3,
loadOptimization: 85
},
pumpParams: {
frequency: 40,
supplyPressure: 0.4,
returnPressure: 0.2,
operationMode: 'smartSchedule'
},
terminalParams: {
fanSpeed: 70,
damperOpening: 80,
roomTemp: 24,
co2Threshold: 800
},
heatPumpParams: {
heatingTemp: 45,
coolingTemp: 7,
operationMode: 'balancedMode',
efficiencyLevel: 4
},
//
areaStrategies: [
{ areaName: '办公区', minTemp: 22, maxTemp: 26, minHumidity: 40, maxHumidity: 60, co2Threshold: 800, priority: 'high' },
{ areaName: '会议室', minTemp: 22, maxTemp: 25, minHumidity: 45, maxHumidity: 65, co2Threshold: 900, priority: 'high' },
{ areaName: '走廊', minTemp: 23, maxTemp: 27, minHumidity: 35, maxHumidity: 65, co2Threshold: 1000, priority: 'medium' },
{ areaName: '设备间', minTemp: 20, maxTemp: 28, minHumidity: 30, maxHumidity: 70, co2Threshold: 1200, priority: 'low' }
],
//
estimatedEnergySaving: 32,
comfortIndex: 8.5,
costReduction: 28,
co2Reduction: 15.6
};
},
mounted() {
this.initCharts();
},
beforeDestroy() {
this.disposeCharts();
},
methods: {
initCharts() {
//
if (this.$refs.energyTrendChart) {
const energyTrendChart = echarts.init(this.$refs.energyTrendChart);
energyTrendChart.setOption({
title: { text: '月度能耗与节能效果', left: 'center' },
tooltip: { trigger: 'axis' },
legend: { top: 'bottom' },
xAxis: { type: 'category', data: ['1月', '2月', '3月', '4月', '5月', '6月'] },
yAxis: [{ type: 'value', name: '能耗(kWh)' }, { type: 'value', name: '节能率(%)', position: 'right' }],
series: [
{
name: '原始能耗',
type: 'bar',
data: [12000, 11500, 11000, 10500, 10000, 9500],
itemStyle: { color: '#6b8a9e' }
},
{
name: '优化后能耗',
type: 'bar',
data: [9500, 9000, 8500, 8000, 7500, 7000],
itemStyle: { color: '#0ac1c7' }
},
{
name: '节能率',
type: 'line',
yAxisIndex: 1,
data: [20, 22, 23, 24, 25, 26],
smooth: true,
lineStyle: { width: 3 },
itemStyle: { color: '#ff9900' }
}
]
});
this.energyTrendChart = energyTrendChart;
}
//
if (this.$refs.comfortAnalysisChart) {
const comfortAnalysisChart = echarts.init(this.$refs.comfortAnalysisChart);
comfortAnalysisChart.setOption({
title: { text: '舒适度与能效平衡分析', left: 'center' },
tooltip: { trigger: 'item' },
radar: {
indicator: [
{ name: '温度舒适度', max: 10 },
{ name: '湿度舒适度', max: 10 },
{ name: '空气质量', max: 10 },
{ name: '噪音水平', max: 10 },
{ name: '能效表现', max: 10 }
]
},
series: [{
name: '舒适度分析',
type: 'radar',
data: [
{
value: [8.5, 8.2, 8.8, 9.0, 7.5],
name: '当前策略'
}
],
itemStyle: { color: '#0ac1c7' },
lineStyle: { width: 3 }
}]
});
this.comfortAnalysisChart = comfortAnalysisChart;
}
},
disposeCharts() {
if (this.energyTrendChart) {
this.energyTrendChart.dispose();
this.energyTrendChart = null;
}
if (this.comfortAnalysisChart) {
this.comfortAnalysisChart.dispose();
this.comfortAnalysisChart = null;
}
},
addAreaStrategy() {
this.areaStrategies.push({
areaName: '新区域',
minTemp: 22,
maxTemp: 26,
minHumidity: 40,
maxHumidity: 60,
co2Threshold: 800,
priority: 'medium'
});
},
removeAreaStrategy(index) {
if (this.areaStrategies.length > 1) {
this.areaStrategies.splice(index, 1);
}
},
saveStrategy() {
this.$message.success('策略保存成功!');
// API
},
executeStrategy() {
this.$confirm('确定要立即执行此AI空调节能策略吗?', '确认执行', {
confirmButtonText: '确定执行',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$message.success('策略已开始执行!');
// API
}).catch(() => {
//
});
},
resetStrategy() {
this.$confirm('确定要重置所有策略配置吗?', '确认重置', {
confirmButtonText: '确定重置',
cancelButtonText: '取消',
type: 'info'
}).then(() => {
//
this.chillerParams = { supplyTemp: 7, returnTemp: 12, runningUnits: 3, loadOptimization: 85 };
this.pumpParams = { frequency: 40, supplyPressure: 0.4, returnPressure: 0.2, operationMode: 'smartSchedule' };
this.terminalParams = { fanSpeed: 70, damperOpening: 80, roomTemp: 24, co2Threshold: 800 };
this.heatPumpParams = { heatingTemp: 45, coolingTemp: 7, operationMode: 'balancedMode', efficiencyLevel: 4 };
this.areaStrategies = [
{ areaName: '办公区', minTemp: 22, maxTemp: 26, minHumidity: 40, maxHumidity: 60, co2Threshold: 800, priority: 'high' },
{ areaName: '会议室', minTemp: 22, maxTemp: 25, minHumidity: 45, maxHumidity: 65, co2Threshold: 900, priority: 'high' },
{ areaName: '走廊', minTemp: 23, maxTemp: 27, minHumidity: 35, maxHumidity: 65, co2Threshold: 1000, priority: 'medium' },
{ areaName: '设备间', minTemp: 20, maxTemp: 28, minHumidity: 30, maxHumidity: 70, co2Threshold: 1200, priority: 'low' }
];
this.$message.success('策略已重置!');
}).catch(() => {
//
});
}
}
};
</script>
<style lang="scss" scoped>
.air-conditioning-ai-saving {
.strategy-config {
margin-bottom: 20px;
h3 {
margin: 15px 0 10px 0;
color: #0ac1c7;
}
.el-radio-group,
.el-checkbox-group {
display: flex;
flex-wrap: wrap;
gap: 15px;
}
.el-radio,
.el-checkbox {
margin-right: 20px;
}
}
.system-optimization {
margin-bottom: 20px;
.system-parameters {
padding: 15px;
background: rgba(255, 255, 255, 0.05);
border-radius: 8px;
h3 {
margin-bottom: 15px;
color: #0ac1c7;
}
::v-deep .el-form {
.el-form-item {
margin-right: 20px;
margin-bottom: 15px;
}
.el-input-number {
width: 120px;
}
.el-slider {
width: 200px;
.el-slider__runway {
height: 6px;
background: #2d3f52;
}
.el-slider__bar {
height: 6px;
background: #0ac1c7;
}
.el-slider__button {
width: 16px;
height: 16px;
border: 2px solid #0ac1c7;
background: #1a2a3a;
}
}
}
}
}
.area-strategy-config {
margin-bottom: 20px;
h2 {
margin-bottom: 15px;
}
::v-deep .el-table {
.el-table__header th {
background: #2d3f52;
color: #e0e6ed;
}
.el-table__body td {
background: #1a2a3a;
color: #e0e6ed;
}
}
}
.effect-preview {
margin-bottom: 20px;
.preview-metrics {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin-bottom: 20px;
.metric-card {
background: rgba(10, 193, 199, 0.1);
border: 1px solid rgba(10, 193, 199, 0.3);
border-radius: 8px;
padding: 15px;
text-align: center;
.metric-value {
font-size: 24px;
font-weight: bold;
color: #0ac1c7;
margin-bottom: 5px;
}
.metric-label {
font-size: 14px;
color: #a0b3c6;
}
}
}
.charts-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
.chart-box {
height: 300px;
background: #1a2a3a;
border-radius: 8px;
padding: 15px;
}
}
}
.action-buttons {
text-align: center;
padding: 20px 0;
.el-button {
margin: 0 10px;
}
}
}
</style>

625
src/views/ai/components/LightingAISaving.vue

@ -0,0 +1,625 @@
<template>
<div class="lighting-ai-saving report-wrapper">
<!-- 报表标题 -->
<div class="report-title-section">
<h1>{{ reportData.title }}</h1>
<p class="report-time">生成时间{{ reportData.generateTime }}</p>
</div>
<!-- 报表摘要 -->
<div class="report-summary">
<h3>AI照明节能策略报告</h3>
<p>{{ reportData.summary }}</p>
</div>
<!-- 策略配置区域 -->
<div class="strategy-config">
<h2>节能策略配置</h2>
<!-- 目标选择 -->
<div class="target-selection">
<h3>优化目标</h3>
<el-radio-group v-model="selectedTarget" size="small">
<el-radio label="energy">节能优先</el-radio>
<el-radio label="comfort">舒适优先</el-radio>
<el-radio label="balanced">平衡模式</el-radio>
</el-radio-group>
</div>
<!-- 区域选择 -->
<div class="area-selection">
<h3>适用区域</h3>
<el-checkbox-group v-model="selectedAreas">
<el-checkbox label="office">办公区</el-checkbox>
<el-checkbox label="corridor">走廊</el-checkbox>
<el-checkbox label="meeting">会议室</el-checkbox>
<el-checkbox label="garage">车库</el-checkbox>
</el-checkbox-group>
</div>
<!-- 执行模式 -->
<div class="execution-mode">
<h3>执行方式</h3>
<el-radio-group v-model="executionMode" size="small">
<el-radio label="auto">自动执行动态调整</el-radio>
<el-radio label="suggestion">仅建议</el-radio>
</el-radio-group>
</div>
</div>
<!-- 场景策略详情 -->
<div class="scene-strategy">
<h2>场景化调光策略</h2>
<el-tabs v-model="activeAreaTab" type="card">
<el-tab-pane
v-for="area in areaConfig"
:key="area.value"
:label="area.label"
:name="area.value"
>
<div class="area-strategy">
<h3>{{ area.label }}照明策略</h3>
<!-- 亮度占比配置 -->
<div class="brightness-config">
<h4>亮度模式占比</h4>
<div class="brightness-sliders">
<div class="slider-item">
<label>低亮模式 ({{ area.brightness.low }}%)</label>
<el-slider
v-model="area.brightness.low"
:min="0"
:max="100"
@change="updateBrightness(area)"
/>
</div>
<div class="slider-item">
<label>中亮模式 ({{ area.brightness.medium }}%)</label>
<el-slider
v-model="area.brightness.medium"
:min="0"
:max="100"
@change="updateBrightness(area)"
/>
</div>
<div class="slider-item">
<label>高亮模式 ({{ area.brightness.high }}%)</label>
<el-slider
v-model="area.brightness.high"
:min="0"
:max="100"
@change="updateBrightness(area)"
/>
</div>
</div>
</div>
<!-- 感应触发时长 -->
<div class="trigger-config">
<h4>感应触发设置</h4>
<el-form :inline="true" size="small">
<el-form-item label="无人检测延时">
<el-input-number
v-model="area.trigger.delay"
:min="1"
:max="60"
controls-position="right"
/>
</el-form-item>
<el-form-item label="恢复亮度延时">
<el-input-number
v-model="area.trigger.recovery"
:min="1"
:max="30"
controls-position="right"
/>
</el-form-item>
</el-form>
</div>
<!-- 时间段策略 -->
<div class="time-strategy">
<h4>时段策略</h4>
<el-table :data="area.timeSlots" size="small" border>
<el-table-column prop="timeRange" label="时间段" width="120"/>
<el-table-column prop="brightnessLevel" label="亮度等级" width="100">
<template slot-scope="{row}">
<el-select v-model="row.brightnessLevel" size="small">
<el-option label="低亮" value="low"/>
<el-option label="中亮" value="medium"/>
<el-option label="高亮" value="high"/>
</el-select>
</template>
</el-table-column>
<el-table-column prop="occupancySensitivity" label="人员感应灵敏度" width="140">
<template slot-scope="{row}">
<el-select v-model="row.occupancySensitivity" size="small">
<el-option label="高" value="high"/>
<el-option label="中" value="medium"/>
<el-option label="低" value="low"/>
</el-select>
</template>
</el-table-column>
<el-table-column label="操作" width="80">
<template slot-scope="{row, $index}">
<el-button
type="text"
size="small"
@click="removeTimeSlot(area, $index)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button
type="primary"
size="small"
icon="el-icon-plus"
style="margin-top: 10px;"
@click="addTimeSlot(area)"
>添加时段</el-button>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
<!-- 效果预览与评估 -->
<div class="effect-preview">
<h2>策略效果预览</h2>
<div class="preview-metrics">
<div class="metric-card">
<div class="metric-value">{{ estimatedSaving }}%</div>
<div class="metric-label">预计节能率</div>
</div>
<div class="metric-card">
<div class="metric-value">{{ comfortScore }}</div>
<div class="metric-label">舒适度评分</div>
</div>
<div class="metric-card">
<div class="metric-value">{{ implementationCost }}</div>
<div class="metric-label">实施成本</div>
</div>
<div class="metric-card">
<div class="metric-value">{{ paybackPeriod }}</div>
<div class="metric-label">投资回收期()</div>
</div>
</div>
<!-- 节能效果图表 -->
<div class="charts-container">
<div ref="savingTrendChart" class="chart-box"></div>
<div ref="areaComparisonChart" class="chart-box"></div>
</div>
</div>
<!-- 操作按钮 -->
<div class="action-buttons">
<el-button type="primary" @click="saveStrategy">保存策略</el-button>
<el-button type="success" @click="executeStrategy">立即执行</el-button>
<el-button @click="resetStrategy">重置</el-button>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: 'LightingAISaving',
props: {
reportData: {
type: Object,
required: true
},
userName: {
type: String,
default: ''
}
},
data() {
return {
selectedTarget: 'balanced',
selectedAreas: ['office', 'corridor', 'meeting', 'garage'],
executionMode: 'auto',
activeAreaTab: 'office',
//
areaConfig: [
{
value: 'office',
label: '办公区',
brightness: { low: 20, medium: 50, high: 80 },
trigger: { delay: 15, recovery: 10 },
timeSlots: [
{ timeRange: '08:00-12:00', brightnessLevel: 'high', occupancySensitivity: 'high' },
{ timeRange: '12:00-13:00', brightnessLevel: 'medium', occupancySensitivity: 'medium' },
{ timeRange: '13:00-18:00', brightnessLevel: 'high', occupancySensitivity: 'high' },
{ timeRange: '18:00-22:00', brightnessLevel: 'low', occupancySensitivity: 'low' }
]
},
{
value: 'corridor',
label: '走廊',
brightness: { low: 10, medium: 30, high: 60 },
trigger: { delay: 5, recovery: 5 },
timeSlots: [
{ timeRange: '06:00-22:00', brightnessLevel: 'medium', occupancySensitivity: 'high' },
{ timeRange: '22:00-06:00', brightnessLevel: 'low', occupancySensitivity: 'low' }
]
},
{
value: 'meeting',
label: '会议室',
brightness: { low: 15, medium: 40, high: 75 },
trigger: { delay: 30, recovery: 15 },
timeSlots: [
{ timeRange: '08:00-18:00', brightnessLevel: 'medium', occupancySensitivity: 'medium' },
{ timeRange: '18:00-22:00', brightnessLevel: 'low', occupancySensitivity: 'low' }
]
},
{
value: 'garage',
label: '车库',
brightness: { low: 5, medium: 25, high: 50 },
trigger: { delay: 10, recovery: 8 },
timeSlots: [
{ timeRange: '06:00-22:00', brightnessLevel: 'medium', occupancySensitivity: 'high' },
{ timeRange: '22:00-06:00', brightnessLevel: 'low', occupancySensitivity: 'low' }
]
}
],
//
estimatedSaving: 45,
comfortScore: 8.2,
implementationCost: '低',
paybackPeriod: 6
};
},
mounted() {
this.initCharts();
},
beforeDestroy() {
this.disposeCharts();
},
methods: {
initCharts() {
//
if (this.$refs.savingTrendChart) {
const savingTrendChart = echarts.init(this.$refs.savingTrendChart);
savingTrendChart.setOption({
title: { text: '月度节能效果趋势', left: 'center' },
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', data: ['1月', '2月', '3月', '4月', '5月', '6月'] },
yAxis: { type: 'value', name: '节能率(%)' },
series: [{
name: '节能率',
type: 'line',
data: [30, 35, 40, 42, 45, 48],
smooth: true,
lineStyle: { width: 3 },
itemStyle: { color: '#0ac1c7' }
}]
});
this.savingTrendChart = savingTrendChart;
}
//
if (this.$refs.areaComparisonChart) {
const areaComparisonChart = echarts.init(this.$refs.areaComparisonChart);
areaComparisonChart.setOption({
title: { text: '各区域节能效果对比', left: 'center' },
tooltip: { trigger: 'item' },
legend: { top: 'bottom' },
series: [{
name: '节能效果',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 10,
borderColor: '#fff',
borderWidth: 2
},
label: { show: false, position: 'center' },
emphasis: {
label: { show: true, fontSize: '16', fontWeight: 'bold' }
},
labelLine: { show: false },
data: [
{ value: 35, name: '办公区' },
{ value: 25, name: '走廊' },
{ value: 20, name: '会议室' },
{ value: 20, name: '车库' }
]
}]
});
this.areaComparisonChart = areaComparisonChart;
}
},
disposeCharts() {
if (this.savingTrendChart) {
this.savingTrendChart.dispose();
this.savingTrendChart = null;
}
if (this.areaComparisonChart) {
this.areaComparisonChart.dispose();
this.areaComparisonChart = null;
}
},
updateBrightness(area) {
// 100%
const total = area.brightness.low + area.brightness.medium + area.brightness.high;
if (total > 100) {
//
const ratio = 100 / total;
area.brightness.low = Math.round(area.brightness.low * ratio);
area.brightness.medium = Math.round(area.brightness.medium * ratio);
area.brightness.high = Math.round(area.brightness.high * ratio);
}
},
addTimeSlot(area) {
area.timeSlots.push({
timeRange: '00:00-24:00',
brightnessLevel: 'medium',
occupancySensitivity: 'medium'
});
},
removeTimeSlot(area, index) {
if (area.timeSlots.length > 1) {
area.timeSlots.splice(index, 1);
}
},
saveStrategy() {
this.$message.success('策略保存成功!');
// API
},
executeStrategy() {
this.$confirm('确定要立即执行此AI节能策略吗?', '确认执行', {
confirmButtonText: '确定执行',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$message.success('策略已开始执行!');
// API
}).catch(() => {
//
});
},
resetStrategy() {
this.$confirm('确定要重置所有策略配置吗?', '确认重置', {
confirmButtonText: '确定重置',
cancelButtonText: '取消',
type: 'info'
}).then(() => {
//
this.areaConfig = JSON.parse(JSON.stringify([
{
value: 'office',
label: '办公区',
brightness: { low: 20, medium: 50, high: 80 },
trigger: { delay: 15, recovery: 10 },
timeSlots: [
{ timeRange: '08:00-12:00', brightnessLevel: 'high', occupancySensitivity: 'high' },
{ timeRange: '12:00-13:00', brightnessLevel: 'medium', occupancySensitivity: 'medium' },
{ timeRange: '13:00-18:00', brightnessLevel: 'high', occupancySensitivity: 'high' },
{ timeRange: '18:00-22:00', brightnessLevel: 'low', occupancySensitivity: 'low' }
]
},
{
value: 'corridor',
label: '走廊',
brightness: { low: 10, medium: 30, high: 60 },
trigger: { delay: 5, recovery: 5 },
timeSlots: [
{ timeRange: '06:00-22:00', brightnessLevel: 'medium', occupancySensitivity: 'high' },
{ timeRange: '22:00-06:00', brightnessLevel: 'low', occupancySensitivity: 'low' }
]
},
{
value: 'meeting',
label: '会议室',
brightness: { low: 15, medium: 40, high: 75 },
trigger: { delay: 30, recovery: 15 },
timeSlots: [
{ timeRange: '08:00-18:00', brightnessLevel: 'medium', occupancySensitivity: 'medium' },
{ timeRange: '18:00-22:00', brightnessLevel: 'low', occupancySensitivity: 'low' }
]
},
{
value: 'garage',
label: '车库',
brightness: { low: 5, medium: 25, high: 50 },
trigger: { delay: 10, recovery: 8 },
timeSlots: [
{ timeRange: '06:00-22:00', brightnessLevel: 'medium', occupancySensitivity: 'high' },
{ timeRange: '22:00-06:00', brightnessLevel: 'low', occupancySensitivity: 'low' }
]
}
]));
this.$message.success('策略已重置!');
}).catch(() => {
//
});
}
}
};
</script>
<style lang="scss" scoped>
.lighting-ai-saving {
.strategy-config {
margin-bottom: 20px;
h3 {
margin: 15px 0 10px 0;
color: #0ac1c7;
}
.el-radio-group,
.el-checkbox-group {
display: flex;
flex-wrap: wrap;
gap: 15px;
}
.el-radio,
.el-checkbox {
margin-right: 20px;
}
}
.scene-strategy {
margin-bottom: 20px;
.area-strategy {
padding: 15px;
background: rgba(255, 255, 255, 0.05);
border-radius: 8px;
h3 {
margin-bottom: 15px;
color: #0ac1c7;
}
.brightness-config {
margin-bottom: 20px;
h4 {
margin-bottom: 10px;
color: #e0e6ed;
}
.brightness-sliders {
display: flex;
flex-direction: column;
gap: 15px;
.slider-item {
label {
display: block;
margin-bottom: 5px;
font-size: 14px;
color: #a0b3c6;
}
::v-deep .el-slider {
.el-slider__runway {
height: 6px;
background: #2d3f52;
}
.el-slider__bar {
height: 6px;
background: #0ac1c7;
}
.el-slider__button {
width: 16px;
height: 16px;
border: 2px solid #0ac1c7;
background: #1a2a3a;
}
}
}
}
}
.trigger-config {
margin-bottom: 20px;
h4 {
margin-bottom: 10px;
color: #e0e6ed;
}
::v-deep .el-form-item {
margin-right: 20px;
margin-bottom: 10px;
}
}
.time-strategy {
h4 {
margin-bottom: 10px;
color: #e0e6ed;
}
::v-deep .el-table {
.el-table__header th {
background: #2d3f52;
color: #e0e6ed;
}
.el-table__body td {
background: #1a2a3a;
color: #e0e6ed;
}
}
}
}
}
.effect-preview {
margin-bottom: 20px;
.preview-metrics {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin-bottom: 20px;
.metric-card {
background: rgba(10, 193, 199, 0.1);
border: 1px solid rgba(10, 193, 199, 0.3);
border-radius: 8px;
padding: 15px;
text-align: center;
.metric-value {
font-size: 24px;
font-weight: bold;
color: #0ac1c7;
margin-bottom: 5px;
}
.metric-label {
font-size: 14px;
color: #a0b3c6;
}
}
}
.charts-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
.chart-box {
height: 300px;
background: #1a2a3a;
border-radius: 8px;
padding: 15px;
}
}
}
.action-buttons {
text-align: center;
padding: 20px 0;
.el-button {
margin: 0 10px;
}
}
}
</style>

6
src/views/ai/components/index.js

@ -13,3 +13,9 @@ export { default as LightingReport } from './LightingReport.vue'
// 水泵系统分析报告 // 水泵系统分析报告
export { default as PumpReport } from './PumpReport.vue' export { default as PumpReport } from './PumpReport.vue'
// AI照明节能控制
export { default as LightingAISaving } from './LightingAISaving.vue'
// AI空调节能控制
export { default as AirConditioningAISaving } from './AirConditioningAISaving.vue'

48
src/views/ai/index.vue

@ -166,7 +166,9 @@ import {
ComprehensiveReport, ComprehensiveReport,
AirConditioningReport, AirConditioningReport,
LightingReport, LightingReport,
PumpReport PumpReport,
LightingAISaving,
AirConditioningAISaving
} from "./components"; } from "./components";
export default { export default {
@ -175,7 +177,9 @@ export default {
ComprehensiveReport, ComprehensiveReport,
AirConditioningReport, AirConditioningReport,
LightingReport, LightingReport,
PumpReport PumpReport,
LightingAISaving,
AirConditioningAISaving
}, },
data() { data() {
return { return {
@ -188,7 +192,9 @@ export default {
"生成项目综合分析报告", "生成项目综合分析报告",
"生成空调系统分析报告", "生成空调系统分析报告",
"生成照明系统分析报告", "生成照明系统分析报告",
"生成水泵系统分析报告" "生成水泵系统分析报告",
"AI照明节能策略",
"AI空调节能策略"
], ],
// //
@ -201,14 +207,18 @@ export default {
comprehensive: "ComprehensiveReport", comprehensive: "ComprehensiveReport",
airConditioning: "AirConditioningReport", airConditioning: "AirConditioningReport",
lighting: "LightingReport", lighting: "LightingReport",
pump: "PumpReport" pump: "PumpReport",
lightingAISaving: "LightingAISaving",
airConditioningAISaving: "AirConditioningAISaving"
}, },
reportTitleMap: { reportTitleMap: {
comprehensive: "项目综合分析报告", comprehensive: "项目综合分析报告",
airConditioning: "空调制冷系统分析报告", airConditioning: "空调制冷系统分析报告",
lighting: "照明系统分析报告", lighting: "照明系统分析报告",
pump: "水泵系统分析报告" pump: "水泵系统分析报告",
lightingAISaving: "AI照明节能策略",
airConditioningAISaving: "AI空调节能策略"
}, },
// //
@ -308,7 +318,9 @@ export default {
{ name: "项目综合分析报告", type: "comprehensive" }, { name: "项目综合分析报告", type: "comprehensive" },
{ name: "空调系统分析报告", type: "airConditioning" }, { name: "空调系统分析报告", type: "airConditioning" },
{ name: "照明系统分析报告", type: "lighting" }, { name: "照明系统分析报告", type: "lighting" },
{ name: "水泵系统分析报告", type: "pump" } { name: "水泵系统分析报告", type: "pump" },
{ name: "AI照明节能策略", type: "lightingAISaving" },
{ name: "AI空调节能策略", type: "airConditioningAISaving" }
] ]
}); });
}, },
@ -466,6 +478,26 @@ export default {
} }
}; };
case 'lightingAISaving':
return {
...baseData,
title: "AI照明节能策略",
summary: "基于光环境、人员行为与使用场景数据分析,生成的场景化调光策略,支持办公区、走廊、会议室、车库等不同功能区域的照明节能优化。",
projectInfo: {
description: "AI照明节能策略已配置,包含亮度占比优化、感应触发时长设置和时段策略。"
}
};
case 'airConditioningAISaving':
return {
...baseData,
title: "AI空调节能策略",
summary: "结合冷水机组、水泵、空调末端等设备运行参数,室内外温湿度及CO₂数据,通过AI优化算法输出全局协同调节策略。",
projectInfo: {
description: "AI空调节能策略已配置,包含供水温度、水泵频率、风机转速等参数优化建议。"
}
};
default: default:
return baseData; return baseData;
} }
@ -586,7 +618,9 @@ export default {
comprehensive: ComprehensiveReport, comprehensive: ComprehensiveReport,
airConditioning: AirConditioningReport, airConditioning: AirConditioningReport,
lighting: LightingReport, lighting: LightingReport,
pump: PumpReport pump: PumpReport,
lightingAISaving: "LightingAISaving",
airConditioningAISaving: "AirConditioningAISaving"
}; };
return componentMap[type]; return componentMap[type];
}, },

4
src/views/newCenterairC/energyManage/energyEfficiencyCalendarViz/index.vue

@ -63,9 +63,9 @@
<!-- 日历视图 --> <!-- 日历视图 -->
<div class="calendar-container"> <div class="calendar-container">
<div class="calendar-header"> <!-- <div class="calendar-header">
<div class="weekday" v-for="day in weekDays" :key="day">{{ day }}</div> <div class="weekday" v-for="day in weekDays" :key="day">{{ day }}</div>
</div> </div> -->
<div class="calendar-container"> <div class="calendar-container">
<div class="calendar-header"> <div class="calendar-header">
<div class="weekday" v-for="day in weekDays" :key="day"> <div class="weekday" v-for="day in weekDays" :key="day">

Loading…
Cancel
Save