Files
Wx_BLWConfigTools_V02_Prod/utils/upgrade.js
2025-12-11 09:50:02 +08:00

254 lines
5.8 KiB
JavaScript
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.
import {
GetRoomTypeNode,
GetRoomType,
WebChatUpgrade,
QueryUpdateHostStatus,
ForwardQueryUpdateHostProgressBar
} from '../lib/RequestingCenter.js'
import { EventEmitter } from './eventEmitter.js'
export default class DeviceUpgrader extends EventEmitter {
constructor() {
super();
this.isUpgrading = false;
this.currentUpgrade = null;
this.pollTimer = null;
this.startTime = null;
}
/**
* 开始升级
* @param {'firmware'|'config'} type 升级类型
* @param {Object} params 升级参数
* @param {string} params.roomTypeID 房型ID
* @param {string[]} params.hostidLists 主机ID列表
* @param {string} [params.upgradefileName] 升级文件名
* @param {string} [params.hotelid] 酒店ID固件升级需要
* @returns {Promise}
*/
startUpgrade(type, params) {
if (this.isUpgrading) {
return Promise.reject(new Error('已有升级任务进行中'));
}
return new Promise((resolve, reject) => {
this.isUpgrading = true;
this.startTime = Date.now();
const timeout = type === 'firmware' ? 10 * 60 * 1000 : 3 * 60 * 1000;
// 升级任务信息
this.currentUpgrade = {
type,
params,
resolve,
reject,
timeout,
cancelled: false
};
// 发起升级请求
this._requestUpgrade()
.then(() => {
// 开始轮询进度
this._startPolling();
})
.catch(err => {
this._cleanup();
reject(err);
});
// 超时处理
setTimeout(() => {
if (this.isUpgrading) {
this._handleTimeout();
}
}, timeout);
});
}
/**
* 取消升级
*/
cancelUpgrade() {
if (!this.isUpgrading || !this.currentUpgrade) return;
this.currentUpgrade.cancelled = true;
this._cleanup();
this.currentUpgrade.reject(new Error('升级已取消'));
}
/**
* 获取是否正在升级
*/
getIsUpgrading() {
return this.isUpgrading;
}
/**
* 请求升级接口
*/
async _requestUpgrade() {
const roomTypeID=this.currentUpgrade.params.roomTypeID
const hostidLists = this.currentUpgrade.params.hostidLists
const upgradefileName = this.currentUpgrade.params.upgradefileName
const res = await WebChatUpgrade({
roomTypeID:roomTypeID,
hostidLists:hostidLists,
upgradefileName:upgradefileName
})
if (res.IsSuccess) {
}else{
throw new Error(res.data.message || '升级请求失败');
}
}
/**
* 开始轮询进度
*/
_startPolling() {
this._polling = true;
this.pollTimer = setInterval(() => {
if (!this._polling) return;
this._queryProgress()
.then(progress => {
this.emit('progress', progress +"%")
// 进度100%表示完成
if (progress >= 100) {
this._polling = false; // ③ 关闭标记\
if (this.currentUpgrade) {
this.currentUpgrade.resolve({ success: true, progress: '100%' });
}
this._cleanup();
//this.currentUpgrade.resolve({ success: true, progress: 100 });
return;
}
})
.catch(err => {
this._polling = false; // ③ 关闭标记
this.emit('error', err)
console.log(err)
this._cleanup();
this.currentUpgrade.reject(err);
});
}, 1000);
}
/**
* 查询进度
*/
async _queryProgress() {
const { type, params, upgradefileName} = this.currentUpgrade;
let url, data;
let res;
if (type === 'firmware') {
res= await ForwardQueryUpdateHostProgressBar({
hostIDList:params.hostidLists
})
} else {
res= await QueryUpdateHostStatus({
hotelid:params.hotelid,
roomTypeID:params.roomTypeID
})
}
console.log(res)
if (type === 'firmware'){
if (res.IsSuccess) {
if (Array.isArray(res.Response) && res.Response.length > 0) {
console.log(res.Response[0].BaiFenBi)
if (res.Response[0].BaiFenBi===""){
return 0;
}
return res.Response[0].BaiFenBi.replace('%', '') ;
}else{
return 0;
}
}
else{
throw new Error('查询进度失败');
}
}else{
if (res.total ==1) {
var getnode
if (res.rows.length>0) {
getnode=res.rows[0]
let bufarry = params.upgradefileName.split("_")
let Version =bufarry[0]+ ".0.0"
if (getnode.ConfigVersion==Version) {
return 100;
} else{
return 0;
}
}else
{
return 0;
}
}
else{
throw new Error('查询进度失败');
}
}
}
/**
* 处理超时
*/
_handleTimeout() {
this._cleanup();
this.currentUpgrade.reject(new Error('升级超时'));
}
/**
* 清理资源
*/
_cleanup() {
this.isUpgrading = false;
if (this.pollTimer) {
clearInterval(this.pollTimer);
this.pollTimer = null;
}
this.startTime = null;
this.currentUpgrade = null;
}
}
// // 使用示例
// const upgrader = new DeviceUpgrader();
// // 开始固件升级
// upgrader.startUpgrade('firmware', {
// roomTypeID: '123',
// hostidLists: ['host1', 'host2'],
// upgradefileName: 'v2.0.bin',
// hotelid: 'hotel123'
// })
// .then(result => {
// console.log('升级成功', result);
// })
// .catch(err => {
// console.error('升级失败', err);
// });
// // 取消升级
// // upgrader.cancelUpgrade();
// // 查询是否升级中
// console.log('是否升级中:', upgrader.getIsUpgrading());