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);
+ });
}
},