[AI Generated]: feat(*): 对接数据页/测量报告真实接口,完善成员管理、蓝牙连接及成员选择抽屉逻辑

This commit is contained in:
17792275749
2026-05-15 14:10:27 +08:00
parent 5f9232572f
commit e0573857e0
16 changed files with 612 additions and 283 deletions
@@ -1,25 +1,35 @@
/** 成员数据项 */
interface SelectMemberItem {
/** 唯一标识 */
import { get } from '../../utils/request/index'
import { lefuService } from '../../lefu/index'
/** GET /weighingScale/v3/select/addMembers/user 返回的单条结构 */
interface AddMemberApiItem {
id: string
/** 姓名 */
name: string
/** 性别 */
gender: '男' | '女'
/** 年龄 */
age: number
/** 身高(cm) */
realname: string
sex_dictText: '男' | '女'
birthday: string
height: number
/** 头像 URL,无则显示彩色占位圆 */
weight: number
idCard: string | null
avatar: string | null
}
/** 抽屉内部成员项(含回填所需全量字段) */
interface ExistingMember {
id: string
name: string
gender: '男' | '女'
age: number
height: number
weight: number
idCard: string
avatar?: string
/** 是否已选中 */
selected?: boolean
}
/**
* 选择已有成员抽屉组件
* Properties: show(控制显示), members(成员列表)
* Events: close(关闭), select(选中成员,携带 SelectMemberItem)
* Properties: show(控制显示)
* Events: close(关闭), select(选中成员,携带 ExistingMember)
*/
Component({
properties: {
@@ -27,11 +37,6 @@ Component({
show: {
type: Boolean,
value: false
},
/** 成员列表 */
members: {
type: Array,
value: [] as SelectMemberItem[]
}
},
@@ -39,25 +44,25 @@ Component({
/** 控制 wx:ifDOM 是否存在 */
innerShow: false,
/** 控制 --visible 类,触发 CSS transition */
animVisible: false
animVisible: false,
/** 成员列表(组件内部拉取) */
members: [] as ExistingMember[]
},
observers: {
/**
* 监听外部 show 变化,错开两帧
* 打开:先插入 DOM,下一帧加动画类
* 关闭:先移除动画类,等 transition 结束再移除 DOM
* 监听外部 show 变化:
* 打开时先拉数据再展示抽屉;关闭时移除动画类后移除 DOM
*/
show(val: boolean) {
if (val) {
this._fetchMembers()
this.setData({ innerShow: true })
// 延迟一帧,让 DOM 先以初始状态渲染,再触发 transition
setTimeout(() => {
this.setData({ animVisible: true })
}, 20)
} else {
this.setData({ animVisible: false })
// 等 CSS transition 结束(0.3s)再移除 DOM
setTimeout(() => {
this.setData({ innerShow: false })
}, 300)
@@ -66,6 +71,40 @@ Component({
},
methods: {
/** 从生日字符串(YYYY-MM-DD)计算周岁 */
_calcAge(birthday: string): number {
if (!birthday) return 0
const [year, month, day] = birthday.split('-').map(Number)
if (!year || !month || !day) return 0
const now = new Date()
let age = now.getFullYear() - year
if (now.getMonth() + 1 < month || (now.getMonth() + 1 === month && now.getDate() < day)) age -= 1
return Math.max(0, age)
},
/** 调接口获取可选成员列表 */
_fetchMembers() {
const userInfo = wx.getStorageSync('userInfo') as { userId?: string } | null
const sn = lefuService.deviceInfo?.serialNumber ?? ''
get<AddMemberApiItem[]>('weighingScale/v3/select/addMembers/user', {
userId: userInfo?.userId ?? '',
sn,
}, { loading: false })
.then((res: any) => {
const members: ExistingMember[] = (res.result ?? []).map((item: AddMemberApiItem) => ({
id: item.id,
name: item.realname,
gender: item.sex_dictText,
age: this._calcAge(item.birthday),
height: item.height,
weight: item.weight,
idCard: item.idCard ?? '',
avatar: item.avatar ?? '',
}))
this.setData({ members })
})
},
/** 点击遮罩关闭 */
onTapMask() {
this.triggerEvent('close')
@@ -81,7 +120,7 @@ Component({
* @param e 携带 data-member 的点击事件
*/
onTapMember(e: WechatMiniprogram.TouchEvent) {
const member = e.currentTarget.dataset.member as SelectMemberItem
const member = e.currentTarget.dataset.member as ExistingMember
this.triggerEvent('select', member)
}
}