import { getLocation, getProjectBasicInfo, stopBeaconScan, } from "ais-h5-location"; import { STATES, promptStateMap } from "./index-helper"; import { getMapData, post } from "../../getMapData"; let configData; let map; const icons = { left: "/pages/index/left.png", straight: "/pages/index/straight.png", right: "/pages/index/right.png", end: "/pages/index/end.png", escalatorUp: "/pages/index/escalator-up.png", escalatorDown: "/pages/index/escalator-down.png", elevatorUp: "/pages/index/elevator-up.png", elevatorDown: "/pages/index/elevator-down.png", }; let locationOption; let initFloorOrder; Page({ /** * 页面的初始数据 */ data: { inited: false, floors: [], floorOrder: null, floorId: null, floorName: null, windowHeight: 812, states: STATES, state: STATES.selectFloor, promptStateMap, map: null, e: null, loc: null, tab: 0, showTabs: false, shop: null, nextFloor: null, nextNextFloor: null, navIcon: icons.straight, distanceToNextPoint: null, totalDistance: 0, distance: 0, arriveEnd: false, safeTop: 54, searchType: 0, point: null, warningCount: 0, bluetoothOpened: false, mode: "bluetooth", naviData: null, distance2End: null, }, /** * 生命周期函数--监听页面加载 */ async onLoad({ e, searchType = 0, floorOrder }) { initFloorOrder = floorOrder; const { config } = await getMapData(); configData = config; this.getSystemInfo(); wx.setKeepScreenOn({ keepScreenOn: true, }); const { globalData: { floors }, } = getApp(); const { windowHeight } = wx.getSystemInfoSync(); this.setData({ floors, windowHeight, e: decodeURIComponent(e), searchType: Number(searchType), }); await this.openBluetooth(); this.startBlueTooth(); }, openBluetooth() { return new Promise((resolve, reject) => { wx.openBluetoothAdapter({ success: () => { this.setData({ bluetoothOpened: true }); console.log("bluetoothOpened"); resolve(); }, fail: ({ errno, errCode }) => { this.setData({ bluetoothOpened: false }); console.warn("蓝牙未开启", errCode || errno); reject(errCode || errno); }, }); }); }, async startBlueTooth() { const ak = configData.map.find(({ ak }) => ak).ak; console.log("ak:", ak); if (!ak) return console.warn("no ak"); let projectInfo; try { projectInfo = await getProjectBasicInfo(ak); } catch (error) { console.log("getProjectBasicInfo", error); } try { if (this.data.bluetoothOpened !== true) await this.openBluetooth(); } catch (err) { return this.setState( err === 103 ? STATES.bluetoothRequired : STATES.systemBluetoothRequired ); } getLocation({ projectInfo, intervalTime: 1000, // 定时器(请求频率时长) successCb: (result) => { // console.log("getLocation -> successCb", result); const { location, floor = "" } = result.body && result.body[0]; const floorId = floor && floor.toUpperCase(); const matchedfloor = this.data.floors.find((f) => f.floorId == floorId); const notSameFloor = matchedfloor && this.data.floorId !== floorId; if (!matchedfloor) { this.finishNavigation(); return this.setState(STATES.fail8s); } this.setData({ floorId, floorOrder: matchedfloor.floorOrder, floorName: matchedfloor.name, }); // pointX、pointY格式处理 const splitArray = location && location.split(","); const pointX = parseFloat(splitArray[0]); const pointY = parseFloat(splitArray[1]); // 过滤蓝牙location 无效值 let isValidLocation; if (splitArray && splitArray.length) { isValidLocation = pointX > 1 && pointY > 1; } if (!isValidLocation) return; /** * vpas updateBluetoothLocation 触发条件: * 选择楼层 等于 蓝牙返回楼层时 * indoor = 1(室内) */ console.log(pointX, pointY); const x = (pointX - 118.785893) * 3000000; const y = -(pointY - 32.088021) * 6000000; if (!this.data.loc) { this.firstSuccess(x, y); } console.log(x, y); this.setData({ loc: [x, y], }); if (notSameFloor) { this.reroute(); } }, failCb: (e) => { console.log("failCb", e); try { const { errCode, errno } = e; if (errCode === 11000) { console.log("系统蓝牙未开启"); return this.setState(STATES.systemBluetoothRequired); } else if (errno && errno === 1) { console.log("未扫描到附近蓝牙信息"); this.finishNavigation(); return this.setState(STATES.fail8s); } } catch (error) { console.log("failCb error", error); } }, }); }, firstSuccess(x, y) { this.setData({ totalDistance: 0, loc: [x, y], state: STATES.successPrompt, }); console.log("firstSuccess---", this.data.e); if (!map) return; let shop = map.shopMap[this.data.e] ? map.shopMap[this.data.e] : map.facilityMap[this.data.e] ? map.facilityMap[this.data.e] : map.pMap[this.data.e]; if (!shop) { const endParamList = this.data.e.split("_"); if (endParamList.length === 3) { let [efloororder, epoint, ename] = endParamList; efloororder = Number(efloororder); epoint = Number(epoint); shop = { isDevice: true, name: ename, navPoint: epoint, yaxis: epoint, floorOrder: efloororder, floorName: map.mall.floors[efloororder][1], }; } } console.log("end", shop); if (!shop) return wx.showToast({ icon: "none", title: `未匹配到该终点:${this.data.e}`, }); this.setData({ shop: { ...shop, logoPath: shop.logoPath ? shop.logoPath.replaceAll("\\", "/") : null, }, }); this.reroute(); setTimeout(() => { this.setState(STATES.inNav); this.setData({ showTabs: true, tab: 0, }); }, 1000); }, reroute() { const { loc: [x, y], shop, } = this.data; const { naviData, nextFloorId, nextNextFloorId } = map.requestRoute( [x, y, this.data.floorId], { floorOrder: shop.floorOrder, navPoint: shop.yaxis } ); if (!naviData) return; let nextFloor = this.data.floors.find( ({ floorId }) => nextFloorId == floorId ); let nextNextFloor = this.data.floors.find( ({ floorId }) => nextNextFloorId == floorId ); this.setData({ naviData, nextFloor, nextNextFloor }); }, exit() { wx.redirectTo({ url: "/pages/h5map/index", }); }, handleToMap() { this.setState(STATES.tomap); }, handlePromptBtn({ detail: { btn } }) { const { state } = this.data; if (state === STATES.bluetoothRequired) { if (btn === "1") return wx.openSetting({ withSubscriptions: true, success: ({ authSetting }) => { if (authSetting["scope.bluetooth"]) { this.setState(STATES.startScan); this.startBlueTooth(); } }, }); if (btn === "2") return this.exit(); } if (state === STATES.systemBluetoothRequired) { if (btn === "1") return this.exit(); } if (state === STATES.fail8s) { if (btn === "1") return this.handleRelocate(); if (btn === "2") return this.setState(STATES.selectFloor); if (btn === "3") return this.exit(); } if (state === STATES.wrongLocation) return this.exit(); if (state === STATES.badConnection) return this.handleRelocate(); if ( state === STATES.arriveEscalator || state === STATES.arriveElevator || state === STATES.arriveMall || state === STATES.arrivePark ) { const nextFloor = this.data.nextNextFloor ? this.data.nextNextFloor : this.data.nextFloor; if (nextFloor) this.setData({ floorOrder: nextFloor.floorOrder, point: null, floorId: nextFloor.floorId, floorName: nextFloor.name, }); return this.handleRelocate(); } if (state === STATES.requestEnd || state === STATES.arriveEnd) { if (btn === "1") return this.exit(); if (btn === "2") return this.setState(STATES.inNav); } if (state === STATES.noCamera) { if (btn === "1") return wx.openSetting({ withSubscriptions: true, success: ({ authSetting }) => { if (authSetting["scope.camera"]) { wx.redirectTo({ url: `/pages/index/index?e=${this.data.e}`, }); } }, }); if (btn === "2") return this.exit(); } if (state === STATES.tomap) { if (btn === "1") return wx.redirectTo({ url: `/pages/h5map/index?e=${this.data.e}`, }); if (btn === "2") return this.setState(STATES.inNav); } }, setState(state) { if ( (this.data.state === STATES.arriveEscalator || this.data.state === STATES.arriveElevator || this.data.state === STATES.arriveMall || this.data.state === STATES.arrivePark) && state === STATES.inNav ) return console.log("到达弹窗出现忽略导航中状态变更触发"); if ( state === STATES.systemBluetoothRequired && this.data.state !== STATES.systemBluetoothRequired ) { systemBluetoothInterval = setInterval(() => { this.openBluetooth() .then(() => { if (systemBluetoothInterval) { clearInterval(systemBluetoothInterval); systemBluetoothInterval = null; } this.setState(STATES.startScan); this.startBlueTooth(); }) .catch((err) => { this.setState( err === 103 ? STATES.bluetoothRequired : STATES.systemBluetoothRequired ); }); }, 1000); } if ( this.data.state === STATES.systemBluetoothRequired && state === STATES.bluetoothRequired ) return; this.setData({ state, }); }, handleMap({ detail }) { map = detail; this.setData({ inited: true, }); const { floors } = this.data; const floor = floors[initFloorOrder]; initFloorOrder = undefined; if (floor) { this.setData({ floorOrder: floor.floorOrder, point: null, floorId: floor.floorId, floorName: floor.name, }); } }, handleTabChange({ detail }) { this.setData({ tab: detail, }); }, handleRelocate() { stopBeaconScan(); this.setData({ loc: null }); this.startBlueTooth(); }, handleDistance({ detail: { minDistance: distance, distance2End } }) { console.log( "偏移距离:", distance / 27, "距离区间终点距离:", distance2End / 27 ); this.setData({ distance2End: Math.ceil(distance2End / 27) }); if (distance / 27 > 10 && this.data.state === STATES.inNav) { this.reroute(); } }, handleNavExit() { this.setState(STATES.requestEnd); }, handleNoCamera() { this.setState(STATES.noCamera); }, getSystemInfo() { const res = wx.getSystemInfoSync(); console.log("设备信息:", res); this.setData({ safeTop: res.safeArea.top, windowHeight: res.windowHeight, }); }, /** * 生命周期函数--监听页面显示 */ onShow: function () { this.getSystemInfo(); }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () {}, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { this.finishNavigation(); }, finishNavigation() { try { if (systemBluetoothInterval) { clearInterval(systemBluetoothInterval); systemBluetoothInterval = null; } stopBeaconScan(); } catch (error) {} this.setData({ totalDistance: 0 }); }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () {}, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () {}, /** * 用户点击右上角分享 */ onShareAppMessage({ from }) { const e = from === "button" && this.data.point !== null ? `${this.data.floorOrder}_${this.data.point}_来自分享的位置` : null; return e === null ? { title: "", path: "/pages/h5map/index", imageUrl: "/pages/h5map/share.png", } : { title: "来自分享的位置", path: `/pages/h5map/index?e=${e}`, imageUrl: "/pages/h5map/share.png", }; }, handlePoint({ detail }) { this.setData({ point: detail }); }, });