diff --git a/miniprogram/pages/equipment/equipment.ts b/miniprogram/pages/equipment/equipment.ts
index 2076916..609b41c 100644
--- a/miniprogram/pages/equipment/equipment.ts
+++ b/miniprogram/pages/equipment/equipment.ts
@@ -30,6 +30,8 @@ interface DeviceRecord {
remark: string | null
relationType: string | null
sex_dictText: string
+ /** 设备连接信息 JSON 字符串,与登录接口返回格式一致 */
+ connectDeviceInfo: string
}
/** 展示用设备项 */
@@ -76,11 +78,11 @@ Page({
})
},
- /* 点击「成员管理」→ 跳转成员管理页 */
+ /* 点击「成员管理」→ 跳转成员管理页,传 SN;userId 由目标页从缓存读取 */
onTapMember(e: WechatMiniprogram.TouchEvent) {
- const id = e.currentTarget.dataset.id as string
+ const sn = e.currentTarget.dataset.sn as string
wx.navigateTo({
- url: `/pages/equipmentMember/equipmentMember?id=${id}`
+ url: `/pages/equipmentMember/equipmentMember?sn=${sn}`
})
},
diff --git a/miniprogram/pages/equipment/equipment.wxml b/miniprogram/pages/equipment/equipment.wxml
index 152da66..17a1f53 100644
--- a/miniprogram/pages/equipment/equipment.wxml
+++ b/miniprogram/pages/equipment/equipment.wxml
@@ -36,14 +36,14 @@
- 成员管理
+ 成员管理
连接
- 成员管理
+ 成员管理
diff --git a/miniprogram/pages/equipmentMember/equipmentMember.ts b/miniprogram/pages/equipmentMember/equipmentMember.ts
index 4410412..e2548b8 100644
--- a/miniprogram/pages/equipmentMember/equipmentMember.ts
+++ b/miniprogram/pages/equipmentMember/equipmentMember.ts
@@ -1,36 +1,106 @@
+import { get } from '../../utils/request/index'
import { lefuService } from '../../lefu/index'
import type { DeviceMember } from '../../lefu/index'
-import { mockMembers } from '../../mock/member.mock'
-import type { MemberItem } from '../../mock/member.mock'
-/** 设备卡片 */
-interface DeviceCard {
+/** GET /weighingScale/v3/selectUserBySn/user 返回的 result 单条结构 */
+interface SysUserDevice {
id: string
+ userId: string
+ parentUserId: string | null
+ scaleDeviceId: string
+ deviceId: string | null
+ deviceType: string
+ dataType: number
+ /** 用户类型:1=主用户 0=子用户 */
+ userType: number
+ idCard: string
+ height: number
+ weight: number
+ birthday: string
+ /** 性别:1=男 2=女 */
+ sex: number
+ avatar: string | null
+ phone: string | null
+ thirdId: string | null
+ realname: string
+ bmi: number
+ createBy: string | null
+ createTime: string | null
+ updateBy: string | null
+ updateTime: string | null
+ delFlag: number
+ sn: string | null
+ workNo: string | null
+ remark: string | null
+ connectDeviceInfo: string | null
+ /** 关系标记:1=本人 2=自己添加 3=他人添加 */
+ relationType: number | null
+}
+
+/** 页面展示用成员模型 */
+interface MemberDisplay {
+ id: string
+ realname: string
+ /** '男' | '女' */
+ sex_dictText: string
+ /** 周岁,由 birthday 计算而来 */
+ ageDisplay: string
+ height: number
+ /** 1=本人 2=自己添加 3=他人添加 */
+ relationType: number
+ userType: number
+ avatar: string | null
+ /** 原始 sex 数值,供 lefu 层转换使用 */
+ sex: number
+ /** 周岁数值,供 lefu 层使用 */
+ age: number
+}
+
+/** 设备卡展示模型 */
+interface DeviceCard {
+ /** 设备 SN,来自接口返回的 scaleDeviceId */
name: string
capacityUsed: number
capacityTotal: number
}
/**
- * MemberItem → DeviceMember 转换
- * lefu 层只认识 DeviceMember,业务层负责转换
+ * 从生日字符串(YYYY-MM-DD)计算周岁
+ * @param birthday 生日字符串
*/
-function toDeviceMember(m: MemberItem): DeviceMember {
+function calcAge(birthday: string): number {
+ if (!birthday) return 0
+ const parts = birthday.split('-').map(Number)
+ const [year, month, day] = parts
+ if (!year || !month || !day) return 0
+ const now = new Date()
+ let age = now.getFullYear() - year
+ const nowMonth = now.getMonth() + 1
+ const nowDay = now.getDate()
+ if (nowMonth < month || (nowMonth === month && nowDay < day)) age -= 1
+ return Math.max(0, age)
+}
+
+/**
+ * MemberDisplay → DeviceMember 转换,供 lefu 同步层使用
+ * @param m 展示用成员
+ */
+function toDeviceMember(m: MemberDisplay): DeviceMember {
return {
id: m.id,
- name: m.name,
- gender: m.gender === '男' ? 1 : 0,
+ name: m.realname,
+ gender: m.sex === 1 ? 1 : 0,
age: m.age,
height: m.height,
- isSelf: m.isSelf,
+ isSelf: m.relationType === 1,
}
}
/**
* 将成员列表全量同步到设备
- * 成功/失败均给出 Toast 提示
+ * @param members 展示用成员列表
*/
-function syncToDevice(members: MemberItem[]): void {
+function syncToDevice(members: MemberDisplay[]): void {
const deviceMembers = members.map(toDeviceMember)
wx.showLoading({ title: '正在同步成员...', mask: true })
lefuService.syncMembersToDevice(deviceMembers)
@@ -44,42 +114,105 @@ function syncToDevice(members: MemberItem[]): void {
})
}
+/**
+ * 设备成员管理页
+ * 通过 URL 参数 sn + 缓存中的 userId 拉取成员列表
+ * 连接状态实时读取 lefuService
+ */
Page({
data: {
- /** 设备连接状态(后续接入 lefuService.onConnectState 替换) */
- connected: true,
-
+ connected: false,
+ /** 当前设备 SN,由 onLoad 从 URL 参数写入 */
+ sn: '',
+ loading: false,
deviceCard: {
- id: 'device-001',
- name: 'MX-W30A1',
+ name: '',
capacityUsed: 0,
capacityTotal: 10,
} as DeviceCard,
-
- memberList: [] as MemberItem[],
+ memberList: [] as MemberDisplay[],
},
- onLoad() {
- this._loadMembers()
- },
-
- /** 从 storage / mock 加载成员列表 */
- _loadMembers() {
- const list: MemberItem[] = wx.getStorageSync('memberList') || mockMembers
+ onLoad(options: Record) {
+ const sn = options.sn ?? ''
this.setData({
- memberList: list,
- 'deviceCard.capacityUsed': list.length,
+ sn,
+ // 读取 lefuService 当前连接状态作为初始值
+ connected: lefuService.isConnected,
+ })
+ // 监听蓝牙连接/断连,实时更新状态
+ lefuService.onDeviceConnect(() => {
+ this.setData({ connected: true })
+ })
+ lefuService.onDisconnected(() => {
+ this.setData({ connected: false })
})
},
- /** 编辑成员 */
+ onShow() {
+ // 每次页面显示(含首次进入和从子页返回)均刷新列表
+ if (this.data.sn) {
+ this._loadData(this.data.sn)
+ }
+ },
+
+ onUnload() {
+ // 页面销毁时清空回调,避免对已卸载页面调用 setData
+ lefuService.onDeviceConnect(() => {})
+ lefuService.onDisconnected(() => {})
+ },
+
+ /**
+ * 调 v3 接口拉取成员列表,成功后更新设备名与成员数据
+ * @param sn 设备 SN
+ */
+ _loadData(sn: string) {
+ const userInfo = wx.getStorageSync('userInfo') as { userId?: string } | null
+ const userId = userInfo?.userId ?? ''
+ this.setData({ loading: true })
+
+ get('weighingScale/v3/selectUserBySn/user', { sn, userId })
+ .then(res => {
+ const list = res.result.map(item => {
+ const age = calcAge(item.birthday)
+ return {
+ id: item.id,
+ realname: item.realname,
+ sex_dictText: item.sex === 1 ? '男' : '女',
+ ageDisplay: String(age),
+ height: item.height,
+ relationType: item.relationType ?? 2,
+ userType: item.userType,
+ avatar: item.avatar,
+ sex: item.sex,
+ age,
+ }
+ })
+ // 设备名取首条记录的 scaleDeviceId,兜底用传入的 sn
+ const name = res.result[0]?.scaleDeviceId ?? sn
+ this.setData({
+ memberList: list,
+ 'deviceCard.name': name,
+ 'deviceCard.capacityUsed': list.length,
+ })
+ // 列表有变更且已连接时才同步到设备
+ const hasChange = JSON.stringify(this.data.memberList) !== JSON.stringify(list)
+ if (this.data.connected && hasChange) {
+ syncToDevice(list)
+ }
+ })
+ .finally(() => {
+ this.setData({ loading: false })
+ })
+ },
+
+ /** 编辑成员(接口待接入) */
onTapEdit(e: WechatMiniprogram.TouchEvent) {
const id = e.currentTarget.dataset.id as string
- // TODO: 跳转编辑成员页面,编辑完成后同样需要调用 syncToDevice
wx.showToast({ title: `编辑 ${id}`, icon: 'none' })
},
- /** 删除成员:更新本地 → 同步设备 */
+ /** 删除成员(接口待接入) */
onTapDelete(e: WechatMiniprogram.TouchEvent) {
const id = e.currentTarget.dataset.id as string
wx.showModal({
@@ -87,46 +220,14 @@ Page({
content: '确定删除该成员?',
success: (res) => {
if (!res.confirm) return
-
- const list = this.data.memberList.filter(m => m.id !== id)
- wx.setStorageSync('memberList', list)
- this.setData({
- memberList: list,
- 'deviceCard.capacityUsed': list.length,
- })
-
- // 删除后立即同步到设备
- if (this.data.connected) {
- syncToDevice(list)
- }
+ wx.showToast({ title: '删除功能待接入', icon: 'none' })
},
})
},
- /** 添加成员:跳转 addMember 页(未连接态禁用) */
+ /** 添加成员:未连接态禁用 */
onTapAddMember() {
if (!this.data.connected) return
- wx.navigateTo({
- url: '/pages/addMember/addMember',
- })
- },
-
- /**
- * addMember 页保存成功后返回时刷新列表并同步设备
- * 在 onShow 中检测 storage 变化
- */
- onShow() {
- const stored: MemberItem[] = wx.getStorageSync('memberList') || []
- const current = this.data.memberList
- // 数量有变化说明刚刚新增了成员
- if (stored.length !== current.length) {
- this.setData({
- memberList: stored,
- 'deviceCard.capacityUsed': stored.length,
- })
- if (this.data.connected) {
- syncToDevice(stored)
- }
- }
+ wx.navigateTo({ url: '/pages/addMember/addMember' })
},
})
diff --git a/miniprogram/pages/equipmentMember/equipmentMember.wxml b/miniprogram/pages/equipmentMember/equipmentMember.wxml
index 385634e..0d78f60 100644
--- a/miniprogram/pages/equipmentMember/equipmentMember.wxml
+++ b/miniprogram/pages/equipmentMember/equipmentMember.wxml
@@ -43,26 +43,29 @@
- {{ item.name }}
-
+ {{ item.realname }}
+
+
本人
- {{ item.gender }}
+ {{ item.sex_dictText }}
·
- {{ item.age }}岁
+ {{ item.ageDisplay }}岁
|
{{ item.height }}cm
-
+
-
+
+
他人添加
-
+
+
编辑
删除