From 4fc829a81f00cebfa3a71364be524619a4ba25df Mon Sep 17 00:00:00 2001 From: 17792275749 <812100002@qq.com> Date: Mon, 13 Apr 2026 13:21:59 +0800 Subject: [PATCH] =?UTF-8?q?[AI=20Generated]:=20feat(Comp):=20=E9=87=8D?= =?UTF-8?q?=E5=86=99=E7=94=A8=E6=88=B7=E5=90=8C=E6=AD=A5=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=BB=E5=AD=90=E7=94=A8=E6=88=B7=E3=80=81?= =?UTF-8?q?=E7=A7=BB=E9=99=A4callWithTimeout=E3=80=81=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=8A=E9=99=9010=E4=BA=BA=E5=8F=8A?= =?UTF-8?q?=E4=B8=BB=E7=94=A8=E6=88=B7=E5=88=A0=E9=99=A4=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 40 +--- .../configureDevice_2/configureDevice_2.js | 205 ++++++------------ .../configureDevice_2_addUser.js | 8 +- .../configureDevice_2_addUser.wxml | 4 +- .../configureDevice_3/configureDevice_3.js | 23 +- .../configureDevice_3/configureDevice_3.wxml | 2 +- .../configureDevice_4/configureDevice_4.js | 38 +--- .../configureDevice_4/configureDevice_4.wxml | 2 + .../replaceNetwork_3/replaceNetwork_3.js | 60 ++--- 9 files changed, 118 insertions(+), 264 deletions(-) diff --git a/app.js b/app.js index b4b540d..cf0ba96 100644 --- a/app.js +++ b/app.js @@ -5,8 +5,8 @@ App({ globalData: { // wx.request 请求的服务地址 - wxRequestUrl: "https://device.shuziweidao.com/gateway/", - // wxRequestUrl: "http://192.168.1.207:8889/", + // wxRequestUrl: "https://device.shuziweidao.com/gateway/", + wxRequestUrl: "http://192.168.1.207:8889/", // 秤的所有信息 ppScale: { @@ -14,10 +14,10 @@ App({ plugin: null, activeProtocol: null, - domain1: "http://device.shuziweidao.com:80/gateway", // 老版本 没有鉴权 - domain2: "http://device.shuziweidao.com:80/weight", // 新版本 有鉴权 - // domain1: "http://192.168.1.207:8889", // 老版本 没有鉴权 - // domain2: "http://192.168.1.207:8889/weight", // 新版本 有鉴权 + // domain1: "http://device.shuziweidao.com:80/gateway", // 老版本 没有鉴权 + // domain2: "http://device.shuziweidao.com:80/weight", // 新版本 有鉴权 + domain1: "http://192.168.1.207:8889", // 老版本 没有鉴权 + domain2: "http://192.168.1.207:8889/weight", // 新版本 有鉴权 wifi: { ssid: "", password: "" @@ -332,32 +332,4 @@ App({ } } }, - - /** - * 给回调式 SDK 调用包裹超时保护,防止设备无响应时 UI 永久卡死 - * @param {Function} caller 接收 done 回调的执行函数,形如 (done) => sdk.method(params, done) - * @param {number} timeout 超时毫秒数 - * @param {Function} onResult 正常回调,参数与 SDK 原始回调一致 - * @param {Function} onTimeout 超时后执行,负责 hideLoading + 提示 - */ - callWithTimeout(caller, timeout, onResult, onTimeout) { - let settled = false; - const timer = setTimeout(() => { - if (settled) return; - settled = true; - onTimeout(); - }, timeout); - caller((res) => { - if (settled) return; - settled = true; - clearTimeout(timer); - onResult(res); - }); - // 返回取消函数,供组件/页面在销毁时调用,静默取消超时 - return () => { - if (settled) return; - settled = true; - clearTimeout(timer); - }; - }, }) \ No newline at end of file diff --git a/components/configureDevice_2/configureDevice_2.js b/components/configureDevice_2/configureDevice_2.js index 8d545a0..bb91cfe 100644 --- a/components/configureDevice_2/configureDevice_2.js +++ b/components/configureDevice_2/configureDevice_2.js @@ -1,9 +1,6 @@ const app = getApp(); import $ from "../../utils/request"; -// 超时时间:15 秒 -const SDK_TIMEOUT = 15000; - /** * 根据生日计算年龄 * @param {string} birthday 生日字符串,如 "1990-05-20" @@ -56,7 +53,6 @@ Component({ if (this._connectStateWatcher) { app.unwatch('ppScale.device.connectState', this._connectStateWatcher); } - if (this._sdkCancel) { this._sdkCancel(); this._sdkCancel = null; } } }, @@ -101,14 +97,16 @@ Component({ }, addUser() { - if (this.data.userList.length >= 5) { - wx.showToast({ - title: "超过最大用户数", + if (this.data.userList.length >= 10) { + wx.showToast({ + title: "超过最大用户数", icon: "none" }); return; } - this.selectComponent("#configureDevice2AddUser").showModal(); + // 列表为空时,第一个用户只能是员工(主用户) + const isFirstUser = this.data.userList.length === 0; + this.selectComponent("#configureDevice2AddUser").showModal(isFirstUser); }, getAddUserInfo() { @@ -146,6 +144,17 @@ Component({ // 删除用户 delUserClick(e) { let id = e.currentTarget.dataset.id; + const userList = this.data.userList; + const target = userList.find(u => u.id === id); + + // 主用户(userType=1)有子用户时不允许删除 + if (target && target.userType === 1) { + const hasSubUser = userList.some(u => u.userType === 0); + if (hasSubUser) { + wx.showToast({ title: "请先删除所有普通用户", icon: "none" }); + return; + } + } wx.showModal({ title: "提示", content: "确定要删除该用户吗?", @@ -188,99 +197,29 @@ Component({ return; } - // 获取设备端已有用户,与用户列表做双向同步 - wx.showLoading({ title: "正在同步用户信息...", mask: true }); - this._sdkCancel = app.callWithTimeout( - (done) => app.globalData.ppScale.activeProtocol.dataFetchUserID(done), - SDK_TIMEOUT, - (deviceUserIds) => { - console.log("设备端已有用户ID列表", deviceUserIds); + // 找出主用户,所有用户下发时 userID 统一使用主用户的 userId + const mainUser = userList.find(u => u.userType === 1); + if (!mainUser) { + wx.showToast({ title: "未找到主用户,请先添加员工用户", icon: "none" }); + return; + } + const mainUserId = mainUser.userId; - // 回调返回非数组视为获取失败 - if (!Array.isArray(deviceUserIds)) { + wx.showLoading({ title: "正在同步用户数据...", mask: true }); + + // 第一步:清除秤上所有用户信息 + app.globalData.ppScale.activeProtocol.codeClearDeviceData("01", (clearRes) => { + console.log("codeClearDeviceData res", clearRes); + if (clearRes !== 0x00) { wx.hideLoading(); - wx.showToast({ title: "获取设备用户列表失败,请重试", icon: "none" }); + wx.showToast({ title: "同步用户失败,请重试", icon: "none" }); return; } - let rawList = deviceUserIds; - // SDK 返回的是 userID 数组,统一转为对象方便后续操作 - let deviceIds = rawList.map(item => ({ - userID: String(item), - memberID: "" - })); - // 本地列表的 userId 统一转字符串,与 SDK 侧类型对齐 - let localIds = userList.map(user => String(user.userId)); - - // 秤有、列表没有 → 需要从秤删除 - let needDeleteList = deviceIds.filter(d => !localIds.includes(d.userID)); - - // 秤没有、列表有 → 需要下发到秤 - let needSyncList = userList.filter(user => !deviceIds.some(d => d.userID === String(user.userId))); - - console.log("需删除", needDeleteList, "需下发", needSyncList); - - // 无需操作时直接完成 - if (!needDeleteList.length && !needSyncList.length) { - wx.hideLoading(); - wx.showToast({ title: "用户信息已同步", icon: "success" }); - setTimeout(() => { - this._checkWifiAndNext(); - }, 1500); - return; - } - - // 第一步:逐个下发新用户到秤 + // 第二步:全量下发本地用户列表 let syncIndex = 0; const syncNext = () => { - if (syncIndex >= needSyncList.length) { - // 下发完成,开始删除 - if (needDeleteList.length) { - wx.showLoading({ title: "正在删除多余用户...", mask: true }); - } - deleteNext(); - return; - } - wx.showLoading({ title: "正在下发第" + (syncIndex + 1) + "/" + needSyncList.length + "个用户...", mask: true }); - let user = needSyncList[syncIndex]; - this._sdkCancel = app.callWithTimeout( - (done) => app.globalData.ppScale.activeProtocol.dataSyncUserInfo({ - userID: user.userId, - userName: user.realname, - memberID: "", - age: user.age || '', - gender: user.sex === 2 ? 0 : user.sex, - height: String(user.height || ''), - isAthleteMode: 0, - deviceHeaderIndex: syncIndex, - currentWeight: String(user.weight || ''), - targetWeight: "", - idealWeight: "", - recentData: [], - }, done), - SDK_TIMEOUT, - (res) => { - if (res == 0) { - syncIndex++; - syncNext(); - } else { - wx.hideLoading(); - console.log("dataSyncUserInfo 失败", res); - wx.showToast({ title: "用户信息下发失败,请重试。", icon: "none" }); - } - }, - () => { - wx.hideLoading(); - wx.showToast({ title: "用户下发超时,请重试", icon: "none" }); - } - ); - }; - - // 第二步:逐个删除秤端多余用户 - let delIndex = 0; - const deleteNext = () => { - if (delIndex >= needDeleteList.length) { - // 全部完成 + if (syncIndex >= userList.length) { wx.hideLoading(); wx.showToast({ title: "用户信息同步成功", icon: "success" }); setTimeout(() => { @@ -288,39 +227,36 @@ Component({ }, 1500); return; } - wx.showLoading({ title: "正在删除第" + (delIndex + 1) + "/" + needDeleteList.length + "个多余用户...", mask: true }); - let item = needDeleteList[delIndex]; - this._sdkCancel = app.callWithTimeout( - (done) => app.globalData.ppScale.activeProtocol.dataDeleteUser({ - userID: item.userID, - memberID: "" - }, done), - SDK_TIMEOUT, - (status) => { - if (status == 0) { - delIndex++; - deleteNext(); - } else { - wx.hideLoading(); - console.log("dataDeleteUser 失败", status); - wx.showToast({ title: "删除设备用户失败,请重试。", icon: "none" }); - } - }, - () => { + const user = userList[syncIndex]; + // 主用户 memberID 为空,子用户 memberID 为子用户自己的 userId + const memberID = user.userId === mainUserId ? "" : user.userId; + wx.showLoading({ title: "正在下发第" + (syncIndex + 1) + "/" + userList.length + "个用户...", mask: true }); + app.globalData.ppScale.activeProtocol.dataSyncUserInfo({ + userID: mainUserId, + userName: user.realname, + memberID: memberID, + age: user.age || '', + gender: user.sex === 2 ? 0 : user.sex, + height: user.height || '', + isAthleteMode: 0, + deviceHeaderIndex: syncIndex, + currentWeight: user.weight || '', + targetWeight: "", + idealWeight: "", + recentData: [], + }, (res) => { + console.log("dataSyncUserInfo res", res, "user:", user.realname, "userID:", mainUserId, "memberID:", memberID); + if (res == 0) { + syncIndex++; + syncNext(); + } else { wx.hideLoading(); - wx.showToast({ title: "删除用户超时,请重试", icon: "none" }); + wx.showToast({ title: "用户信息下发失败,请重试。", icon: "none" }); } - ); + }); }; - - // 从下发开始执行 syncNext(); - }, - () => { - wx.hideLoading(); - wx.showToast({ title: "获取设备用户超时,请重试", icon: "none" }); - } - ); + }); }, /** @@ -330,20 +266,17 @@ Component({ */ _checkWifiAndNext() { wx.showLoading({ title: "正在检测配网状态...", mask: true }); - this._sdkCancel = app.callWithTimeout( - (done) => app.globalData.ppScale.activeProtocol.codeFetchWifiConfig(done), - SDK_TIMEOUT, - (res) => { - wx.hideLoading(); - // 0x01 表示已配网,跳过配网步骤直接进入下一步 - const progressIndex = res === 0x01 ? 3 : 2; - this.triggerEvent('deviceEvent', { status: true, progressIndex }); - }, - () => { - wx.hideLoading(); - wx.showToast({ title: "检测配网状态超时,请重试。", icon: "none" }); + app.globalData.ppScale.activeProtocol.codeFetchWifiConfig((res) => { + wx.hideLoading(); + if (res === undefined || res === null) { + // 获取失败,自动重试 + this._checkWifiAndNext(); + return; } - ); + // 0x01 表示已配网,跳过配网步骤直接进入下一步 + const progressIndex = res === 0x01 ? 3 : 2; + this.triggerEvent('deviceEvent', { status: true, progressIndex }); + }); }, } }); \ No newline at end of file diff --git a/components/configureDevice_2_addUser/configureDevice_2_addUser.js b/components/configureDevice_2_addUser/configureDevice_2_addUser.js index bbe1ef4..d5a3172 100644 --- a/components/configureDevice_2_addUser/configureDevice_2_addUser.js +++ b/components/configureDevice_2_addUser/configureDevice_2_addUser.js @@ -8,6 +8,8 @@ Component({ data: { animationData: null, modalStatus: false, + // 是否是第一个用户(主用户),true 时只能选员工 + isFirstUser: false, // 用户类型:employee=员工,family=家庭用户 userType: 'employee', // 员工模式 @@ -38,7 +40,8 @@ Component({ }, methods: { // 显示对话框 - showModal() { + showModal(isFirstUser = false) { + this.setData({ isFirstUser: !!isFirstUser }); // 先瞬间将弹窗移到屏幕下方(duration:0,不产生过渡) let initAnim = wx.createAnimation({ duration: 0 }); initAnim.translateY(1200).step(); @@ -66,6 +69,7 @@ Component({ // 关闭弹窗并重置所有数据 closeModal() { this.setData({ + isFirstUser: false, userType: 'employee', workNo: "", userInfo: null, @@ -83,6 +87,8 @@ Component({ // 切换用户类型,同时清空所有已填数据 switchUserType(e) { + // 主用户模式下禁止切换 + if (this.data.isFirstUser) return; const type = e.currentTarget.dataset.type; if (type === this.data.userType) return; this.setData({ diff --git a/components/configureDevice_2_addUser/configureDevice_2_addUser.wxml b/components/configureDevice_2_addUser/configureDevice_2_addUser.wxml index ef2f00e..7fcf8d0 100644 --- a/components/configureDevice_2_addUser/configureDevice_2_addUser.wxml +++ b/components/configureDevice_2_addUser/configureDevice_2_addUser.wxml @@ -8,8 +8,8 @@ 添加用户 - - + + activeProtocol.dataFindSurroundDevice(done), - SDK_TIMEOUT, - (res) => { - wx.hideLoading(); - this.setData({ wifiList: Array.isArray(res) ? res : [] }); - }, - () => { - wx.hideLoading(); - wx.showToast({ title: "获取Wi-Fi列表超时,请重试", icon: "none" }); + activeProtocol.dataFindSurroundDevice((res) => { + wx.hideLoading(); + if (!Array.isArray(res)) { + // 获取失败,自动重试 + this.initWifi(); + return; } - ); + this.setData({ wifiList: res }); + }); }, // 最小化后重连,重置所有状态并重新获取 WiFi 列表 diff --git a/components/configureDevice_3/configureDevice_3.wxml b/components/configureDevice_3/configureDevice_3.wxml index 4d839ff..f58830b 100644 --- a/components/configureDevice_3/configureDevice_3.wxml +++ b/components/configureDevice_3/configureDevice_3.wxml @@ -26,7 +26,7 @@ - 获取WIFI失败 + 暂无WIFI数据,点击重新获取 diff --git a/components/configureDevice_4/configureDevice_4.js b/components/configureDevice_4/configureDevice_4.js index e609f67..d8f3953 100644 --- a/components/configureDevice_4/configureDevice_4.js +++ b/components/configureDevice_4/configureDevice_4.js @@ -4,6 +4,10 @@ Component({ data: {}, methods: { + bindOk() { + wx.switchTab({ url: '/pages/home/home' }); + }, + // 开始 OTA 升级 startOtaUpgrade() { const activeProtocol = app.globalData.ppScale.activeProtocol; @@ -13,42 +17,10 @@ Component({ return; } - wx.showLoading({ title: '正在升级固件,请稍候...', mask: true }); - - // 重置完成标志位,防止回调重复触发 - this._otaCompleted = false; - // status: false = 成功,true = 失败 activeProtocol.codeOtaUpdate((status) => { - // 延迟 3 秒,让 Loading 多转一会再收口 - setTimeout(() => { - if (status == 0) { - // status false → 升级成功 - this._finish(true); - } else { - // status true → 升级失败 - this._finish(false, '固件升级失败'); - } - }, 3000); + console.log(status); }); - }, - - // 统一收口:成功/失败提示后跳转首页 - _finish(success, failMsg) { - if (this._otaCompleted) return; - this._otaCompleted = true; - wx.hideLoading(); - - if (success) { - wx.showToast({ title: '固件升级成功', icon: 'success', duration: 2000 }); - } else { - wx.showToast({ title: failMsg || '固件升级失败', icon: 'none', duration: 2000 }); - } - - setTimeout(() => { - app.cleanupConnection(); - wx.switchTab({ url: '/pages/home/home' }); - }, 2000); } } }); diff --git a/components/configureDevice_4/configureDevice_4.wxml b/components/configureDevice_4/configureDevice_4.wxml index ff27bb8..7d29bcf 100644 --- a/components/configureDevice_4/configureDevice_4.wxml +++ b/components/configureDevice_4/configureDevice_4.wxml @@ -7,4 +7,6 @@ 随时随地同步测量数据 + + 完成 diff --git a/components/replaceNetwork_3/replaceNetwork_3.js b/components/replaceNetwork_3/replaceNetwork_3.js index c57571a..16357f5 100644 --- a/components/replaceNetwork_3/replaceNetwork_3.js +++ b/components/replaceNetwork_3/replaceNetwork_3.js @@ -1,9 +1,6 @@ const app = getApp(); import $ from "../../utils/request"; -// 超时时间:15 秒 -const SDK_TIMEOUT = 15000; - Component({ properties: { ssid: { @@ -26,7 +23,6 @@ Component({ this.setNerwork(); }, detached() { - if (this._sdkCancel) { this._sdkCancel(); this._sdkCancel = null; } } }, @@ -37,46 +33,26 @@ Component({ let password = this.properties.password; let version = app.globalData.ppScale.version; if (version === 'domain1') { - this._sdkCancel = app.callWithTimeout( - (done) => app.globalData.ppScale.activeProtocol.dataConfigNetWork({ - domain: app.globalData.ppScale.domain1, - ssid: ssid, - password: password - }, done), - SDK_TIMEOUT, - (res) => { - console.log("setNetwork.js dataConfigNetWork 1", res); - this.netWorkCallBack(res); - }, - () => { - wx.showToast({ title: "配网超时,请重试", icon: "none" }); - setTimeout(() => { - this.triggerEvent('wifiEvent', { status: false }); - }, 1500); - } - ); + app.globalData.ppScale.activeProtocol.dataConfigNetWork({ + domain: app.globalData.ppScale.domain1, + ssid: ssid, + password: password + }, (res) => { + console.log("setNetwork.js dataConfigNetWork 1", res); + this.netWorkCallBack(res); + }); } if (version === 'domain2') { - this._sdkCancel = app.callWithTimeout( - (done) => app.globalData.ppScale.activeProtocol.dataConfigUserNetWork({ - domain: app.globalData.ppScale.domain2, - ssid: ssid, - password: password, - userName: "apiUser", - userPassword: "3acebb95eb49577e9c2a2082589b9bd6" - }, done), - SDK_TIMEOUT, - (res) => { - console.log("setNetwork.js dataConfigUserNetWork 2", res); - this.netWorkCallBack(res); - }, - () => { - wx.showToast({ title: "配网超时,请重试", icon: "none" }); - setTimeout(() => { - this.triggerEvent('wifiEvent', { status: false }); - }, 1500); - } - ); + app.globalData.ppScale.activeProtocol.dataConfigUserNetWork({ + domain: app.globalData.ppScale.domain2, + ssid: ssid, + password: password, + userName: "apiUser", + userPassword: "3acebb95eb49577e9c2a2082589b9bd6" + }, (res) => { + console.log("setNetwork.js dataConfigUserNetWork 2", res); + this.netWorkCallBack(res); + }); } },