// 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 的 top(px) wx.createSelectorQuery() .in(this) .select('#myScroll') .boundingClientRect(rect => { if (rect) { const topPx = rect.top; // px const bottomPx = 10 / 2; // 10rpx → 5px(2倍屏) 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} */ 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, }) }, })