From f68bd299a7d6c74bec2a19cef8b42bddd97c6f85 Mon Sep 17 00:00:00 2001 From: ozh Date: Thu, 17 Sep 2026 11:38:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(family):=20=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E5=85=B3=E7=88=B1=E5=AF=B9=E8=B1=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=B8=8E=E6=88=90=E5=91=98=E5=88=97=E8=A1=A8=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 详情页新增「关爱对象」区:getCareMemberList 拉取并渲染姓名+联系人摘要,上限判定改以实际列表长度为准 - 成员区 HomeMember 主键按 transferOwner 入参修正为 memberId,显示名兼容 nickName/name 兜底 - 两个列表空态给出提示文案,不再渲染空白卡片 --- src/api/careMember.ts | 4 +-- src/api/home.ts | 5 +-- src/pages/family/detail.module.scss | 14 ++++++++ src/pages/family/detail.tsx | 53 ++++++++++++++++++++++++----- 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/api/careMember.ts b/src/api/careMember.ts index c55df25..0e75d9f 100644 --- a/src/api/careMember.ts +++ b/src/api/careMember.ts @@ -19,14 +19,14 @@ export interface CareMemberSaveParams { contacts: CareContact[] // 最多 5 名 } -// 列表项(响应字段文档未给出,按保存入参推断,联调修正) +// 列表项(响应字段文档为泛型占位未给出,按保存入参推断,联调实测修正) export interface CareMember { memberId: string homeId: string name: string idNumber: string address: string - contacts: CareContact[] + contacts: CareContact[] | null } export function saveCareMember(params: CareMemberSaveParams): Promise { diff --git a/src/api/home.ts b/src/api/home.ts index fac6bc8..d29a3df 100644 --- a/src/api/home.ts +++ b/src/api/home.ts @@ -12,10 +12,11 @@ export interface HomeInfo { deviceCount: number } +// 响应字段文档为泛型占位未给出;主键按 transferOwner/updateMemberNickName 入参的 memberId 推断,联调实测修正 export interface HomeMember { - userId: string + memberId: string nickName: string - isOwner: boolean + isOwner?: boolean mobile?: string } diff --git a/src/pages/family/detail.module.scss b/src/pages/family/detail.module.scss index 78ba981..2d3986c 100644 --- a/src/pages/family/detail.module.scss +++ b/src/pages/family/detail.module.scss @@ -73,3 +73,17 @@ .section { margin-top: 24px; } + +.sectionTitle { + display: block; + font-size: 26px; + color: $color-text-secondary; + margin: 8px 8px 16px; +} + +.sectionEmpty { + display: block; + padding: 32px 8px; + font-size: 26px; + color: $color-text-tertiary; +} diff --git a/src/pages/family/detail.tsx b/src/pages/family/detail.tsx index 1672744..7002eac 100644 --- a/src/pages/family/detail.tsx +++ b/src/pages/family/detail.tsx @@ -7,12 +7,26 @@ import { StateView } from '@/components/state-view' import { FamilyCard } from '@/components/family-card' import { ListRow, ListRowGroup } from '@/components/list-row' import { getHomeDetail, getHomeMemberList, type HomeInfo, type HomeMember } from '@/api/home' +import { getCareMemberList, type CareMember } from '@/api/careMember' import { MAX_CARED_PER_FAMILY } from '@/constants/family' import { ROUTES } from '@/constants/routes' import { navigateBack, navigateTo } from '@/utils/navigation' import { showToast } from '@/utils/toast' import styles from './detail.module.scss' +// 成员显示名:nickName 字段名未实测确认,兼容 userName/name 兜底 +const memberName = (m: HomeMember): string => + m.nickName ?? (m as unknown as { userName?: string; name?: string }).name ?? '成员' + +// 关爱对象联系人摘要:最多显示前 2 位姓名,其余以 +N 概括 +const contactsSummary = (c: CareMember): string => { + const list = c.contacts ?? [] + if (list.length === 0) return '未填联系人' + const head = list.slice(0, 2).map((ct) => ct.name).join('、') + const rest = list.length > 2 ? ` 等 ${list.length} 人` : '' + return `${head}${rest}` +} + export default function FamilyDetail() { const router = useRouter() const familyId = router.params.id ?? '' @@ -20,18 +34,20 @@ export default function FamilyDetail() { const [loading, setLoading] = useState(true) const [family, setFamily] = useState(null) const [members, setMembers] = useState([]) - const [caredCount, setCaredCount] = useState(0) + const [caredList, setCaredList] = useState([]) const load = async () => { setLoading(true) try { - const [home, memberList] = await Promise.all([ + const [home, memberList, careList] = await Promise.all([ getHomeDetail(familyId), - getHomeMemberList(familyId) + getHomeMemberList(familyId), + getCareMemberList(familyId) ]) setFamily(home) setMembers(memberList) - setCaredCount(home.careMemberCount) + // 上限判定以关爱对象实际列表为准,家庭卡计数仅展示 + setCaredList(careList) } catch { setFamily(null) } finally { @@ -72,6 +88,7 @@ export default function FamilyDetail() { ) } + const caredCount = caredList.length const canAdd = caredCount < MAX_CARED_PER_FAMILY const stub = (tip: string) => () => showToast(tip) @@ -101,11 +118,29 @@ export default function FamilyDetail() { - - {members.map((m) => ( - - ))} - + 关爱对象 + {caredCount === 0 ? ( + 暂无关爱对象,点击上方卡片添加 + ) : ( + + {caredList.map((c) => ( + + ))} + + )} + + + + 家庭成员 + {members.length === 0 ? ( + 暂无其他成员 + ) : ( + + {members.map((m) => ( + + ))} + + )}