fix:空调开关机日志、温湿度报警
This commit is contained in:
@ -57,7 +57,7 @@
|
|||||||
<text class="detail-label">洁净度</text>
|
<text class="detail-label">洁净度</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="detail-value-container">
|
<view class="detail-value-container">
|
||||||
<text class="detail-value">{{ cleanliness > 0 ? cleanliness + '%' : '-%' }}</text>
|
<text class="detail-value">{{ cleanliness > 0 ? cleanliness + 'μg/m³' : '-μg/m³' }}</text>
|
||||||
<view class="detail-status" :class="cleanliness > 0 ? 'active' : 'inactive'"></view>
|
<view class="detail-status" :class="cleanliness > 0 ? 'active' : 'inactive'"></view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@ -91,11 +91,13 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="ac-power-controls">
|
<view class="ac-power-controls">
|
||||||
<button class="ac-power-btn power-on" @click="turnOnAirConditioner" :disabled="acControlLoading">
|
<button
|
||||||
开机
|
class="ac-power-btn"
|
||||||
</button>
|
:class="getAcButtonClass()"
|
||||||
<button class="ac-power-btn power-off" @click="turnOffAirConditioner" :disabled="acControlLoading">
|
@click="toggleAirConditioner"
|
||||||
关机
|
:disabled="!canOperateAc() || acControlLoading"
|
||||||
|
>
|
||||||
|
{{ getAcButtonText() }}
|
||||||
</button>
|
</button>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@ -426,9 +428,9 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// 加载温湿度区间设置
|
// 加载温湿度区间设置
|
||||||
async loadWsdSettings() {
|
async loadWsdSettings(retryCount = 0, maxRetries = 5) {
|
||||||
try {
|
try {
|
||||||
console.log('📊 开始加载温湿度区间设置...')
|
console.log(`📊 开始加载温湿度区间设置... (第${retryCount + 1}次尝试)`)
|
||||||
const response = await wsdApi.getById(1) // 获取ID为1的默认设置
|
const response = await wsdApi.getById(1) // 获取ID为1的默认设置
|
||||||
|
|
||||||
if (response && response.id) {
|
if (response && response.id) {
|
||||||
@ -450,39 +452,72 @@ export default {
|
|||||||
temperature: this.temperatureRange,
|
temperature: this.temperatureRange,
|
||||||
humidity: this.humidityRange
|
humidity: this.humidityRange
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
throw new Error('响应数据格式不正确')
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('❌ 温湿度区间设置加载失败:', error)
|
console.error(`❌ 温湿度区间设置加载失败 (第${retryCount + 1}次):`, error)
|
||||||
// 使用默认值
|
|
||||||
this.temperatureRange = { min: 0, max: 0 }
|
if (retryCount < maxRetries) {
|
||||||
this.humidityRange = { min: 0, max: 0 }
|
// 计算重试延迟时间,递增延迟
|
||||||
this.tempSettings = { ...this.temperatureRange }
|
const delay = Math.min(1000 * Math.pow(2, retryCount), 10000) // 最大延迟10秒
|
||||||
this.humiditySettings = { ...this.humidityRange }
|
console.log(`🔄 ${delay}ms后进行第${retryCount + 2}次重试...`)
|
||||||
console.log('🔄 使用默认温湿度区间设置')
|
|
||||||
|
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 {
|
try {
|
||||||
|
console.log(`📊 开始获取空调温湿度参数... (第${retryCount + 1}次尝试)`)
|
||||||
const res = await thDataApi.getLatest();
|
const res = await thDataApi.getLatest();
|
||||||
if (res.status === 'success') {
|
if (res.status === 'success') {
|
||||||
// 从接口获取温度和湿度设定值
|
// 从接口获取温度和湿度设定值
|
||||||
this.targetTemperature = res.temperature || 0;
|
this.targetTemperature = res.temperature || 0;
|
||||||
this.targetHumidity = res.humidity || 0;
|
this.targetHumidity = res.humidity || 0;
|
||||||
|
console.log('✅ 空调温湿度参数获取成功:', {
|
||||||
|
targetTemperature: this.targetTemperature,
|
||||||
|
targetHumidity: this.targetHumidity
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
throw new Error('响应状态不正确')
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('❌ 获取最新空调温湿度参数失败:', error)
|
console.error(`❌ 获取最新空调温湿度参数失败 (第${retryCount + 1}次):`, error)
|
||||||
// 接口失败时使用默认值
|
|
||||||
this.targetTemperature = 0;
|
if (retryCount < maxRetries) {
|
||||||
this.targetHumidity = 0;
|
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)
|
// 获取最新环境数据(温湿度、PM2.5)
|
||||||
async getLatestEnvironmentData() {
|
async getLatestEnvironmentData(isRetry = false) {
|
||||||
try {
|
try {
|
||||||
console.log('📊 开始获取最新环境数据...')
|
if (!isRetry) {
|
||||||
|
console.log('📊 开始获取最新环境数据...')
|
||||||
|
}
|
||||||
const res = await wsdApi.getLatest();
|
const res = await wsdApi.getLatest();
|
||||||
console.log('📊 接口返回数据:', res)
|
console.log('📊 接口返回数据:', res)
|
||||||
|
|
||||||
@ -529,6 +564,13 @@ export default {
|
|||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('❌ 获取环境数据失败:', 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 !== undefined && temperature !== 0 && this.temperatureRange.min !== 0 && this.temperatureRange.max !== 0) {
|
||||||
if (temperature < this.temperatureRange.min || temperature > this.temperatureRange.max) {
|
if (temperature < this.temperatureRange.min || temperature > this.temperatureRange.max) {
|
||||||
const alert = {
|
const alert = {
|
||||||
content: `温度超出范围,${temperature}°C超出控制范围${this.temperatureRange.min}°C-${this.temperatureRange.max}°C`,
|
content: `当前温度${temperature}°C超出控制范围${this.temperatureRange.min}°C-${this.temperatureRange.max}°C`,
|
||||||
category: "温度报警",
|
category: "温度超出范围",
|
||||||
alertTime: currentTime,
|
alertTime: currentTime,
|
||||||
level: "中危",
|
level: "中危",
|
||||||
action: "检查温度",
|
action: "检查温度",
|
||||||
@ -666,8 +708,8 @@ export default {
|
|||||||
if (humidity !== undefined && humidity !== 0 && this.humidityRange.min !== 0 && this.humidityRange.max !== 0) {
|
if (humidity !== undefined && humidity !== 0 && this.humidityRange.min !== 0 && this.humidityRange.max !== 0) {
|
||||||
if (humidity < this.humidityRange.min || humidity > this.humidityRange.max) {
|
if (humidity < this.humidityRange.min || humidity > this.humidityRange.max) {
|
||||||
const alert = {
|
const alert = {
|
||||||
content: `湿度超出范围,${humidity}%超出控制范围${this.humidityRange.min}%-${this.humidityRange.max}%`,
|
content: `当前湿度${humidity}%超出控制范围${this.humidityRange.min}%-${this.humidityRange.max}%`,
|
||||||
category: "湿度报警",
|
category: "湿度超出范围",
|
||||||
alertTime: currentTime,
|
alertTime: currentTime,
|
||||||
level: "中危",
|
level: "中危",
|
||||||
action: "检查湿度",
|
action: "检查湿度",
|
||||||
@ -679,14 +721,14 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3. 温度偏差报警:|温湿度计温度 - 空调设定温度| / 空调设定温度 > 30%
|
// 3. 温度偏差报警:|温湿度计温度 - 空调设定温度| / 空调设定温度 > 30%
|
||||||
if (temperature !== undefined && this.targetTemperature > 0) {
|
if (temperature !== undefined && temperature !== 0 && this.targetTemperature !== 0) {
|
||||||
const temperatureDiff = Math.abs(temperature - this.targetTemperature)
|
const temperatureDiff = Math.abs(temperature - this.targetTemperature)
|
||||||
const deviationPercent = (temperatureDiff / this.targetTemperature) * 100
|
const deviationPercent = (temperatureDiff / this.targetTemperature) * 100
|
||||||
|
|
||||||
if (deviationPercent > 30) {
|
if (deviationPercent > 30) {
|
||||||
const alert = {
|
const alert = {
|
||||||
content: `温度偏差过大,${temperature}°C与设定${this.targetTemperature}°C偏差${deviationPercent.toFixed(1)}%`,
|
content: `当前温度${temperature}°C与设定${this.targetTemperature}°C偏差${deviationPercent.toFixed(1)}%`,
|
||||||
category: "温度控制异常",
|
category: "温度偏差过大",
|
||||||
alertTime: currentTime,
|
alertTime: currentTime,
|
||||||
level: "中危",
|
level: "中危",
|
||||||
action: "调整空调设定温度",
|
action: "调整空调设定温度",
|
||||||
@ -698,14 +740,14 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 4. 湿度偏差报警:|温湿度计湿度 - 空调设定湿度| / 空调设定湿度 > 30%
|
// 4. 湿度偏差报警:|温湿度计湿度 - 空调设定湿度| / 空调设定湿度 > 30%
|
||||||
if (humidity !== undefined && this.targetHumidity > 0) {
|
if (humidity !== undefined && humidity !== 0 && this.targetHumidity !== 0) {
|
||||||
const humidityDiff = Math.abs(humidity - this.targetHumidity)
|
const humidityDiff = Math.abs(humidity - this.targetHumidity)
|
||||||
const deviationPercent = (humidityDiff / this.targetHumidity) * 100
|
const deviationPercent = (humidityDiff / this.targetHumidity) * 100
|
||||||
|
|
||||||
if (deviationPercent > 30) {
|
if (deviationPercent > 30) {
|
||||||
const alert = {
|
const alert = {
|
||||||
content: `湿度偏差过大,${humidity}%与设定${this.targetHumidity}%偏差${deviationPercent.toFixed(1)}%`,
|
content: `当前湿度${humidity}%与设定${this.targetHumidity}%偏差${deviationPercent.toFixed(1)}%`,
|
||||||
category: "湿度控制异常",
|
category: "湿度偏差过大",
|
||||||
alertTime: currentTime,
|
alertTime: currentTime,
|
||||||
level: "中危",
|
level: "中危",
|
||||||
action: "调整空调设定湿度",
|
action: "调整空调设定湿度",
|
||||||
@ -1018,14 +1060,66 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 空调开机控制
|
// 空调开关切换控制
|
||||||
async turnOnAirConditioner() {
|
async toggleAirConditioner() {
|
||||||
await this.sendAirConditionerControl(1, '开机')
|
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() {
|
getAcButtonClass() {
|
||||||
await this.sendAirConditionerControl(2, '关机')
|
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 {
|
.ac-power-controls {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 20rpx;
|
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
border-radius: 8rpx;
|
border-radius: 8rpx;
|
||||||
padding: 20rpx;
|
padding: 20rpx;
|
||||||
@ -1558,8 +1651,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ac-power-btn {
|
.ac-power-btn {
|
||||||
flex: 1;
|
width: 160rpx;
|
||||||
max-width: 120rpx;
|
|
||||||
// height: 60rpx;
|
// height: 60rpx;
|
||||||
border-radius: 6rpx;
|
border-radius: 6rpx;
|
||||||
border: 1rpx solid;
|
border: 1rpx solid;
|
||||||
@ -1590,11 +1682,23 @@ export default {
|
|||||||
border-color: #c0392b;
|
border-color: #c0392b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.power-disabled {
|
||||||
|
background: #f39c12;
|
||||||
|
color: white;
|
||||||
|
// border-color: #f39c12;
|
||||||
|
}
|
||||||
|
|
||||||
|
.power-disabled:active {
|
||||||
|
background: #e67e22;
|
||||||
|
// border-color: #e67e22;
|
||||||
|
}
|
||||||
|
|
||||||
.ac-power-btn:disabled {
|
.ac-power-btn:disabled {
|
||||||
background: #bdc3c7;
|
background: #bdc3c7 !important;
|
||||||
color: #7f8c8d;
|
color: #7f8c8d !important;
|
||||||
border-color: #bdc3c7;
|
border-color: #bdc3c7 !important;
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ac-temp-display {
|
.ac-temp-display {
|
||||||
|
|||||||
Reference in New Issue
Block a user