From dbb2ab842304c1656bfe5950882e57300a38921c Mon Sep 17 00:00:00 2001 From: 17792275749 <812100002@qq.com> Date: Thu, 27 Aug 2026 14:02:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=93=9D=E7=89=99?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E8=AF=AF=E6=8A=A5=E4=B8=8E=20WiFi=20?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=8E=B7=E5=8F=96=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=B8=80=E9=94=AE=E6=B7=BB=E5=8A=A0=E6=9C=AC?= =?UTF-8?q?=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - connectedDevice 忽略 connect 过程中的 UNAVAILABLE 抖动,避免误报蓝牙关闭 - getWifiList 加 settled 保护,onStartSearch 加防重入 - userManagement 一键添加本人(仅加后台、不下发设备) Co-Authored-By: Claude Opus 4.7 --- miniprogram/lefu/service.ts | 19 ++++++---- miniprogram/pages/addUser/addUser.ts | 1 + .../pages/connectedDevice/connectedDevice.ts | 7 ++-- .../pages/connectedWifi/connectedWifi.ts | 8 +++- .../pages/userManagement/userManagement.ts | 37 +++++++++++++++++-- 5 files changed, 56 insertions(+), 16 deletions(-) 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' }) + }) }, /** 添加新用户 */