Files

629 lines
15 KiB
JavaScript
Raw Permalink Normal View History

2025-12-30 15:21:19 +08:00
// pages/FacialDeviceBinding/FacialDeviceBinding.js
// 人脸设备绑定页面逻辑
const app = getApp()
// 导入请求中心
import {
GetHostsInfo,
GetFaceSN,
GetFaceCode,
CheckFaceSNAutho,
CheckFaceSN,
OpenDoorTest
} from '../../../lib/RequestingCenter';
Page({
data: {
autho:null,
RoomIndex: 0, // 当前选中房间索引
Hotelinfo: null, // 酒店信息
HostsData: null, // 原始设备数据
HostsDataFilters: [], // 过滤后的设备数据
onlineFaceDevices: 0, // 在线人脸设备数量
inputValue: "", // 搜索输入值
scrollHeight: 0, // 滚动区域高度
toView: '', // 滚动位置
modal: '', // 弹窗状态
selHosts: null, // 当前选中的房间
faceSNCode: '', // 人脸设备SN输入
bdHosts: [], // 已绑定的主机列表
Help: false, // 帮助状态
islogs: false, // 操作记录状态
showinfo: 0, // 显示信息类型
faceAddress: '', // 人脸设备地址
input: 0, // 输入类型
ISLoopDebugging: 0, // 回路调试状态
message: [], // 弹窗信息
},
/**
* 页面的初始数据
*/
onLoad:async function(options) {
if (!options.HotelId || app.globalData.autho == null) {
app.toast(2, "无酒店信息~")
return;
}
this.setData({
autho: app.globalData.autho ,
HotelId:options.HotelId
})
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("已经找到,无需循环~")
}
// 计算滚动区域高度
this.calcScrollHeight();
// 获取人脸设备数据
this.GetHostsInfo();
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
// 页面显示时重新获取数据
this.GetHostsInfo();
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
this.GetHostsInfo();
wx.stopPullDownRefresh();
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
// 返回上一页
back: function () {
wx.navigateBack({
delta: 1
});
},
// 计算滚动区域高度
calcScrollHeight: function () {
// 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();
},
// 获取人脸设备数据
GetHostsInfo: function () {
const that = this;
// 显示加载提示
wx.showLoading({
title: '加载中...',
});
// 调用获取主机信息接口
GetHostsInfo({
HotelID: that.data.HotelId
}).then(res => {
// 隐藏加载提示
wx.hideLoading();
if (res.Status == 200) {
// 处理数据
const HostsData = res.Data;
const HostsDataFilters = HostsData;
// 统计在线人脸设备数量
let onlineFaceDevices = 0;
for (let i = 0; i < HostsDataFilters.length; i++) {
if (HostsDataFilters[i].FaceStatus) {
onlineFaceDevices++;
}
}
// 更新数据
that.setData({
HostsData: HostsData,
HostsDataFilters: HostsDataFilters,
onlineFaceDevices: onlineFaceDevices,
RoomIndex: 0
});
// 获取位置信息
that.GetLOC();
} else {
wx.showToast({
title: '获取数据失败',
icon: 'none'
});
}
}).catch(err => {
wx.hideLoading();
wx.showToast({
title: '网络异常',
icon: 'none'
});
console.error('获取主机信息失败:', err);
});
},
// 获取位置信息
GetLOC: function () {
const that = this;
// 调用微信获取位置接口
wx.getFuzzyLocation({
type: 'wgs84',
success(res) {
const latitude = res.latitude;
const longitude = res.longitude;
const address = `${latitude},${longitude}`;
that.setData({
faceAddress: address
});
},
fail(err) {
console.error('获取位置信息失败:', err);
// 位置信息获取失败不影响主流程
}
});
},
// 搜索输入
inputSearchForHotels: function (e) {
this.setData({
inputValue: e.detail.value
});
},
// 搜索房间
SearchForHotels: function () {
const that = this;
const inputValue = that.data.inputValue;
const HostsData = that.data.HostsData;
if (inputValue === '') {
// 搜索条件为空,显示所有数据
that.setData({
HostsDataFilters: HostsData
});
return;
}
// 根据房号搜索
const filters = HostsData.filter(item => {
return item.RoomNumber.indexOf(inputValue) !== -1;
});
that.setData({
HostsDataFilters: filters
});
},
// 刷新房间数据
RefreshTheRoom: function () {
this.GetHostsInfo();
},
// 跳转到人脸设备详情或直接扫码绑定
goFaceDetail: function (e) {
const index = e.currentTarget.id.split('-')[1];
const HostsDataFilters = this.data.HostsDataFilters;
const selHosts = HostsDataFilters[index];
selHosts.index = index;
this.setData({
RoomIndex: index,
selHosts: selHosts
});
// 判断条件:离线且未绑定
if (!selHosts.FaceStatus && (!selHosts.FaceSN || selHosts.FaceSN === '')) {
// 直接调用摄像头扫码绑定
this.GetFaceCode();
} else {
// 设置消息数据
this.setData({
message: [selHosts.FaceSN, selHosts.RoomNumber],
// 显示设备详情
modal: -1
});
}
},
// 关闭弹窗
GetHide: function () {
this.setData({
modal: ''
});
},
// 反馈错误
ErrorInfo: function () {
wx.showToast({
title: '反馈功能开发中',
icon: 'none'
});
},
// 人脸设备解绑
JbSn: function (params) {
let jbjd = null;
let faceSN = null;
let that = this;
let index = -1;
// 检查是否从SN已绑定弹窗点击解绑按钮
if (typeof params.currentTarget.dataset['index'] != 'undefined') {
faceSN = this.data.faceSNCode;
index = params.currentTarget.dataset['index'];
// 解绑的房间
jbjd = this.data.bdHosts[index];
} else {
jbjd = this.data.selHosts;
faceSN = this.data.selHosts.FaceSN;
}
wx.showModal({
title: '解绑确认',
content: `确定要解除${jbjd.RoomNumber}房间的人脸设备绑定吗?`,
success(res) {
if (res.confirm) {
// 调用解绑接口
GetFaceSN({
faceSN: faceSN,
roomID: jbjd.Id,
roomNumber: jbjd.RoomNumber,
faceAddress: that.data.faceAddress,
HotelID: jbjd.HotelID,
isjb: true
}).then(res => {
if (res.Status == 200) {
wx.showToast({
title: '解绑成功',
icon: 'success'
});
// 如果是从SN已绑定弹窗解绑需要更新bdHosts数据
if (index > -1) {
let databdHosts = that.data.bdHosts;
databdHosts.splice(index, 1);
that.setData({
bdHosts: databdHosts
});
// 如果bdHosts为空继续执行绑定
if (databdHosts.length <= 0) {
that.GetFaceSNend();
}
}
// 重新获取数据
that.GetHostsInfo();
// 关闭弹窗
that.GetHide();
} else {
wx.showToast({
title: '解绑失败',
icon: 'none'
});
}
}).catch(err => {
wx.showToast({
title: '网络异常',
icon: 'none'
});
console.error('解绑失败:', err);
});
}
}
});
},
// 扫码绑定人脸设备
GetFaceCode: function () {
const that = this;
// 检查权限
if (!that.CheckFaceSNAutho()) {
wx.showToast({
title: '您没有权限绑定人脸设备',
icon: 'none'
});
return;
}
// 调用微信扫码接口
wx.scanCode({
success: (res) => {
const code = res.result;
that.setData({
faceSNCode: code
});
2026-01-16 12:00:49 +08:00
// debugger
2025-12-30 15:21:19 +08:00
that.GetFaceSNOK();
},
fail: (err) => {
console.error('扫码失败:', err);
wx.showToast({
title: '扫码失败',
icon: 'none'
});
}
});
},
// 手动输入人脸设备SN
ShowInputsn: function () {
// 检查权限
if (!this.CheckFaceSNAutho()) {
wx.showToast({
title: '您没有权限绑定人脸设备',
icon: 'none'
});
return;
}
this.setData({
modal: 'showBindConfirm'
});
},
GetFaceSNOK:function(){
let that = this;
if (!this.CheckFaceMAC(that.data.faceSNCode)) {
this.setData({
modal: 520
})
return;
};
if (that.data.selHosts.FaceSN == that.data.faceSNCode) {
app.toast(2, "条码一致,无需更改~")
return;
}
this.CheckFaceMACWL()
},
CheckFaceMACWL(){
let that = this;
CheckFaceSN({faceSN:this.data.faceSNCode}).then(
res => {
if (res.Status == 200) {
if(res.Data<=0){
that.setData({
modal:-521,
})
}else{
let remove = [];
let bdHosts = res.Data;
try {
//记录已经分配酒店但是未分配房间 且酒店是当前酒店 那就判断为没有绑定
that.data.autho.forEach((element, index) => {
element.Hotels.forEach((elements, indexs) => {
for (let index = 0; index < bdHosts.length; index++) {
if (elements.HotelId == bdHosts[index].HotelID) {
if(bdHosts[index].HotelID == that.data.Hotelinfo.HotelId && bdHosts[index].Id==0){
remove.push(index);
}
elements.Auth.forEach (Auth=>{
if(Auth.AuthorityId == 21 && Auth.AuthotypeId == 3){
//有权限
bdHosts[index].qx = 0;
}
})
}
}
})
});
} catch (error) {
console.log(error)
}
remove.forEach (x=>{
bdHosts.splice(x, 1);
})
let modalval = -200;
if(bdHosts.length<=0){
modalval = -521;
}
that.setData({
modal:modalval,
bdHosts:bdHosts
})
// app.toast(2, "已经被绑定")
}
}else{
app.toast(2, "网络繁忙")
}
},
err => {
console.log(err)
app.toast(2, "网络繁忙")
}).catch(err => {
console.log(err)
app.toast(2, "网络繁忙")
});
},
CheckFaceMAC:function(vlues){
return true;
console.log(vlues.length != 16)
return vlues.length == 16;
},
// 完成人脸设备绑定
GetFaceSNend: function () {
const that = this;
const selHosts = that.data.selHosts;
const faceSNCode = that.data.faceSNCode;
// 显示加载提示
wx.showLoading({
title: '绑定中...',
});
// 调用绑定接口
GetFaceSN({
faceSN: faceSNCode,
roomID: selHosts.Id,
roomNumber: selHosts.RoomNumber,
faceAddress: that.data.faceAddress,
HotelID: selHosts.HotelID,
isjb: false
}).then(res => {
// 隐藏加载提示
wx.hideLoading();
if (res.Status == 200) {
wx.showToast({
title: '绑定成功',
icon: 'success'
});
// 重新获取数据
that.GetHostsInfo();
// 关闭弹窗
that.GetHide();
} else if (res.Status == 400) {
// 设备已被绑定
that.setData({
bdHosts: res.Data,
code: faceSNCode,
modal: -200
});
} else {
wx.showToast({
title: '绑定失败',
icon: 'none'
});
}
}).catch(err => {
// 隐藏加载提示
wx.hideLoading();
wx.showToast({
title: '网络异常',
icon: 'none'
});
console.error('绑定失败:', err);
});
},
// 检查人脸设备绑定权限
CheckFaceSNAutho: function () {
let res = false;
this.data.Hotelinfo.Auth.forEach(x => {
if (x.AuthorityId == 21 && x.AuthotypeId == 3) {
res = true;
}
});
return res;
},
// 设置操作
testinfo: function (e) {
var jbjd = this.data.selHosts;
wx.navigateTo({
url: '/pages/test/test?Hotelinfo=' + e.currentTarget.id + '&RoomID=' + jbjd.Id + '&faceadd=' + this.data.faceAddress
});
},
// 开门操作
OpenDoor: function (e) {
const sn = e.currentTarget.id.split('_');
OpenDoorTest({faceSN:sn[2],isjb:true}).then(
res=>{
if (res.Status == 200) {
wx.showToast({
title: res.Message,
icon: 'none'
})
}else{
wx.showToast({
title: res.Message,
icon: 'none'
})
}
},rej=>{
wx.showToast({
title: "网络繁忙",
icon: 'none'
})
}
);
},
// 切换显示信息
GetshowinfoClick: function (e) {
const index = e.currentTarget.dataset.index;
this.setData({
showinfo: index
});
},
// 切换显示信息(刷新)
GetshowinfoClick1: function () {
this.GetHostsInfo();
},
})