import { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; import { PageHeader } from '@/components/layout/PageHeader'; import { Card } from '@/components/common/Card'; import { Button } from '@/components/common/Button'; import { ToastContainer, toast } from '@/components/common/Toast'; import * as medicationService from '@/services/medication.service'; import type { Medication, MedicationRecord } from '@/types'; import styles from './MedicationDetailPage.module.css'; export function MedicationDetailPage() { const { id } = useParams<{ id: string }>(); const [med, setMed] = useState(null); const [records, setRecords] = useState([]); const [loading, setLoading] = useState(false); const load = () => { if (!id) return; medicationService.getMedications().then((meds) => { const m = meds.find((x) => x.id === id); if (m) setMed(m); }); medicationService.getMedicationRecords(id).then(setRecords); }; useEffect(() => { load(); }, [id]); const today = new Date().toISOString().split('T')[0]; const todayRecords = records.filter((r) => r.takenAt?.startsWith(today) || !r.takenAt); const todaySlots = med?.timeSlots || []; const handleMarkTaken = async (slot: string) => { if (!id) return; setLoading(true); try { await medicationService.markTaken(id, slot); toast('已记录'); load(); } catch { toast('失败', 'error'); } finally { setLoading(false); } }; if (!med) { return
药品不存在
; } const slotTaken = (slot: string) => todayRecords.some((r) => r.timeSlot === slot && r.isTaken); const last7Days: { date: string; taken: number; total: number }[] = []; for (let i = 6; i >= 0; i--) { const d = new Date(); d.setDate(d.getDate() - i); const ds = d.toISOString().split('T')[0]; const dayRecords = records.filter((r) => r.takenAt?.startsWith(ds) && r.isTaken); last7Days.push({ date: ds, taken: dayRecords.length, total: todaySlots.length }); } return (
{med.drugName}
{med.dosage} · {med.frequency}
剂量
{med.dosage}
频次
{med.frequency}
用药时间
{med.timeSlots.join(', ')}
有效期
{med.startDate} ~ {med.endDate || '长期'}
{med.notes && (
备注
{med.notes}
)}
今日服药
{today}
{todaySlots.map((slot) => { const taken = slotTaken(slot); return (
{taken ? '✓' : slot}
{slot}
{taken ? '已服用' : '待服用'}
{!taken && med.status === 'active' && ( )}
); })}
{todaySlots.filter((s) => slotTaken(s)).length}/{todaySlots.length} 次
0 ? (todaySlots.filter((s) => slotTaken(s)).length / todaySlots.length) * 100 : 0}%`, }} />
近7天记录
{last7Days.map((d) => { const pct = d.total > 0 ? (d.taken / d.total) * 100 : 0; const height = d.total > 0 ? Math.max(8, (d.taken / d.total) * 60) : 8; return (
0 ? styles.chartBarPartial : styles.chartBarEmpty}`} style={{ height }} />
{d.date.slice(5)}
); })}
全勤
漏服
未开始
); }