feat(equipmentMember): 用户列表拆分本人/员工/家庭成员三个分区

- 按 dataType 拆分:0=员工 1=家庭成员,relationType=1 归入本人
- 本人区块保留设备容量头部,仅支持编辑
- 员工/家庭成员区块独立显示,空列表自动隐藏
- badge 规则:本人/他人添加显示,自己添加不显示

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
17792275749
2026-06-10 16:36:36 +08:00
co-authored by Claude Opus 4.7
parent 485725a486
commit 099b7613fe
3 changed files with 124 additions and 51 deletions
@@ -56,6 +56,8 @@ interface MemberDisplay {
sex: number
/** 周岁数值,供 lefu 层使用 */
age: number
/** 0=员工 1=家庭成员 */
dataType: number
}
/** 设备卡展示模型 */
@@ -95,9 +97,11 @@ const toDeviceMember = (m: MemberDisplay): DeviceMember => ({
const syncToDevice = (members: MemberDisplay[]): void => {
const deviceMembers = members.map(toDeviceMember)
const total = deviceMembers.length
wx.showLoading({ title: `正在下发第1/${total}个用户...`, mask: true })
wx.showLoading({ title: `加载中...`, mask: true })
console.log(`正在下发第1/${total}个用户...`)
lefuService.syncMembersToDevice(deviceMembers, (current, t) => {
wx.showLoading({ title: `正在下发第${current}/${t}个用户...`, mask: true })
wx.showLoading({ title: `加载中...`, mask: true })
console.log(`正在下发第${current}/${t}个用户...`)
})
.then(() => {
wx.hideLoading()
@@ -127,7 +131,12 @@ Page({
capacityUsed: 0,
capacityTotal: 10,
} as DeviceCard,
memberList: [] as MemberDisplay[],
/** 本人(单个) */
selfMember: null as MemberDisplay | null,
/** 员工列表 */
employeeList: [] as MemberDisplay[],
/** 家庭成员列表 */
familyList: [] as MemberDisplay[],
/** 自定义删除确认弹窗 */
showDeleteModal: false,
deleteTarget: null as MemberDisplay | null,
@@ -155,7 +164,7 @@ Page({
sn: info.serialNumber ?? '',
'deviceCard.name': info.modelNumber ?? '智能体重秤',
})
if (!this.data.memberList.length && info.serialNumber) {
if (!this.data.selfMember && !this.data.employeeList.length && !this.data.familyList.length && info.serialNumber) {
this._loadData(info.serialNumber)
}
})
@@ -198,18 +207,19 @@ Page({
avatar: item.avatar,
sex: item.sex,
age,
dataType: item.dataType,
}
})
const selfMember = list.find(m => m.relationType === 1) || null
const employeeList = list.filter(m => m.relationType !== 1 && m.dataType === 0)
const familyList = list.filter(m => m.relationType !== 1 && m.dataType === 1)
this.setData({
memberList: list,
selfMember,
employeeList,
familyList,
'deviceCard.capacityUsed': list.length,
})
// 首次加载不同步,后续数据变更触发的刷新才同步
// if (this._firstLoad) {
// this._firstLoad = false
// } else {
syncToDevice(list)
// }
syncToDevice(list)
})
.finally(() => {
this.setData({ loading: false })
@@ -225,18 +235,18 @@ Page({
/** 删除用户:弹出自定义确认弹窗 */
onTapDelete(e: WechatMiniprogram.TouchEvent) {
const id = e.currentTarget.dataset.id as string
const target = this.data.memberList.find(m => m.id === id)
const target = this.data.employeeList.find(m => m.id === id)
|| this.data.familyList.find(m => m.id === id)
if (!target) return
// 未连接设备不允许删除
if (!this.data.connected) {
wx.showToast({ title: '请先连接设备', icon: 'none' })
return
}
// 主用户有子用户时不允许删除
if (target.userType === 1) {
const hasSubUser = this.data.memberList.some(m => m.userType !== 1)
const hasSubUser = this.data.employeeList.some(m => m.userType !== 1)
|| this.data.familyList.some(m => m.userType !== 1)
if (hasSubUser) {
wx.showToast({ title: '请先删除所有普通用户', icon: 'none' })
return
@@ -264,22 +274,28 @@ Page({
const id = target.id
// 1. 从列表中移除该用户(立即更新 UI)
const newList = this.data.memberList.filter(m => m.id !== id)
const newEmployeeList = this.data.employeeList.filter(m => m.id !== id)
const newFamilyList = this.data.familyList.filter(m => m.id !== id)
const merged: MemberDisplay[] = [
...(this.data.selfMember ? [this.data.selfMember] : []),
...newEmployeeList,
...newFamilyList,
]
this.setData({
memberList: newList,
'deviceCard.capacityUsed': newList.length,
employeeList: newEmployeeList,
familyList: newFamilyList,
'deviceCard.capacityUsed': merged.length,
showDeleteModal: false,
deleteTarget: null,
})
wx.showLoading({ title: '正在同步设备数据...', mask: true })
// 2. 同步设备
let devicePromise: Promise<void>
if (newList.length) {
if (merged.length) {
devicePromise = lefuService.syncMembersToDevice(
newList.map(toDeviceMember),
merged.map(toDeviceMember),
(current, total) => {
wx.showLoading({ title: `正在同步设备数据 ${current}/${total}...`, mask: true })
},
@@ -290,7 +306,6 @@ Page({
devicePromise
.then(() => {
// 3. 调用删除接口
return del('weighingScale/v2/del/user', { id }, { loading: false })
})
.then(() => {
@@ -299,7 +314,6 @@ Page({
})
.catch((err: Error) => {
wx.hideLoading()
// 失败时重新拉取列表恢复数据
this._loadData(this.data.sn)
wx.showToast({ title: err.message || '删除失败,请重试', icon: 'none' })
})
@@ -311,7 +325,8 @@ Page({
/** 添加用户:未连接态禁用 */
onTapAddMember() {
if (!this.data.connected) return
if (this.data.memberList.length >= 10) {
const total = (this.data.selfMember ? 1 : 0) + this.data.employeeList.length + this.data.familyList.length
if (total >= 10) {
wx.showToast({ title: '超过最大用户限制', icon: 'none' })
return
}