629 lines
15 KiB
JavaScript
629 lines
15 KiB
JavaScript
// 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 的 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();
|
||
|
||
|
||
|
||
},
|
||
|
||
// 获取人脸设备数据
|
||
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
|
||
});
|
||
debugger
|
||
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();
|
||
},
|
||
}) |