254 lines
5.8 KiB
JavaScript
254 lines
5.8 KiB
JavaScript
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());
|