初始化

This commit is contained in:
2025-12-11 09:50:02 +08:00
commit c25e282398
127 changed files with 63158 additions and 0 deletions

23946
utils/ecGBKToUnicode.js Normal file

File diff suppressed because it is too large Load Diff

24075
utils/ecUnicodeToGBK.js Normal file

File diff suppressed because it is too large Load Diff

18
utils/eventEmitter.js Normal file
View File

@@ -0,0 +1,18 @@
export class EventEmitter {
constructor() {
this._events = Object.create(null)
}
on(type, fn) {
(this._events[type] || (this._events[type] = [])).push(fn)
}
emit(type, ...args) {
(this._events[type] || []).forEach(fn => fn(...args))
}
off(type, fn) {
if (!fn) this._events[type] = []
else {
const idx = (this._events[type] || []).indexOf(fn)
if (idx > -1) this._events[type].splice(idx, 1)
}
}
}

30
utils/filters.wxs Normal file
View File

@@ -0,0 +1,30 @@
function formatTime(date) {
var year = date.getFullYear()
var month = date.getMonth() + 1
var day = date.getDate()
var hour = date.getHours()
var minute = date.getMinutes()
var second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
function formatNumber(n) {
n = n.toString()
return n[1] ? n : '0' + n
}
module.exports = {
/**
* 日期格式化
* @param formatTime
* @returns {string}
*/
TimeFormat: function(formatTimestr) {
var str = parseFloat(formatTimestr.replace("/Date(", "").replace(")/", ""));
//转化为时间类型
var obj = (getDate(str));
console.log(obj)
// return obj;
return formatTime(obj);
}
}

2
utils/md5.min.js vendored Normal file
View File

@@ -0,0 +1,2 @@
!function(n){"use strict";function t(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function r(n,t){return n<<t|n>>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<<r%32,n[14+(r+64>>>9<<4)]=r;var e,i,a,d,h,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e<n.length;e+=16)i=l,a=g,d=v,h=m,g=f(g=f(g=f(g=f(g=c(g=c(g=c(g=c(g=u(g=u(g=u(g=u(g=o(g=o(g=o(g=o(g,v=o(v,m=o(m,l=o(l,g,v,m,n[e],7,-680876936),g,v,n[e+1],12,-389564586),l,g,n[e+2],17,606105819),m,l,n[e+3],22,-1044525330),v=o(v,m=o(m,l=o(l,g,v,m,n[e+4],7,-176418897),g,v,n[e+5],12,1200080426),l,g,n[e+6],17,-1473231341),m,l,n[e+7],22,-45705983),v=o(v,m=o(m,l=o(l,g,v,m,n[e+8],7,1770035416),g,v,n[e+9],12,-1958414417),l,g,n[e+10],17,-42063),m,l,n[e+11],22,-1990404162),v=o(v,m=o(m,l=o(l,g,v,m,n[e+12],7,1804603682),g,v,n[e+13],12,-40341101),l,g,n[e+14],17,-1502002290),m,l,n[e+15],22,1236535329),v=u(v,m=u(m,l=u(l,g,v,m,n[e+1],5,-165796510),g,v,n[e+6],9,-1069501632),l,g,n[e+11],14,643717713),m,l,n[e],20,-373897302),v=u(v,m=u(m,l=u(l,g,v,m,n[e+5],5,-701558691),g,v,n[e+10],9,38016083),l,g,n[e+15],14,-660478335),m,l,n[e+4],20,-405537848),v=u(v,m=u(m,l=u(l,g,v,m,n[e+9],5,568446438),g,v,n[e+14],9,-1019803690),l,g,n[e+3],14,-187363961),m,l,n[e+8],20,1163531501),v=u(v,m=u(m,l=u(l,g,v,m,n[e+13],5,-1444681467),g,v,n[e+2],9,-51403784),l,g,n[e+7],14,1735328473),m,l,n[e+12],20,-1926607734),v=c(v,m=c(m,l=c(l,g,v,m,n[e+5],4,-378558),g,v,n[e+8],11,-2022574463),l,g,n[e+11],16,1839030562),m,l,n[e+14],23,-35309556),v=c(v,m=c(m,l=c(l,g,v,m,n[e+1],4,-1530992060),g,v,n[e+4],11,1272893353),l,g,n[e+7],16,-155497632),m,l,n[e+10],23,-1094730640),v=c(v,m=c(m,l=c(l,g,v,m,n[e+13],4,681279174),g,v,n[e],11,-358537222),l,g,n[e+3],16,-722521979),m,l,n[e+6],23,76029189),v=c(v,m=c(m,l=c(l,g,v,m,n[e+9],4,-640364487),g,v,n[e+12],11,-421815835),l,g,n[e+15],16,530742520),m,l,n[e+2],23,-995338651),v=f(v,m=f(m,l=f(l,g,v,m,n[e],6,-198630844),g,v,n[e+7],10,1126891415),l,g,n[e+14],15,-1416354905),m,l,n[e+5],21,-57434055),v=f(v,m=f(m,l=f(l,g,v,m,n[e+12],6,1700485571),g,v,n[e+3],10,-1894986606),l,g,n[e+10],15,-1051523),m,l,n[e+1],21,-2054922799),v=f(v,m=f(m,l=f(l,g,v,m,n[e+8],6,1873313359),g,v,n[e+15],10,-30611744),l,g,n[e+6],15,-1560198380),m,l,n[e+13],21,1309151649),v=f(v,m=f(m,l=f(l,g,v,m,n[e+4],6,-145523070),g,v,n[e+11],10,-1120210379),l,g,n[e+2],15,718787259),m,l,n[e+9],21,-343485551),l=t(l,i),g=t(g,a),v=t(v,d),m=t(m,h);return[l,g,v,m]}function a(n){var t,r="",e=32*n.length;for(t=0;t<e;t+=8)r+=String.fromCharCode(n[t>>5]>>>t%32&255);return r}function d(n){var t,r=[];for(r[(n.length>>2)-1]=void 0,t=0;t<r.length;t+=1)r[t]=0;var e=8*n.length;for(t=0;t<e;t+=8)r[t>>5]|=(255&n.charCodeAt(t/8))<<t%32;return r}function h(n){return a(i(d(n),8*n.length))}function l(n,t){var r,e,o=d(n),u=[],c=[];for(u[15]=c[15]=void 0,o.length>16&&(o=i(o,8*n.length)),r=0;r<16;r+=1)u[r]=909522486^o[r],c[r]=1549556828^o[r];return e=i(u.concat(d(t)),512+8*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e="";for(r=0;r<n.length;r+=1)t=n.charCodeAt(r),e+="0123456789abcdef".charAt(t>>>4&15)+"0123456789abcdef".charAt(15&t);return e}function v(n){return unescape(encodeURIComponent(n))}function m(n){return h(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}"function"==typeof define&&define.amd?define(function(){return A}):"object"==typeof module&&module.exports?module.exports=A:n.md5=A}(this);
//# sourceMappingURL=md5.min.js.map

253
utils/upgrade.js Normal file
View 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());

59
utils/util.js Normal file
View File

@@ -0,0 +1,59 @@
const formatTime = date => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
const formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
const getCurrentMonthFirst = date =>{
date.setDate(1);
let month = parseInt(date.getMonth()+1);
let day = date.getDate();
if (month < 10) {
month = '0' + month
}
if (day < 10) {
day = '0' + day
}
return date.getFullYear() + '-' + month + '-' + day;
}
const getCurrentMonthLast = function (date = null){
if(date==null) {
date = new Date();
}
let currentMonth=date.getMonth();
let nextMonth=++currentMonth;
let nextMonthFirstDay=new Date(date.getFullYear(),nextMonth,1);
let oneDay=1000*60*60*24;
let lastTime = new Date(nextMonthFirstDay-oneDay);
let month = parseInt(lastTime.getMonth()+1);
let day = lastTime.getDate();
if (month < 10) {
month = '0' + month
}
if (day < 10) {
day = '0' + day
}
console.log(date.getFullYear() + '-' + month + '-' + day)
return date.getFullYear() + '-' + month + '-' + day;
}
module.exports = {
formatTime: formatTime,
getCurrentMonthFirst:getCurrentMonthFirst,
getCurrentMonthLast:getCurrentMonthLast
}

41
utils/watch.js Normal file
View File

@@ -0,0 +1,41 @@
// watch.js
const observe = (obj, key, watchFun, deep, page) => {
let oldVal = obj[key]
// 如果监听对象是object类型并且指定deep深度监听
if (oldVal !== null && typeof oldVal === 'object' && deep) {
// 递归子集依次执行observe()
Object.keys(oldVal).forEach(item => {
observe(oldVal, item, watchFun, deep, page)
})
}
// 使用Object.defineProperty()劫持数据的写操作在监听对象改变后执行传入的watchFun
Object.defineProperty(obj, key, {
configurable: true,
enumerable: true,
set(value) {
if (value === oldVal) return
watchFun.call(page, value, oldVal)
oldVal = value
},
get() {
return oldVal
}
})
}
export const setWatcher = (page) => {
// 页面里的data字段
const data = page.data
// 页面里的watch字段
const watch = page.watch
// 对watch里列举的每一个字段需要监听的字段执行observe()
Object.keys(watch).forEach(key => {
let targetData = data
const targetKey = key
// 支持deep深度监听使用deep时需要配合handler使用否则直接编写函数
const watchFun = watch[key].handler || watch[key]
const deep = watch[key].deep
observe(targetData, targetKey, watchFun, deep, page)
})
}