diff --git a/src/pages/environment/index.vue b/src/pages/environment/index.vue
index 4bc4d40..cc2b553 100644
--- a/src/pages/environment/index.vue
+++ b/src/pages/environment/index.vue
@@ -57,7 +57,7 @@
洁净度
- {{ cleanliness > 0 ? cleanliness + '%' : '-%' }}
+ {{ cleanliness > 0 ? cleanliness + 'μg/m³' : '-μg/m³' }}
@@ -91,11 +91,13 @@
-
-
@@ -426,9 +428,9 @@ export default {
},
// 加载温湿度区间设置
- async loadWsdSettings() {
+ async loadWsdSettings(retryCount = 0, maxRetries = 5) {
try {
- console.log('📊 开始加载温湿度区间设置...')
+ console.log(`📊 开始加载温湿度区间设置... (第${retryCount + 1}次尝试)`)
const response = await wsdApi.getById(1) // 获取ID为1的默认设置
if (response && response.id) {
@@ -450,39 +452,72 @@ export default {
temperature: this.temperatureRange,
humidity: this.humidityRange
})
+ } else {
+ throw new Error('响应数据格式不正确')
}
} catch (error) {
- console.error('❌ 温湿度区间设置加载失败:', error)
- // 使用默认值
- this.temperatureRange = { min: 0, max: 0 }
- this.humidityRange = { min: 0, max: 0 }
- this.tempSettings = { ...this.temperatureRange }
- this.humiditySettings = { ...this.humidityRange }
- console.log('🔄 使用默认温湿度区间设置')
+ console.error(`❌ 温湿度区间设置加载失败 (第${retryCount + 1}次):`, error)
+
+ if (retryCount < maxRetries) {
+ // 计算重试延迟时间,递增延迟
+ const delay = Math.min(1000 * Math.pow(2, retryCount), 10000) // 最大延迟10秒
+ console.log(`🔄 ${delay}ms后进行第${retryCount + 2}次重试...`)
+
+ setTimeout(() => {
+ this.loadWsdSettings(retryCount + 1, maxRetries)
+ }, delay)
+ } else {
+ console.error(`❌ 温湿度区间设置加载失败,已达到最大重试次数(${maxRetries + 1}次)`)
+ // 使用默认值
+ this.temperatureRange = { min: 0, max: 0 }
+ this.humidityRange = { min: 0, max: 0 }
+ this.tempSettings = { ...this.temperatureRange }
+ this.humiditySettings = { ...this.humidityRange }
+ console.log('🔄 使用默认温湿度区间设置')
+ }
}
},
// 获取最新空调温湿度参数
- async getLatestAirConditionerTemperature() {
+ async getLatestAirConditionerTemperature(retryCount = 0, maxRetries = 3) {
try {
+ console.log(`📊 开始获取空调温湿度参数... (第${retryCount + 1}次尝试)`)
const res = await thDataApi.getLatest();
if (res.status === 'success') {
// 从接口获取温度和湿度设定值
this.targetTemperature = res.temperature || 0;
this.targetHumidity = res.humidity || 0;
+ console.log('✅ 空调温湿度参数获取成功:', {
+ targetTemperature: this.targetTemperature,
+ targetHumidity: this.targetHumidity
+ })
+ } else {
+ throw new Error('响应状态不正确')
}
-
} catch (error) {
- console.error('❌ 获取最新空调温湿度参数失败:', error)
- // 接口失败时使用默认值
- this.targetTemperature = 0;
- this.targetHumidity = 0;
+ console.error(`❌ 获取最新空调温湿度参数失败 (第${retryCount + 1}次):`, error)
+
+ if (retryCount < maxRetries) {
+ const delay = 2000 * (retryCount + 1) // 递增延迟: 2s, 4s, 6s
+ console.log(`🔄 ${delay}ms后进行第${retryCount + 2}次重试...`)
+
+ setTimeout(() => {
+ this.getLatestAirConditionerTemperature(retryCount + 1, maxRetries)
+ }, delay)
+ } else {
+ console.error(`❌ 空调温湿度参数获取失败,已达到最大重试次数(${maxRetries + 1}次)`)
+ // 接口失败时使用默认值
+ this.targetTemperature = 0;
+ this.targetHumidity = 0;
+ }
}
},
// 获取最新环境数据(温湿度、PM2.5)
- async getLatestEnvironmentData() {
+ async getLatestEnvironmentData(isRetry = false) {
try {
- console.log('📊 开始获取最新环境数据...')
+ if (!isRetry) {
+ console.log('📊 开始获取最新环境数据...')
+ }
const res = await wsdApi.getLatest();
console.log('📊 接口返回数据:', res)
@@ -529,6 +564,13 @@ export default {
}
} catch (error) {
console.error('❌ 获取环境数据失败:', error)
+ // 如果是首次调用失败,进行重试
+ if (!isRetry) {
+ console.log('🔄 首次获取环境数据失败,2秒后重试...')
+ setTimeout(() => {
+ this.getLatestEnvironmentData(true)
+ }, 2000)
+ }
// 不显示错误提示,避免频繁弹窗
}
},
@@ -650,8 +692,8 @@ export default {
if (temperature !== undefined && temperature !== 0 && this.temperatureRange.min !== 0 && this.temperatureRange.max !== 0) {
if (temperature < this.temperatureRange.min || temperature > this.temperatureRange.max) {
const alert = {
- content: `温度超出范围,${temperature}°C超出控制范围${this.temperatureRange.min}°C-${this.temperatureRange.max}°C`,
- category: "温度报警",
+ content: `当前温度${temperature}°C超出控制范围${this.temperatureRange.min}°C-${this.temperatureRange.max}°C`,
+ category: "温度超出范围",
alertTime: currentTime,
level: "中危",
action: "检查温度",
@@ -666,8 +708,8 @@ export default {
if (humidity !== undefined && humidity !== 0 && this.humidityRange.min !== 0 && this.humidityRange.max !== 0) {
if (humidity < this.humidityRange.min || humidity > this.humidityRange.max) {
const alert = {
- content: `湿度超出范围,${humidity}%超出控制范围${this.humidityRange.min}%-${this.humidityRange.max}%`,
- category: "湿度报警",
+ content: `当前湿度${humidity}%超出控制范围${this.humidityRange.min}%-${this.humidityRange.max}%`,
+ category: "湿度超出范围",
alertTime: currentTime,
level: "中危",
action: "检查湿度",
@@ -679,14 +721,14 @@ export default {
}
// 3. 温度偏差报警:|温湿度计温度 - 空调设定温度| / 空调设定温度 > 30%
- if (temperature !== undefined && this.targetTemperature > 0) {
+ if (temperature !== undefined && temperature !== 0 && this.targetTemperature !== 0) {
const temperatureDiff = Math.abs(temperature - this.targetTemperature)
const deviationPercent = (temperatureDiff / this.targetTemperature) * 100
if (deviationPercent > 30) {
const alert = {
- content: `温度偏差过大,${temperature}°C与设定${this.targetTemperature}°C偏差${deviationPercent.toFixed(1)}%`,
- category: "温度控制异常",
+ content: `当前温度${temperature}°C与设定${this.targetTemperature}°C偏差${deviationPercent.toFixed(1)}%`,
+ category: "温度偏差过大",
alertTime: currentTime,
level: "中危",
action: "调整空调设定温度",
@@ -698,14 +740,14 @@ export default {
}
// 4. 湿度偏差报警:|温湿度计湿度 - 空调设定湿度| / 空调设定湿度 > 30%
- if (humidity !== undefined && this.targetHumidity > 0) {
+ if (humidity !== undefined && humidity !== 0 && this.targetHumidity !== 0) {
const humidityDiff = Math.abs(humidity - this.targetHumidity)
const deviationPercent = (humidityDiff / this.targetHumidity) * 100
if (deviationPercent > 30) {
const alert = {
- content: `湿度偏差过大,${humidity}%与设定${this.targetHumidity}%偏差${deviationPercent.toFixed(1)}%`,
- category: "湿度控制异常",
+ content: `当前湿度${humidity}%与设定${this.targetHumidity}%偏差${deviationPercent.toFixed(1)}%`,
+ category: "湿度偏差过大",
alertTime: currentTime,
level: "中危",
action: "调整空调设定湿度",
@@ -1018,14 +1060,66 @@ export default {
}
},
- // 空调开机控制
- async turnOnAirConditioner() {
- await this.sendAirConditionerControl(1, '开机')
+ // 空调开关切换控制
+ async toggleAirConditioner() {
+ if (this.acStatus === 2) { // 运行中,执行关机
+ await this.sendAirConditionerControl(2, '关机')
+ // 记录关机日志
+ await this.logAirConditionerOperation('关机')
+ } else if (this.acStatus === 0) { // 待机,执行开机
+ await this.sendAirConditionerControl(1, '开机')
+ // 记录开机日志
+ await this.logAirConditionerOperation('开机')
+ }
},
- // 空调关机控制
- async turnOffAirConditioner() {
- await this.sendAirConditionerControl(2, '关机')
+ // 获取空调按钮样式类
+ getAcButtonClass() {
+ if (this.acStatus === 2) { // 运行中
+ return 'power-off'
+ } else if (this.acStatus === 0) { // 待机
+ return 'power-on'
+ } else {
+ return 'power-disabled' // 其他状态(启动中、关机中、连接中)
+ }
+ },
+
+ // 获取空调按钮文字
+ getAcButtonText() {
+ if (this.acStatus === 2) { // 运行中
+ return '关机'
+ } else if (this.acStatus === 0) { // 待机
+ return '开机'
+ } else {
+ return this.acStatusList[this.acStatus] || '连接中'
+ }
+ },
+
+ // 判断是否可以操作空调
+ canOperateAc() {
+ // 只有在待机(0)或运行中(2)状态才可以操作
+ return this.acStatus === 0 || this.acStatus === 2
+ },
+
+ // 记录空调操作日志
+ async logAirConditionerOperation(operation) {
+ try {
+ const currentTime = this.formatDateTime(new Date())
+ const logEvent = {
+ eventType: `空调${operation}`,
+ eventTime: currentTime,
+ status: "已完成",
+ description: `用户手动执行空调${operation}操作`,
+ deviceId: "AC_001"
+ }
+
+ console.log(`📝 记录空调${operation}日志:`, logEvent)
+ // const response = await eventApi.create(logEvent)
+ console.log(`✅ 空调${operation}日志记录成功:`, response)
+ } catch (error) {
+ console.error(`❌ 空调${operation}日志记录失败:`, error)
+ // 日志记录失败不影响主要功能,只记录错误
+ }
},
// 发送空调控制指令
@@ -1549,7 +1643,6 @@ export default {
.ac-power-controls {
display: flex;
justify-content: center;
- gap: 20rpx;
background: #ffffff;
border-radius: 8rpx;
padding: 20rpx;
@@ -1558,8 +1651,7 @@ export default {
}
.ac-power-btn {
- flex: 1;
- max-width: 120rpx;
+ width: 160rpx;
// height: 60rpx;
border-radius: 6rpx;
border: 1rpx solid;
@@ -1590,11 +1682,23 @@ export default {
border-color: #c0392b;
}
+.power-disabled {
+ background: #f39c12;
+ color: white;
+ // border-color: #f39c12;
+}
+
+.power-disabled:active {
+ background: #e67e22;
+ // border-color: #e67e22;
+}
+
.ac-power-btn:disabled {
- background: #bdc3c7;
- color: #7f8c8d;
- border-color: #bdc3c7;
+ background: #bdc3c7 !important;
+ color: #7f8c8d !important;
+ border-color: #bdc3c7 !important;
opacity: 0.6;
+ cursor: not-allowed;
}
.ac-temp-display {