var ble = require('../../services/ble') var api = require('../../utils/api') var config = require('../../config/env') var app = getApp() Page({ data: { connected: false, deviceName: '', battery: 0, subscription: null, subRemaining: 0, modeState: '空闲', bleState: 'disconnected', hasDevice: false, deviceInfo: null, devMode: false, loading: true }, onShow: function () { this.setData({ devMode: config.__DEV__ || false }) this.checkState() this._onStatus = this.onBleStatus.bind(this) ble.on('status', this._onStatus) }, _cleanup: function () { if (this._onStatus) { ble.off('status', this._onStatus) this._onStatus = null } }, onHide: function () { this._cleanup() }, onUnload: function () { this._cleanup() }, checkState: function () { var self = this var token = wx.getStorageSync('token') if (!token) { wx.reLaunch({ url: '/pages/login/login' }) return } self.setData({ connected: ble.isConnected(), loading: true }) var p1 = api.getDevices().then(function (data) { var devices = data.devices || [] self.setData({ hasDevice: devices.length > 0 }) if (devices.length > 0) { app.globalData.currentDevice = devices[0] self.setData({ deviceName: devices[0].device_name || devices[0].device_id || '我的光面膜', deviceInfo: devices[0] }) } }).catch(function (err) { console.error('getDevices failed', err) }) var p2 = api.getSubscription().then(function (sub) { self.setData({ subscription: sub, subRemaining: sub.remaining_days || 0 }) }).catch(function (err) { console.error('getSubscription failed', err) }) Promise.all([p1, p2]).then(function () { self.setData({ loading: false }) }) }, onBleStatus: function (status) { this.setData({ battery: status.battery || 0, modeState: ble.getModeStateName(status.mode_state), connected: true, bleState: 'connected' }) }, onConnectBle: function () { var self = this self.setData({ bleState: 'scanning' }) ble.startScan({ onFound: function () { self.setData({ bleState: 'connecting' }) }, onConnected: function () { self.setData({ connected: true, bleState: 'connected' }) ble.queryStatus().catch(function (err) { console.error('queryStatus failed', err) }) }, onError: function (err) { self.setData({ connected: false, bleState: 'error' }) wx.showToast({ title: err.msg || '连接失败', icon: 'none' }) } }) }, onAddDevice: function () { wx.navigateTo({ url: '/pages/scan/scan' }) }, onManageDevice: function () { var self = this wx.showActionSheet({ itemList: ['解绑当前设备'], success: function (res) { if (res.tapIndex === 0) { wx.showModal({ title: '确认解绑', content: '解绑后将无法使用该设备,确定要解绑吗?', success: function (modalRes) { if (modalRes.confirm) { self.doUnbind() } } }) } } }) }, doUnbind: function () { var self = this wx.showLoading({ title: '解绑中...' }) ble.disconnect() api.unbindDevice().then(function () { wx.hideLoading() self.setData({ hasDevice: false, deviceName: '', deviceInfo: null, connected: false }) wx.showToast({ title: '已解绑', icon: 'success' }) }).catch(function (err) { wx.hideLoading() wx.showToast({ title: err.message || '解绑失败', icon: 'none' }) }) }, onStartTreatment: function () { if (!this.data.subscription || this.data.subscription.status !== 'active') { wx.navigateTo({ url: '/pages/subscribe-prompt/subscribe-prompt' }) return } wx.navigateTo({ url: '/pages/wear-check/wear-check' }) }, onMockBind: function () { var self = this wx.showModal({ title: '模拟绑定', editable: true, placeholderText: '输入设备编号(需先在后台创建)', success: function (res) { if (res.confirm && res.content) { var deviceId = res.content.trim() api.mockBind(deviceId).then(function () { wx.showToast({ title: '模拟绑定成功', icon: 'success' }) self.checkState() }).catch(function (err) { wx.showToast({ title: err.message || '绑定失败', icon: 'none' }) }) } } }) }, onViewSubscription: function () { if (!this.data.subscription || this.data.subscription.status !== 'active') { wx.navigateTo({ url: '/pages/subscribe-plans/subscribe-plans' }) } } })