diff --git a/miniprogram/lefu/service.ts b/miniprogram/lefu/service.ts index 2b62dde..b4e0dcc 100644 --- a/miniprogram/lefu/service.ts +++ b/miniprogram/lefu/service.ts @@ -324,25 +324,28 @@ class LeFuService { reject(new Error('设备未连接,无法获取 WiFi 列表')) return } + let settled = false let timer: number | null = null let delayTimer: number | null = null - // 15s 整体超时 - timer = setTimeout(() => { + const settle = (err: Error | null, data: LeFuWifiItem[] = []) => { + if (settled) return + settled = true + if (timer !== null) { clearTimeout(timer); timer = null } if (delayTimer !== null) { clearTimeout(delayTimer); delayTimer = null } - reject(new Error('获取 WiFi 列表超时')) - }, 15000) + err ? reject(err) : resolve(data) + } + // 15s 整体超时 + timer = setTimeout(() => settle(new Error('获取 WiFi 列表超时')), 15000) // 延时 2s 后下发查询指令(等待设备进入配网模式) delayTimer = setTimeout(() => { this._activeProtocol.dataFindSurroundDevice((res: any[]) => { - if (timer !== null) { clearTimeout(timer); timer = null } - if (delayTimer !== null) { clearTimeout(delayTimer); delayTimer = null } console.log(TAG, 'getWifiList 结果:', res) if (!res?.length) { this._activeProtocol.dataExitWifiConfig(() => { }) - resolve([]) + settle(null, []) return } - resolve(res.map((item: any) => ({ ssid: item.ssid || item.name || '', signal: item.signal }))) + settle(null, res.map((item: any) => ({ ssid: item.ssid || item.name || '', signal: item.signal }))) }) }, 2000) }) diff --git a/miniprogram/pages/addUser/addUser.ts b/miniprogram/pages/addUser/addUser.ts index 945bd30..f09507f 100644 --- a/miniprogram/pages/addUser/addUser.ts +++ b/miniprogram/pages/addUser/addUser.ts @@ -58,6 +58,7 @@ Page({ onLoad(options: Record) { targetSn = decodeURIComponent(options.sn || '') + console.log(targetSn); editId = decodeURIComponent(options.id || '') this.setData({ isEdit: !!editId }) if (editId) { diff --git a/miniprogram/pages/connectedDevice/connectedDevice.ts b/miniprogram/pages/connectedDevice/connectedDevice.ts index 177f431..79c0e4a 100644 --- a/miniprogram/pages/connectedDevice/connectedDevice.ts +++ b/miniprogram/pages/connectedDevice/connectedDevice.ts @@ -325,11 +325,10 @@ Page({ if (state === leFuService.BLUE_STATE.CONNECTFAILED) { finish() wx.showToast({ title: '连接失败,请重试', icon: 'none' }) - } else if (state === leFuService.BLUE_STATE.UNAVAILABLE) { - // 连接过程中蓝牙被关闭:立即结束 loading,避免卡到超时 - finish() - wx.showToast({ title: '蓝牙已断开,请重新开启', icon: 'none' }) } + // UNAVAILABLE 不在此处理:connect 过程中 clearProtocol 会触发一次 UNAVAILABLE 抖动, + // 后面紧跟 CONNECTSUCCESS,误判会打断连接流程并误报「蓝牙关闭」。 + // 真正「连接后关闭蓝牙」由 onDisconnected 回调处理。 }) connectCleanup.unsubConnect = leFuService.onDeviceConnect(() => { diff --git a/miniprogram/pages/connectedWifi/connectedWifi.ts b/miniprogram/pages/connectedWifi/connectedWifi.ts index fb0fd43..2a18337 100644 --- a/miniprogram/pages/connectedWifi/connectedWifi.ts +++ b/miniprogram/pages/connectedWifi/connectedWifi.ts @@ -4,6 +4,8 @@ import { leFuService } from '../../lefu/index' let unsubDisconnected: (() => void) | null = null let unsubDeviceConnect: (() => void) | null = null let retryTimer: number | null = null +/** 获取 WiFi 列表防重入标记 */ +let searching = false /** 渲染用的 WiFi 项(在 SSID 基础上追加连接状态) */ interface WifiItem { @@ -74,10 +76,12 @@ Page({ /** 通过设备协议获取周围 WiFi 列表 */ async onStartSearch() { + if (searching) return if (!this._ensureConnected()) { this.setData({ status: 'idle', wifiList: [] }) return } + searching = true this.setData({ status: 'searching', wifiList: [] }) wx.showLoading({ title: '正在获取 WiFi 列表...', mask: true }) try { @@ -95,6 +99,8 @@ Page({ wx.hideLoading() this.setData({ status: 'empty', wifiList: [] }) wx.showToast({ title: '获取 WiFi 列表失败', icon: 'none' }) + } finally { + searching = false } }, @@ -167,6 +173,6 @@ Page({ onConfirm() { if (!this.data.hasConnected) return if (!this._ensureConnected()) return - wx.navigateTo({ url: '/pages/equipment/equipment' }) + wx.reLaunch({ url: '/pages/equipment/equipment' }) }, }) diff --git a/miniprogram/pages/userManagement/userManagement.ts b/miniprogram/pages/userManagement/userManagement.ts index 0ddb140..f87633b 100644 --- a/miniprogram/pages/userManagement/userManagement.ts +++ b/miniprogram/pages/userManagement/userManagement.ts @@ -1,4 +1,4 @@ -import { get, post, del } from '../../utils/request/index' +import { get, post, del, put } from '../../utils/request/index' import { leFuService } from '../../lefu/index' import type { SyncUserData } from '../../lefu/index' import { calcAge } from '../../utils/idCard/index' @@ -72,6 +72,10 @@ const markSynced = (data: { sn: string; list: string[] }) => const deleteMember = (id: string) => del('weighingScale/v6/del/user', { id }, { loading: false }) +/** 添加设备成员(本人) */ +const addSelfUser = (data: Record) => + put('weighingScale/v6/edit/user', data) + /** equipment 页传入的目标设备 */ let targetDevice: { sn: string; deviceId: string; name: string; connected: boolean; connectDeviceInfo: string } | null = null @@ -413,9 +417,36 @@ Page({ }) }, - /** 一键添加本人 */ + /** 一键添加本人:仅调接口把当前登录用户添加为设备成员,不下发设备 */ onTapAddSelf() { - // 一键添加本人(待接入) + const userInfo = wx.getStorageSync('userInfo') as Record | null + if (!userInfo?.userId) { + wx.showToast({ title: '请先完善个人信息', icon: 'none' }) + return + } + const sn = targetDevice?.sn + if (!sn) return + + addSelfUser({ + dataType: 0, + parentUserId: userInfo.userId, + sn, + scaleDeviceId: sn, + realname: userInfo.realname ?? '', + idCard: userInfo.idCard || null, + sex: userInfo.sex ?? 0, + birthday: userInfo.birthday ?? '', + height: userInfo.height ?? 0, + weight: userInfo.weight ?? 0, + mode: getApp().globalData.operationsEngineer ? 'ops' : 'normal', + }) + .then(() => { + wx.showToast({ title: '添加成功', icon: 'success' }) + this._loadMembers() + }) + .catch(() => { + wx.showToast({ title: '添加失败,请重试', icon: 'none' }) + }) }, /** 添加新用户 */