From 422d645c00666435b5d79c0672b00d16fa3f5ccd Mon Sep 17 00:00:00 2001 From: 17792275749 <812100002@qq.com> Date: Thu, 14 May 2026 21:06:32 +0800 Subject: [PATCH] =?UTF-8?q?[AI=20Generated]:=20feat(*):=20=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5v3=E8=AE=BE=E5=A4=87=E5=88=97=E8=A1=A8=E5=8F=8A?= =?UTF-8?q?=E6=88=90=E5=91=98=E7=AE=A1=E7=90=86=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=A8=E5=AD=97=E6=AE=B5=E5=B9=B6=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E8=93=9D=E7=89=99=E8=BF=9E=E6=8E=A5=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miniprogram/pages/equipment/equipment.ts | 8 +- miniprogram/pages/equipment/equipment.wxml | 4 +- .../pages/equipmentMember/equipmentMember.ts | 233 +++++++++++++----- .../equipmentMember/equipmentMember.wxml | 17 +- 4 files changed, 184 insertions(+), 78 deletions(-) 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 - + - + + 他人添加 - + + 编辑 删除