初始化
This commit is contained in:
253
utils/upgrade.js
Normal file
253
utils/upgrade.js
Normal file
@@ -0,0 +1,253 @@
|
||||
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());
|
||||
Reference in New Issue
Block a user