fix: surface active beds on elder records
This commit is contained in:
@@ -113,6 +113,19 @@ export async function readData(): Promise<AppData> {
|
||||
]);
|
||||
|
||||
const roleById = new Map(membershipRows.map((row) => [row.membership.id, row.role]));
|
||||
const activeAdmissionByElderId = new Map<string, { room: string; bed: string; bedId: string }>();
|
||||
for (const row of admissionRows) {
|
||||
if (row.admission.status !== "active") {
|
||||
continue;
|
||||
}
|
||||
|
||||
activeAdmissionByElderId.set(row.admission.elderId, {
|
||||
room: row.roomName,
|
||||
bed: row.bedCode,
|
||||
bedId: row.admission.bedId,
|
||||
});
|
||||
}
|
||||
|
||||
const bedCounts = new Map<string, { total: number; occupied: number }>();
|
||||
for (const row of bedRows) {
|
||||
const current = bedCounts.get(row.bed.roomId) ?? { total: 0, occupied: 0 };
|
||||
@@ -209,22 +222,26 @@ export async function readData(): Promise<AppData> {
|
||||
expiresAt: iso(row.expiresAt),
|
||||
}));
|
||||
|
||||
const eldersData: Elder[] = elderRows.map((row) => ({
|
||||
id: row.id,
|
||||
organizationId: row.organizationId,
|
||||
name: row.name,
|
||||
gender: row.gender,
|
||||
age: row.age,
|
||||
careLevel: row.careLevel,
|
||||
room: "",
|
||||
bed: "",
|
||||
status: row.status,
|
||||
primaryContact: row.primaryContact,
|
||||
phone: row.phone,
|
||||
medicalNotes: row.medicalNotes,
|
||||
createdAt: iso(row.createdAt),
|
||||
updatedAt: iso(row.updatedAt),
|
||||
}));
|
||||
const eldersData: Elder[] = elderRows.map((row) => {
|
||||
const activeAdmission = activeAdmissionByElderId.get(row.id);
|
||||
return {
|
||||
id: row.id,
|
||||
organizationId: row.organizationId,
|
||||
name: row.name,
|
||||
gender: row.gender,
|
||||
age: row.age,
|
||||
careLevel: row.careLevel,
|
||||
room: activeAdmission?.room ?? "",
|
||||
bed: activeAdmission?.bed ?? "",
|
||||
bedId: activeAdmission?.bedId,
|
||||
status: row.status,
|
||||
primaryContact: row.primaryContact,
|
||||
phone: row.phone,
|
||||
medicalNotes: row.medicalNotes,
|
||||
createdAt: iso(row.createdAt),
|
||||
updatedAt: iso(row.updatedAt),
|
||||
};
|
||||
});
|
||||
|
||||
const roomsData: Room[] = roomRows.map((row) => {
|
||||
const counts = bedCounts.get(row.id) ?? { total: 0, occupied: 0 };
|
||||
|
||||
@@ -56,6 +56,10 @@ function formatDateTime(value: string): string {
|
||||
return new Date(value).toLocaleString("zh-CN");
|
||||
}
|
||||
|
||||
function formatBedLabel(elder: Pick<Elder, "room" | "bed">): string {
|
||||
return elder.room && elder.bed ? `${elder.room}-${elder.bed}` : "-";
|
||||
}
|
||||
|
||||
function getRiskLabel(elder: Elder): { label: string; variant: "danger" | "warning" | "success" } {
|
||||
if (elder.careLevel === "intensive") {
|
||||
return { label: "红色重点", variant: "danger" };
|
||||
@@ -136,6 +140,7 @@ export function EldersClient({ initialElders, permissions }: EldersClientProps):
|
||||
const safePage = Math.min(page, pageCount);
|
||||
const pageStart = (safePage - 1) * PAGE_SIZE;
|
||||
const visibleElders = filteredElders.slice(pageStart, pageStart + PAGE_SIZE);
|
||||
const editingElder = editingId ? elders.find((elder) => elder.id === editingId) : undefined;
|
||||
|
||||
function updateField<K extends keyof ElderInput>(key: K, value: ElderInput[K]): void {
|
||||
setForm((current) => ({ ...current, [key]: value }));
|
||||
@@ -359,9 +364,7 @@ export function EldersClient({ initialElders, permissions }: EldersClientProps):
|
||||
</p>
|
||||
</Table.Cell>
|
||||
<Table.Cell className="px-4 py-3">{CARE_LEVEL_LABELS[elder.careLevel]}</Table.Cell>
|
||||
<Table.Cell className="px-4 py-3 text-muted-foreground">
|
||||
{elder.room}-{elder.bed}
|
||||
</Table.Cell>
|
||||
<Table.Cell className="px-4 py-3 text-muted-foreground">{formatBedLabel(elder)}</Table.Cell>
|
||||
<Table.Cell className="px-4 py-3 text-muted-foreground">
|
||||
{elder.primaryContact} / {elder.phone}
|
||||
</Table.Cell>
|
||||
@@ -490,16 +493,11 @@ export function EldersClient({ initialElders, permissions }: EldersClientProps):
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="grid gap-3 sm:grid-cols-2">
|
||||
<label className="grid gap-1.5 text-sm font-medium">
|
||||
房间
|
||||
<Input value={form.room} onChange={(event) => updateField("room", event.target.value)} />
|
||||
</label>
|
||||
<label className="grid gap-1.5 text-sm font-medium">
|
||||
床位
|
||||
<Input value={form.bed} onChange={(event) => updateField("bed", event.target.value)} />
|
||||
</label>
|
||||
</div>
|
||||
{isEditing ? (
|
||||
<div className="rounded-md border bg-secondary/30 px-3 py-2 text-sm">
|
||||
当前床位:{editingElder ? formatBedLabel(editingElder) : "-"}
|
||||
</div>
|
||||
) : null}
|
||||
<label className="grid gap-1.5 text-sm font-medium">
|
||||
联系人
|
||||
<Input value={form.primaryContact} onChange={(event) => updateField("primaryContact", event.target.value)} />
|
||||
@@ -543,7 +541,7 @@ export function EldersClient({ initialElders, permissions }: EldersClientProps):
|
||||
<div className="flex flex-col gap-4">
|
||||
{deleteTarget ? (
|
||||
<div className="rounded-md border border-red-200 bg-red-50 p-3 text-sm text-red-700">
|
||||
{deleteTarget.name},{deleteTarget.room}-{deleteTarget.bed},最近更新:
|
||||
{deleteTarget.name},{formatBedLabel(deleteTarget)},最近更新:
|
||||
{formatDateTime(deleteTarget.updatedAt)}
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
Reference in New Issue
Block a user