diff --git a/miniprogram/lefu/service.ts b/miniprogram/lefu/service.ts index 3c50c23..0ec5740 100644 --- a/miniprogram/lefu/service.ts +++ b/miniprogram/lefu/service.ts @@ -292,7 +292,16 @@ class LeFuService { reject(new Error('[LeFu] 设备未连接,无法配网')) return } + let settled = false + const timer = setTimeout(() => { + if (settled) return + settled = true + reject(new Error('[LeFu] 配网超时,请重试')) + }, 20000) const callback = (res: number) => { + if (settled) return + settled = true + clearTimeout(timer) console.log(TAG, 'configWifi 回调:', res) res === 23 ? resolve() : reject(new Error(`[LeFu] 配网失败,错误码:${res}`)) } diff --git a/miniprogram/pages/connectedWifi/connectedWifi.ts b/miniprogram/pages/connectedWifi/connectedWifi.ts index 9045918..b4f0d38 100644 --- a/miniprogram/pages/connectedWifi/connectedWifi.ts +++ b/miniprogram/pages/connectedWifi/connectedWifi.ts @@ -1,5 +1,25 @@ import { lefuService } from '../../lefu/index' -import type { LeFuWifiItem } from '../../lefu/index' +import type { LeFuWifiItem, DeviceMember } from '../../lefu/index' + +/** 本地 userInfo 关键字段,用于下发主用户到新设备 */ +interface StoredUserInfo { + userId: string + realname: string + sex: number + height: number + birthday: string +} + +/** 从生日字符串(YYYY-MM-DD)计算周岁 */ +const calcAge = (birthday: string): number => { + if (!birthday) return 0 + const [y, m, d] = birthday.split('-').map(Number) + if (!y || !m || !d) return 0 + const now = new Date() + let age = now.getFullYear() - y + if (now.getMonth() + 1 < m || (now.getMonth() + 1 === m && now.getDate() < d)) age -= 1 + return Math.max(0, age) +} interface WifiItem { ssid: string @@ -126,6 +146,29 @@ Page({ onConfirm() { if (!this.data.hasConnected) return + // 已有 userInfo 表示是从首页/设备页添加新设备,需把主用户下发到新设备后回首页 + const userInfo = wx.getStorageSync('userInfo') as StoredUserInfo | null + if (userInfo) { + const mainUser: DeviceMember = { + id: userInfo.userId, + name: userInfo.realname, + gender: userInfo.sex === 1 ? 1 : 0, + age: calcAge(userInfo.birthday), + height: userInfo.height, + isSelf: true, + } + wx.showLoading({ title: '正在下发主用户...', mask: true }) + lefuService.syncMembersToDevice([mainUser]) + .then(() => { + wx.hideLoading() + wx.switchTab({ url: '/pages/home/home' }) + }) + .catch((err: Error) => { + wx.hideLoading() + wx.showToast({ title: err.message || '主用户下发失败', icon: 'none' }) + }) + return + } wx.navigateTo({ url: '/pages/supplementPersonal/supplementPersonal' }) }, }) diff --git a/miniprogram/pages/equipmentMember/equipmentMember.ts b/miniprogram/pages/equipmentMember/equipmentMember.ts index 7c13627..7ee8ad2 100644 --- a/miniprogram/pages/equipmentMember/equipmentMember.ts +++ b/miniprogram/pages/equipmentMember/equipmentMember.ts @@ -40,6 +40,8 @@ interface SysUserDevice { /** 页面展示用成员模型 */ interface MemberDisplay { id: string + /** 成员 ID */ + userId: string realname: string /** '男' | '女' */ sex_dictText: string @@ -54,8 +56,6 @@ interface MemberDisplay { sex: number /** 周岁数值,供 lefu 层使用 */ age: number - /** 身份证号,下发设备时作为用户唯一标识 */ - idCard: string } /** 设备卡展示模型 */ @@ -84,7 +84,7 @@ const calcAge = (birthday: string): number => { } const toDeviceMember = (m: MemberDisplay): DeviceMember => ({ - id: m.idCard, + id: m.userId, name: m.realname, gender: m.sex === 1 ? 1 : 0, age: m.age, @@ -181,10 +181,11 @@ Page({ get('weighingScale/v3/selectUserBySn/user', { sn, userId }) .then(res => { - const list = res.result.map(item => { + const list = res.result.map((item): MemberDisplay => { const age = calcAge(item.birthday) return { id: item.id, + userId: item.userId, realname: item.realname, sex_dictText: item.sex === 1 ? '男' : '女', ageDisplay: String(age), @@ -194,7 +195,6 @@ Page({ avatar: item.avatar, sex: item.sex, age, - idCard: item.idCard ?? '', } }) this.setData({ diff --git a/miniprogram/pages/supplementPersonal/supplementPersonal.ts b/miniprogram/pages/supplementPersonal/supplementPersonal.ts index 3c6f782..5df3315 100644 --- a/miniprogram/pages/supplementPersonal/supplementPersonal.ts +++ b/miniprogram/pages/supplementPersonal/supplementPersonal.ts @@ -1,5 +1,6 @@ import { get, put } from '../../utils/request/index' import { lefuService } from '../../lefu/index' +import type { DeviceMember } from '../../lefu/index' /** 表单数据模型 */ interface PersonalForm { @@ -243,9 +244,7 @@ Page({ // connectDeviceInfo 存储时已 JSON.parse 为对象,提交时还原为 JSON 字符串 const connectDeviceInfoRaw = wx.getStorageSync('connectDeviceInfo') - const connectDeviceInfo: string = connectDeviceInfoRaw - ? JSON.stringify(connectDeviceInfoRaw) - : '' + const connectDeviceInfo: string = connectDeviceInfoRaw ? JSON.stringify(connectDeviceInfoRaw) : '' const serverResult = this.data.serverResult as UserInfoFromServer const payload: UpdateUserPayload = { @@ -263,7 +262,26 @@ Page({ .then(res => { const { connectDeviceInfo: _, ...userInfo } = res.result wx.setStorageSync('userInfo', userInfo) - wx.switchTab({ url: '/pages/home/home' }) + + const mainUser: DeviceMember = { + id: payload.userId, + name: payload.realname, + gender: payload.sex === 1 ? 1 : 0, + age: parseInt(parsed.age, 10) || 0, + height: payload.height, + isSelf: true, + } + + wx.showLoading({ title: '正在下发主用户...', mask: true }) + lefuService.syncMembersToDevice([mainUser]) + .then(() => { + wx.hideLoading() + wx.switchTab({ url: '/pages/home/home' }) + }) + .catch((err: Error) => { + wx.hideLoading() + wx.showToast({ title: err.message || '主用户下发失败', icon: 'none' }) + }) }) } }) diff --git a/project.config.json b/project.config.json index 37e394e..1801901 100644 --- a/project.config.json +++ b/project.config.json @@ -42,7 +42,7 @@ "tabIndent": "insertSpaces", "tabSize": 4 }, - "libVersion": "2.32.3", + "libVersion": "3.15.2", "packOptions": { "ignore": [], "include": []