const app = getApp(); import $ from "../../utils/request"; Page({ data: { BLUE_STATE: {}, device: null, connectState: "", userId: "", realname: "", sex: { index: "", data: [{ id: 1, name: '男' }, { id: 2, name: '女' }] }, birthday: { label: "1980年01月01日", value: "1980-01-01" }, height: { index: 50, data: Array.from({ length: 200 - 120 + 1 }, (_, i) => i + 120) }, weight: { index: [60, 0], data: [Array.from({ length: 120 + 1 }, (_, i) => i + 10), Array.from({ length: 10 }, (_, i) => i)] }, }, // 存储回调函数的引用,以便在 detached 时取消监听 _connectStateWatcher: null, onLoad(options) { this.checkBluetoothPermissionAndInit(); app.globalData.ppScale.plugin.bus.subscribe("devicesModel", (res) => { console.log("searchDevice ===》devicesModel", res); app.globalData.ppScale.device.mac = res.deviceMac; app.globalData.ppScale.plugin.bus.subscribe("deviceConnect", (res) => { console.log('connectedDevice ===》deviceConnect', res); app.globalData.ppScale.plugin.ScaleAction.startDataProgress(true); app.globalData.ppScale.activeProtocol = app.globalData.ppScale.plugin.ScaleAction.getActiveProtocol(); app.globalData.ppScale.activeProtocol.codeUpdateMTU((res) => { console.log("connectedDevice ===》codeUpdateMTU", res); app.globalData.ppScale.device.name = this.data.device.name; app.globalData.ppScale.device.connection = this.data.device; wx.hideLoading(); }); }); }); console.log(`[Component] connectState 获取: ${app.globalData.ppScale.device.connectState}`); this.setData({ BLUE_STATE: app.globalData.ppScale.plugin.BLUE_STATE, connectState: app.globalData.ppScale.device.connectState }) this._connectStateWatcher = (newValue, oldValue) => { console.log(`[Component] connectState 变化: ${oldValue} -> ${newValue}`); this.setData({ connectState: newValue || '' }); }; app.watch('ppScale.device.connectState', this._connectStateWatcher); let userInfo = wx.getStorageSync("userInfo") || null; if(userInfo) { let [year, month, day] = userInfo.birthday.split("-"); this.setData({ userId: userInfo.userId, realname: userInfo.realname, ["sex.index"]: this.data.sex.data.findIndex(item => {return item.id === userInfo.sex}), birthday: { label: year + "年" + month + "月" + day + "日", value: userInfo.birthday }, ["height.index"]: this.data.height.data.findIndex(item => {return item === userInfo.height}), }) if(userInfo.weight) { const integerPart = Math.floor(userInfo.weight); const decimalPart = Math.round((userInfo.weight - integerPart) * 10); const integerIndex = this.data.weight.data[0].indexOf(integerPart); const decimalIndex = this.data.weight.data[1].indexOf(decimalPart); this.setData({ ["weight.index"]: [integerIndex !== -1 ? integerIndex : null, decimalIndex !== -1 ? decimalIndex : null], }) } } }, // 姓名输入 realnameInput(e) { let realname = e.detail.value.replace(/\s+/g, ''); this.setData({ realname: realname }) }, // 性别选择 sexChange(e) { let sex = e.detail.value; console.log(sex); this.setData({ ['sex.index']: e.detail.value }) if(this.data.height.index === null) { this.setData({ ['height.index']: sex == 0 ? 50 : 40 }) } if(this.data.weight.index === null) { this.setData({ ['weight.index']: sex == 0 ? 20 : 10 }) } }, // 生日选择 birthdayChange(e) { let v = e.detail.value; let [year, month, day] = v.split("-"); this.setData({ birthday: { label: year + "年" + month + "月" + day + "日", value: v } }) }, // 身高选择 heightChange(e) { this.setData({ ['height.index']: e.detail.value }) }, // 体重选择 weightChange(e) { console.log(e.detail.value) this.setData({ ['weight.index']: e.detail.value }) }, setUserInfo() { if(this.data.connectState == this.data.BLUE_STATE.CONNECTSUCCESS) { let realname = this.data.realname; let sex = this.data.sex; let birthday = this.data.birthday; let height = this.data.height; let weight = this.data.weight; if(!realname) { wx.showToast({ icon: "none", title: "姓名不能为空" }) return false; } if(sex.index === "") { wx.showToast({ icon: "none", title: "性别不能为空" }) return false; } if(!birthday.value) { wx.showToast({ icon: "none", title: "生日不能为空" }) return false; } if(height.index === "") { wx.showToast({ icon: "none", title: "身高不能为空" }) return false; } if(weight.index[0] === null && weight.index[1] === null) { console.log(weight) wx.showToast({ icon: "none", title: "体重不能为空" }) return false; } let sn = app.globalData.ppScale.device.mac.replace(/:/g, ''); $.ajax("weighingScale/edit/user", { sn: sn, realname: realname, sex: sex.data[sex.index].id, birthday: birthday.value, height: height.data[height.index], weight: weight.data[0][weight.index[0]] + '.' + weight.data[1][weight.index[1]] }, "POST", true, "保存中...").then(res => { $.ajax("weighingScale/select/user", { sn: sn }, "GET", true, "更新用户信息中...").then(res_ => { wx.setStorageSync("userInfo", res_.result); wx.showToast({ icon: "none", title: res.message }) app.globalData.ppScale.activeProtocol.dataSyncUserInfo({ userID: res_.result.id, userName: res_.result.realname, memberID: "", age: this.getAge(res_.result.birthday), // gender: res_.result.sex, // height: res_.result.height, // isAthleteMode: 0, currentWeight: res_.result.weight, // deviceHeaderIndex: 0, targetWeight: "", idealWeight: "", recentData: [], }, (res) => { if(res == 0) { wx.showToast({ title: "用户信息更新成功。", icon: "none" }) setTimeout(() => { wx.navigateBack({ delta: 1 }) }, 1500) } else { console.log("dataSyncUserInfo", res) wx.showToast({ title: "用户信息下发失败,请重试。", icon: "none" }) } }) }) }) } else { wx.showToast({ title: "设备连接失败,请重试。", icon: "none" }) } }, // 根据生日获取年龄 getAge(birthDateString) { const birthDate = new Date(birthDateString); const today = new Date(); let age = today.getFullYear() - birthDate.getFullYear(); const monthDiff = today.getMonth() - birthDate.getMonth(); const dayDiff = today.getDate() - birthDate.getDate(); // 如果当前月份小于出生月份,或者同月但当前日期小于出生日期,年龄需要减 1 if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) { age--; } return age; }, checkBluetoothPermissionAndInit() { wx.showLoading({ title: '正在检查蓝牙权限...', mask: true }) wx.getSetting({ success: (res) => { if (res.authSetting['scope.bluetooth']) { this.openBluetoothAdapter(); } else { wx.hideLoading(); wx.authorize({ scope: 'scope.bluetooth', success: () => { this.openBluetoothAdapter(); }, fail: (err) => { wx.hideLoading(); wx.showModal({ title: '提示', content: '您拒绝了蓝牙权限,将无法连接蓝牙秤。是否前往设置开启?', confirmText: '去开启', cancelText: '不开启', success: (modalRes) => { if (modalRes.confirm) { wx.openSetting({ success: (settingRes) => { console.log('openSetting success', settingRes); }, fail: (settingErr) => { wx.navigateBack({ delta: 1 }); } }); } else { wx.navigateBack({ delta: 1 }); } } }); } }); } }, fail: (err) => { wx.hideLoading(); wx.showToast({ title: '获取权限设置失败', icon: 'none' }); wx.navigateBack({ delta: 1 }); } }); }, openBluetoothAdapter() { wx.showLoading({ title: "正在初始化蓝牙...", mask: true }); wx.openBluetoothAdapter({ success: () => { this.getDeviceSettingList(); }, fail: (err) => { wx.hideLoading(); if (err.errCode === 10001) { wx.showModal({ title: "提示", content: "请确保手机蓝牙已开启。", showCancel: false, success: () => { wx.navigateBack({ delta: 1 }); } }); } else if (err.errMsg && err.errMsg.includes('permission denied')) { wx.showModal({ title: '提示', content: '蓝牙权限仍被拒绝,无法使用蓝牙功能。', showCancel: false, success: () => { wx.navigateBack({ delta: 1 }); } }); } else { wx.showToast({ title: `蓝牙适配器打开失败: ${err.errMsg || err.errCode}`, icon: 'none', success: () => { wx.navigateBack({ delta: 1 }); } }); } }, }); }, // 获取自己已经配对上的设备 getDeviceSettingList() { let params = {}; $.ajax("weighingScale/list/device", params, "GET", true, "获取设备列表").then((res) => { wx.showLoading({ title: "正在寻找设备...", mask: true }); app.globalData.ppScale.device.list = []; let seviceList = app.globalData.ppScale.device.setting.find((item) => { return item.deviceName === res.result[0].type }); app.globalData.ppScale.plugin.Blue.setDeviceSetting([seviceList]); app.globalData.ppScale.plugin.Blue.start(res.result[0].type, false); app.globalData.ppScale.plugin.bus.subscribe("devicesList", (res_) => { console.log("searchDevice ===> devicesList", res_); let fIndex = res_.findIndex(item => item.deviceId === res.result[0].deviceId); if (fIndex >= 0) { app.globalData.ppScale.plugin.Blue.stopBluetoothDevicesDiscovery(); wx.showLoading({ title: "正在连接设备...", mask: true }); this.setData({ device: res_[fIndex] }) app.globalData.ppScale.plugin.Blue.createBLEConnection(res_[fIndex]); } }); }) }, // 点击设备重连 connectedDevice() { let device = this.data.device; if(device) { wx.showLoading({ title: "正在重新连接设备...", mask: true }); app.globalData.ppScale.plugin.Blue.createBLEConnection(device); } }, onUnload() { app.globalData.ppScale.plugin.Blue.stop(); if (this._connectStateWatcher) { app.unwatch('ppScale.device.connectState', this._connectStateWatcher); } } })