Files
2025-12-11 09:50:02 +08:00

948 lines
23 KiB
JavaScript
Raw Permalink 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.
// pages/basics/MakingRounds/MakingRounds.js
const app = getApp()
//const upgrade = require('../../../utils/upgrade.js')
import {
GetHostsInfo,
GetMAC,
GetFaceSN,
ErrorInfo,
CheckFaceSN,
OpenDoorTest,
GetRoomType,
GetRoomTypeAndModalsListLog,
WebChatUpgrade,
QueryUpdateHostStatus,
ForwardQueryUpdateHostProgressBar,
GetRoomTypeNode,
SetRCULight,
SetRCUAir,
SetRCUCurtain,
} from '../../../lib/RequestingCenter.js'
import DeviceUpgrader from '../../../utils/upgrade.js';
// const DeviceUpgrader = require('../../../utils/upgrade.js');
const upgrader = new DeviceUpgrader();
Page({
/**
* 页面的初始数据
*/
data: {
TabCur:1,
RoomIndex:0,
//权限信息
autho: null,
//酒店信息
Hotelinfo: null,
HostsData:null,
HostsDataFilters:[],
isback:null,
HotelId:null,
statusdata:null,
onlineNumber:0,
inputValue:"",
toView:"",
scrollHeight: 0,
RoomtypeNamearray: [],
Completed:false, //是否处于升级状态
RoomtypeName: "",
devlist:[],
Roomtypeinfo:[],
Pfilename:"",
Gfilename:"",
Upgradenode:[],
myArray:[],
CurrentUpgradeDev:'', //当前升级设备
CurrentUpgradeDevStart:'',//当前升级设备状态
UpgradeAllCount:0,
//MAC绑定相关
selHosts: null,
code: null,
modal: 0,
input: 0,
bdHosts: [],
address: "",
},
/**
* 生命周期函数--监听页面加载
*/
onLoad:async function(options) {
if (!options.HotelId ) {
app.toast(2, "无酒店信息~")
return;
}
this.setData({
autho: app.globalData.autho
})
try {
this.data.autho.forEach((element, index) => {
element.Hotels.forEach((elements, indexs) => {
if (elements.HotelId == options.HotelId) {
this.setData({
Hotelinfo: elements
})
throw new Error();
}
})
});
} catch (error) {
console.log("已经找到,无需循环~")
}
let that = this
await GetHostsInfo({
HotelID: this.data.Hotelinfo.HotelId
}).then(res => {
if (res.Status == 200) {
let onlineNumber=0
for (let index = 0; index < res.Data.length; index++) {
const element = res.Data[index];
if (element.Status===1) {
onlineNumber=onlineNumber+1
}
}
that.setData({
onlineNumber:onlineNumber,
HostsData: res.Data,
HostsDataFilters: res.Data,
isback: (app.globalData.autho.length > 1 || app.globalData.autho[0].Hotels.length > 1),
HotelId: options.HotelId,
statusdata: [0, 0, 0, res.Data.length]
})
console.log(this.data.HostsDataFilters)
} else {
app.toast(2, res.Message || "网络繁忙")
}
}, err => {
console.log(err)
app.toast(2, "网络繁忙")
}).catch(err => {
console.log(err)
app.toast(2, "网络繁忙")
});
app.globalData.HotelId=options.HotelId
await GetRoomType({
HotelID: options.HotelId
}).then(res => {
app.SetroontypeListindex(res)
this.setData({
myArray:app.globalData.roomIDName ,
RoomtypeNamearray:app.globalData.roomName
})
}, err => {
console.log('GetRoomType error')
}).catch(err => {
});
upgrader.on('progress', p => {
console.log(p)
this.setData({ CurrentUpgradeDevStart: p }) // 实时刷新 UI
})
upgrader.on('error', e => {
wx.showToast({ title: '升级失败', icon: 'none' })
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
this.calcScrollHeight();
},
calcScrollHeight() {
// 1. 拿到屏幕可用高度px
const sys = wx.getSystemInfoSync();
const screenHeight = sys.windowHeight; // px
// 2. 拿到 scroll-view 的 toppx
wx.createSelectorQuery()
.in(this)
.select('#myScroll')
.boundingClientRect(rect => {
if (rect) {
const topPx = rect.top; // px
const bottomPx = 10 / 2; // 10rpx → 5px2倍屏
const heightPx = screenHeight - topPx - bottomPx;
// 3. 转 rpx 并写入
this.setData({
scrollHeight: heightPx * 2 // px→rpx
});
}
})
.exec();
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
upgrader.cancelUpgrade()
upgrader._cleanup()
},
//MAC绑定相关方法
//检查MAC地址合法性
CheckMAC: function (vlues) {
return (vlues.indexOf("34D0B8") == 0 && vlues.length == 12 && vlues.indexOf(" ") < 0);
},
//扫码获取MAC地址
GetCode: async function () {
var that = this;
setTimeout(function () {
that.GetHide()
}, 100);
wx.scanCode({
onlyFromCamera: true,
success(res) {
that.setData({
code: res.result
})
that.GetMACOK();
},
fail(err) {
app.toast(2, "未识别到有效条形码")
}
})
},
//隐藏弹窗
GetHide() {
this.setData({
modal: 0,
input: 0,
})
},
//房间点击事件 - 扫码绑定
/**
* 获取主机MAC地址
* @async
* @function GetMAC
* @param {Object} e - 事件对象
* @param {number} e.currentTarget.dataset.index - 当前选中主机的索引
* @description 根据选中主机的索引获取MAC地址如果MAC地址不存在则调用GetCode方法
* @returns {Promise<void>}
*/
GetMAC: async function (e) {
let index = e.currentTarget.dataset['index'];
let selHosts = this.data.HostsDataFilters[index];
selHosts.index = index;
this.setData({
selHosts: selHosts,
input: 0
})
if (this.data.HostsDataFilters[index].MAC != "" && this.data.HostsDataFilters[index].MAC != null) {
this.setData({
modal: 1,
message: [this.data.HostsDataFilters[index].MAC, selHosts.RoomNumber]
})
} else {
this.GetCode()
}
},
//长按房间事件 - 手动输入MAC
GetMAC_long: function (e) {
let indexstr = e.currentTarget.id.replace("msg-","")
let index= Number(indexstr)
let selHosts = this.data.HostsDataFilters[index];
selHosts.index = index;
this.setData({
selHosts: selHosts,
input: 100
})
if (this.data.HostsDataFilters[index].MAC != "" && this.data.HostsDataFilters[index].MAC != null) {
this.setData({
modal: 1,
message: [selHosts.RoomNumber, this.data.HostsDataFilters[index].MAC]
})
} else {
this.ShowInput();
}
},
//显示手动输入MAC弹窗
ShowInput: function (params) {
this.setData({
modal: 1000,
code: ""
})
},
//验证手动输入的MAC地址
GetMACOK: function () {
let that = this;
if (!this.CheckMAC(that.data.code)) {
this.setData({
modal: 520
})
return;
}
this.setData({
modal: 521
})
},
//解绑MAC地址
Jb: async function(params) {
let index = params.currentTarget.dataset['index'];
let jbjd = this.data.bdHosts[index];
let that = this;
await GetMAC({
roomNumber: jbjd.RoomNumber,
roomID: jbjd.Id,
HotelID: jbjd.HotelID,
MAC: "",
NoCheck: false,
loc: that.data.address
}).then(
res => {
if (res.Status == 1000) {
app.toast(2, "无权限")
}
if (res.Status == 200) {
app.toast(1, "解绑成功")
var databdHosts = that.data.bdHosts;
databdHosts.splice(index, 1);
that.setData({
bdHosts: databdHosts
})
if (jbjd.HotelID != that.data.HotelId) {
return;
}
let data = that.data.HostsData;
let OLD = -1;
try {
data.forEach(
(x, INDEX) => {
if (x.RoomNumber === jbjd.RoomNumber) {
OLD = INDEX;
throw new Error();
}
}
)
} catch (error) {
}
if (OLD >= 0) {
data[OLD].MAC = "";
}
let res = that.GetFilters(that.data.sel, data);
that.setData({
HostsData: data,
HostsDataFilters: res[0],
statusdata: res[1]
})
} else {
app.toast(2, "解绑失败")
}
},
err => {
app.toast(2, "网络繁忙")
}
).catch(err => {
app.toast(2, "网络繁忙")
});
},
//最终绑定MAC地址
GetMacOKend: async function (type) {
let that = this;
if (type != true && type != false) {
type = type.currentTarget.dataset['type']
}
this.GetHide();
let xg = null;
await GetMAC({
roomNumber: that.data.selHosts.RoomNumber,
HotelID: that.data.selHosts.HotelID,
MAC: that.data.code,
NoCheck: type,
loc: that.data.address
}).then(
res => {
if (res.Status == 1000) {
xg = 100;
app.toast(2, "无权限")
}
if (res.Status == 200) {
xg = 0;
app.toast(1, "绑定成功")
//更新本地数据
let data = that.data.HostsData;
let OLD = -1;
try {
data.forEach(
(x, INDEX) => {
if (x.RoomNumber === that.data.selHosts.RoomNumber) {
OLD = INDEX;
throw new Error();
}
}
)
} catch (error) {
}
if (OLD >= 0) {
data[OLD].MAC = that.data.code;
}
that.setData({
HostsData: data,
HostsDataFilters: data
})
} else {
if (!type) {
xg = 1;
app.toast(2, "绑定失败")
} else {
try {
if (res.Status == 100) {
xg = 100;
let modal = 3;
let mesg = [that.data.code];
let bdHosts = res.Data.Hosts;
try {
that.data.autho.forEach((element, index) => {
element.Hotels.forEach((elements, indexs) => {
for (let index = 0; index < res.Data.Hosts.length; index++) {
if (elements.HotelId == res.Data.Hosts[index].HotelID) {
elements.Auth.forEach(Auth => {
if (Auth.AuthorityId == 16 && Auth.AuthotypeId == 3) {
bdHosts[index].qx = 0;
}
})
}
}
})
});
} catch (error) {
console.log(error)
}
that.setData({
modal: modal,
bdHosts: bdHosts,
message: mesg
})
} else {
if (res.Status == 150) {
xg = 1;
app.toast(2, "绑定失败")
} else {
xg = 100;
app.toast(2, "网络繁忙")
}
}
} catch (error) {
xg = 100;
console.log(error)
}
}
}
},
err => {
xg = 100;
app.toast(2, "网络繁忙")
}
).catch(err => {
xg = 100;
app.toast(2, "网络繁忙")
});
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
},
inputSearchForHotels(e){
this.setData({
inputValue: e.detail.value
})
},
async UpgradeTheEquipment(e){
let se=e
let _this =this
let updataDev = e.currentTarget.dataset.id
let errstr =""
if (updataDev == 1) {
errstr="固件"
}
if (updataDev == 2) {
errstr="配置"
}
wx.showModal({
title: "提示",
content: "是否进行"+errstr+"升级!",
async success (res) {
if (res.confirm) {
await _this.UpgradeTheEquipment2(se)
} else if (res.cancel) {
return
}
}
})
},
async UpgradeTheEquipment2(e){
let updataDev = e.currentTarget.dataset.id
let errstr =""
let devlist =this.data.devlist
let UpgradeType =""
let filename = ""
let RoomtypeName =this.data.RoomtypeName
let _this =this
let RoomTypeID=""
let HotelId= app.globalData.HotelId
let UpgradeCount=0
if (updataDev == 1) {
errstr="升级固件失败"
UpgradeType='firmware'
filename=_this.data.Gfilename
filename=filename.replace('.hex','.bin')
}
if (updataDev == 2) {
errstr="升级配置失败"
UpgradeType=''
filename=_this.data.Pfilename
}
if (filename.length ==0) {
_this.DisplayPrompt("未获取到升级文件!升级失败",3000)
return
}
RoomTypeID=this.GetRoomTypeId(RoomtypeName)
let newdevlist =[]
for (let i = 0; i < this.data.devlist.length; i++) {
devlist[i].UpgradeStatus = 0
if (devlist[i].checkbox) { //勾选
if (devlist[i].Status) { //离在线
newdevlist.push(devlist[i])
}
}
}
if (newdevlist.length>0) {
_this.setData({
UpgradeCount:0, //升级计数
CurrentUpgradeDev:"", //当前升级设备
CurrentUpgradeDevStart:"",//当前升级设备状态
Completed:true,
UpgradeAllCount:newdevlist.length,//升级总数
devlist:devlist
})
}else
{
this.DisplayPrompt2("未选中升级设备", 1000)
return
}
for (let Nvindex = 0; Nvindex < newdevlist.length; Nvindex++) {
const element = newdevlist[Nvindex];
_this.setData({
//升级计数
CurrentUpgradeDev:element.RoomNumber, //当前升级设备
CurrentUpgradeDevStart:'升级就绪',//当前升级设备状态
})
try {
await upgrader.startUpgrade(UpgradeType, {
roomTypeID: RoomTypeID,
hostidLists:'['+element.ID+']',
upgradefileName: filename,
hotelid:HotelId
})
.then(res => {
_this.setData({
UpgradeCount:_this.data.UpgradeCount+1, //升级计数
})
console.log('升级完成', res)
})
.catch(err =>{
console.log('升级失败', err)
});
}catch (error) {
_this.setData({
//升级计数
CurrentUpgradeDev:element.RoomNumber, //当前升级设备
CurrentUpgradeDevStart:errstr+',服务器响应异常',//当前升级设备状态
Completed:false
})
//this.DisplayPrompt(errstr+',服务器响应异常',1000)
return
}
}
this.DisplayPrompt2("升级完成!", 1000)
},
DisplayPrompt2(tipstr, showtime)
{
wx.showToast({
title: tipstr,
icon: 'none'
})
setTimeout(function () {
wx.hideToast()
}, showtime)
},
ALLcheckboxSub(e){
let devlist =this.data.devlist
let ALLcheckbox =this.data.Allcheckbox
let values = !ALLcheckbox
for (let index = 0; index < devlist.length; index++) {
devlist[index].checkbox=values
}
this.setData({
devlist:devlist,
Allcheckbox:values
});
},
checkboxSub(e){
let devlist =this.data.devlist
let ALLcheckbox =this.data.Allcheckbox
let index = e.currentTarget.dataset.id
let values =!devlist[index].checkbox
devlist[index].checkbox=values
let checksun =0
for (let nindex = 0; nindex < devlist.length; nindex++) {
if (values) {
if ( devlist[nindex].checkbox!=values) {
values=devlist[nindex].checkbox
}
}
if (devlist[nindex].checkbox) {
checksun=checksun+1
}
}
this.setData({
devlist:devlist,
Allcheckbox:values,
checksun:checksun
});
},
SearchForHotels(e){
//debugger
let myarry =this.data.HostsDataFilters
let inputValue =this.data.inputValue.trim()
const CNaelement =this.sortHotelsByFuzzyMatch(myarry,inputValue)
this.setData({
HostsDataFilters:CNaelement
})
},
goProcess(e) {
let indexstr = e.currentTarget.id.replace("msg-","")
let index= Number(indexstr)
const { room, hotel, status,roomtypeid,hotelcode,createTime} = e.currentTarget.dataset;
let HostsDataFilters =this.data.HostsDataFilters
let timestr = HostsDataFilters[0].CreateTime
if (status !== 1) {
if (!HostsDataFilters[index].MAC||HostsDataFilters[index].MAC.length==0) {
//长按事件
if (this.endTime - this.startTime > 350) {
return;
}
this.setData({
selHosts: HostsDataFilters[index]
})
this.GetCode()
}
} else{ // 不为1时不跳转
wx.navigateTo({
url: `/pages/basics/HostUpgrade/EquipmentCaontrol/EquipmentCaontrol?RoomNumber=${room}&HotelName=${hotel}&HotelId=${this.data.Hotelinfo.HotelId }&roomtypeid=${roomtypeid }&HotelCode=${hotelcode}&createTime=${timestr}`
});
}
},
RefreshTheRoom:async function(e){
let that = this
await GetHostsInfo({
HotelID: this.data.Hotelinfo.HotelId
}).then(res => {
if (res.Status == 200) {
let onlineNumber=0
for (let index = 0; index < res.Data.length; index++) {
const element = res.Data[index];
if (element.Status===1) {
onlineNumber=onlineNumber+1
}
}
that.setData({
onlineNumber:onlineNumber,
HostsData: res.Data,
HostsDataFilters: res.Data,
isback: (app.globalData.autho.length > 1 || app.globalData.autho[0].Hotels.length > 1),
statusdata: [0, 0, 0, res.Data.length]
})
console.log(this.data.HostsDataFilters)
} else {
app.toast(2, res.Message || "网络繁忙")
}
}, err => {
console.log(err)
app.toast(2, "网络繁忙")
}).catch(err => {
console.log(err)
app.toast(2, "网络繁忙")
});
},
//touch start 开始触摸房间区域
handleTouchStart: function (e) {
this.startTime = e.timeStamp;
//console.log(" startTime = " + e.timeStamp);
},
//touch end结束触摸房间区域
handleTouchEnd: function (e) {
this.endTime = e.timeStamp;
//console.log(" endTime = " + e.timeStamp);
},
sortHotelsByFuzzyMatch:function(hotels, keyword) {
// 1. 参数验证
if (!Array.isArray(hotels)) {
console.warn('第一个参数必须是数组');
return [];
}
if (typeof keyword !== 'string') {
console.warn('第二个参数必须是字符串');
return hotels.slice();
}
// 2. 处理空数组或空关键字的情况
const trimmedKeyword = keyword.trim();
if (hotels.length === 0 || trimmedKeyword === '') {
return hotels.slice();
}
const lowerKeyword = trimmedKeyword.toLowerCase();
// 3. 分离匹配和不匹配的酒店
const matchedHotels = [];
const unmatchedHotels = [];
hotels.forEach(hotel => {
// 检查是否为有效酒店对象
if (!hotel || typeof hotel !== 'object' || !hotel.RoomNumber) {
unmatchedHotels.push(hotel);
return;
}
const hotelName = String(hotel.RoomNumber).toLowerCase();
const isMatch = hotelName.includes(lowerKeyword);
if (isMatch) {
matchedHotels.push(hotel);
} else {
unmatchedHotels.push(hotel);
}
});
// 4. 合并数组并返回
return [...matchedHotels, ...unmatchedHotels];
},
RefreshTheRoomType(e){
e.detail=this.data.RoomtypeName
this.bindPickerChange(e)
},
GetRoomTypeId(roomTypeName){
if (roomTypeName.length>0) {
let myArray =this.data.myArray
for (let index = 0; index < myArray.length; index++) {
let strbuf = myArray[index].split('|') ;
if (strbuf[1]==roomTypeName) {
return strbuf[0]
}
}
}else{
return ""
}
},
DisplayPrompt(tipstr, showtime)
{
// wx.showModal({
// title: '提示',
// content: '确认执行此操作吗?',
// success(res) {
// if (res.confirm) { /* 用户点击确定 */ }
// }
// });
wx.showLoading({
title: tipstr,
})
setTimeout(function () {
wx.hideLoading()
}, showtime)
},
async bindPickerChange(e) {
let Completed =this.data.Completed
let _this =this
if (Completed) {
this.DisplayPrompt("正在升级中!",1000)
return
}
let devlist=[]
let Roomtypeinfo=[]
let roomid = this.GetRoomTypeId(e.detail)
if (roomid.length==0) {
return
}
let Pfilename =""
let Gfilename =""
let Upgradenode =[]
try {
// 调用 GetRoomTypeNode
const res = await GetRoomTypeNode({
hotelid: app.globalData.HotelId,
roomTypeID: roomid,
});
if (res.IsSuccess==true) {
devlist = res.HostData
for (let nindex = 0; nindex < devlist.length; nindex++) {
devlist[nindex].show=1
devlist[nindex].checkbox=0
devlist[nindex].UpgradeStatus=0
devlist[nindex].Model =_this.removeNullCharsAndInvisibleChars(devlist[nindex].Model)
}
}
const Nres = await GetRoomType({
HotelID:app.globalData.HotelId
})
if (Nres.Status==200) {
Roomtypeinfo=Nres.Data
for (let index = 0; index < Roomtypeinfo.length; index++) {
const element = Roomtypeinfo[index];
if (element.ROOM_TYPE_OLD_ID == roomid) {
Upgradenode=element
if (element.App_Cfg_For_L2.length>0) {
Gfilename=element.App_Cfg_For_L2
}
if (element.App_Cfg_For_L4.length>0) {
Gfilename=element.App_Cfg_For_L4
}
if (element.APPTYPE=="App_Cfg") {
Pfilename=element.CONFIG_BIN
}else{
Pfilename=""
}
break
}
}
}
this.setData({
RoomtypeName: e.detail,
devlist:devlist,
Roomtypeinfo:Roomtypeinfo,
Pfilename:Pfilename,
Gfilename:Gfilename,
Upgradenode:Upgradenode
});
console.log(devlist)
} catch (err) {
console.log('GetRoomTypeNode error', err);
}
},
removeNullCharsAndInvisibleChars(str) {
try {
return str.replace(/[\u0000-\u001F\u007F-\u009F\u200B-\u200F\u202A-\u202E\u2060-\u206F\uFEFF]/g, '');
} catch (error) {
return "NULL"
}
},
tabSelect(e) {
this.setData({
TabCur: e.currentTarget.dataset.id,
})
},
})