feat(data): 历史数据页接入统计与历史接口,切换用户抽屉接真实成员

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
17792275749
2026-08-25 10:43:44 +08:00
co-authored by Claude Opus 4.7
parent 0fcb6eebef
commit 18704cbb76
7 changed files with 716 additions and 386 deletions
@@ -1,3 +1,34 @@
import { get } from '../../utils/request/index'
import { leFuService } from '../../lefu/index'
import { calcAge } from '../../utils/idCard/index'
/** GET /weighingScale/v5/select/addMembers/user 返回的单条结构 */
interface AddMemberApiItem {
id: string
realname: string
sex_dictText: '男' | '女'
birthday: string
height: number
weight: number
idCard: string | null
avatar: string | null
dataType?: number
relationType?: number | string | null
}
/** GET /weighingScale/v3/select/history/user 返回的单条结构 */
interface HistoryApiItem {
id: string
userId: string
realname: string
sex: number
height: number
birthday: string
avatar: string | null
relationType: number | string | null
dataType?: number
}
/** 抽屉内部用户项(含回填所需全量字段) */
interface ExistingMember {
id: string
@@ -20,7 +51,7 @@ interface ExistingMember {
/**
* 选择已有用户抽屉组件
* Properties: show(控制显示)
* Properties: show(控制显示)、source(数据来源:addMember/history)、excludeUserId(排除用户)
* Events: close(关闭), select(选中用户,携带 ExistingMember)
*/
Component({
@@ -30,6 +61,11 @@ Component({
type: Boolean,
value: false
},
/** 数据来源模式:addMember=新增用户选择 / history=历史数据切换用户 */
source: {
type: String,
value: 'addMember'
},
/** 需要排除的用户 ID(history 模式下排除当前查看的用户) */
excludeUserId: {
type: String,
@@ -42,64 +78,8 @@ Component({
innerShow: false,
/** 控制 --visible 类,触发 CSS transition */
animVisible: false,
/** 用户列表(静态假数据填充,后续接真实接口替换 */
members: [
{
id: '1',
name: '张晓敏',
gender: '男',
age: 36,
height: 170,
weight: 89.6,
idCard: '',
relationType: 1,
selected: false
},
{
id: '2',
name: '李晓华',
gender: '女',
age: 34,
height: 162,
weight: 52,
idCard: '',
dataType: 1,
selected: false
},
{
id: '3',
name: '王建军',
gender: '男',
age: 40,
height: 175,
weight: 68,
idCard: '',
dataType: 1,
selected: false
},
{
id: '4',
name: '陈静',
gender: '女',
age: 28,
height: 158,
weight: 48,
idCard: '',
dataType: 0,
selected: false
},
{
id: '5',
name: '刘洋',
gender: '男',
age: 30,
height: 180,
weight: 72,
idCard: '',
dataType: 0,
selected: false
}
] as ExistingMember[]
/** 用户列表(组件内部拉取 */
members: [] as ExistingMember[]
},
observers: {
@@ -109,20 +89,85 @@ Component({
*/
show(val: boolean) {
if (val) {
this.setData({innerShow: true})
this._fetchMembers()
this.setData({ innerShow: true })
setTimeout(() => {
this.setData({animVisible: true})
this.setData({ animVisible: true })
}, 20)
} else {
this.setData({animVisible: false})
this.setData({ animVisible: false })
setTimeout(() => {
this.setData({innerShow: false})
this.setData({ innerShow: false })
}, 300)
}
}
},
methods: {
/** 调接口获取可选用户列表,根据 source 调不同接口 */
_fetchMembers() {
const userInfo = wx.getStorageSync('userInfo') as { userId?: string } | null
const userId = userInfo?.userId ?? ''
wx.showLoading({ title: '加载中...', mask: true })
if (this.properties.source === 'history') {
const params: Record<string, string> = { userId }
if (this.properties.excludeUserId) {
params.userIdExclude = this.properties.excludeUserId
}
get<HistoryApiItem[]>('weighingScale/v3/select/history/user', params, { loading: false })
.then((res: any) => {
const members: ExistingMember[] = (res.result ?? []).map((item: HistoryApiItem) => ({
id: item.id,
name: item.realname,
gender: item.sex === 1 ? '男' : '女',
age: calcAge(item.birthday),
height: item.height,
weight: 0,
idCard: '',
avatar: item.avatar ?? '',
userId: item.userId,
sex: item.sex,
birthday: item.birthday,
relationType: item.relationType,
dataType: item.dataType,
}))
this.setData({ members })
})
.catch(() => {
wx.showToast({ title: '加载失败', icon: 'none' })
})
.finally(() => {
wx.hideLoading()
})
} else {
const sn = leFuService.deviceInfo?.serialNumber ?? ''
get<AddMemberApiItem[]>('weighingScale/v5/select/addMembers/user', { 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: calcAge(item.birthday),
height: item.height,
weight: item.weight,
idCard: item.idCard ?? '',
avatar: item.avatar ?? '',
relationType: item.relationType,
dataType: item.dataType,
}))
this.setData({ members })
})
.catch(() => {
wx.showToast({ title: '加载失败', icon: 'none' })
})
.finally(() => {
wx.hideLoading()
})
}
},
/** 点击遮罩关闭 */
onTapMask() {
this.triggerEvent('close')
@@ -133,10 +178,7 @@ Component({
this.triggerEvent('close')
},
/**
* 点击用户行,触发 select 事件
* @param e 携带 data-member 的点击事件
*/
/** 点击用户行,触发 select 事件 */
onTapMember(e: WechatMiniprogram.TouchEvent) {
const member = e.currentTarget.dataset.member as ExistingMember
this.triggerEvent('select', member)