import { View, Text } from '@tarojs/components'; import { useState } from 'react'; import Taro, { useDidShow } from '@tarojs/taro'; import { useAuthStore } from '../../stores/auth'; import { useHealthStore } from '../../stores/health'; import ProgressRing from '../../components/ProgressRing'; import Loading from '../../components/Loading'; import { trackPageView } from '@/services/analytics'; import * as appointmentApi from '@/services/appointment'; import * as followupApi from '@/services/followup'; import './index.scss'; interface UpcomingItem { id: string; title: string; subtitle: string; type: 'appointment' | 'followup'; icon: string; } export default function Index() { const { user, currentPatient } = useAuthStore(); const { todaySummary, loading, refreshToday } = useHealthStore(); const [upcomingItems, setUpcomingItems] = useState([]); const [upcomingLoading, setUpcomingLoading] = useState(false); useDidShow(() => { refreshToday(); loadUpcoming(); trackPageView('home'); }); const loadUpcoming = async () => { const patientId = useAuthStore.getState().currentPatient?.id; if (!patientId) return; setUpcomingLoading(true); try { const items: UpcomingItem[] = []; const [apptRes, taskRes] = await Promise.allSettled([ appointmentApi.listAppointments(patientId, 1), followupApi.listTasks(patientId, 'pending'), ]); if (apptRes.status === 'fulfilled') { for (const a of apptRes.value.data.slice(0, 2)) { if (a.status === 'pending' || a.status === 'confirmed') { items.push({ id: a.id, title: `${a.appointment_date} ${a.start_time}`, subtitle: `${a.doctor_name || '医护'} · ${a.department || '门诊'}`, type: 'appointment', icon: '约', }); } } } if (taskRes.status === 'fulfilled') { for (const t of taskRes.value.data.slice(0, 1)) { items.push({ id: t.id, title: t.follow_up_type, subtitle: `${t.content_template?.slice(0, 20) || '随访任务'} · 截止 ${t.planned_date}`, type: 'followup', icon: '随', }); } } setUpcomingItems(items.slice(0, 3)); } catch { setUpcomingItems([]); } finally { setUpcomingLoading(false); } }; const hour = new Date().getHours(); const greeting = hour < 12 ? '上午好' : hour < 18 ? '下午好' : '晚上好'; const displayName = user?.display_name || currentPatient?.name || '访客'; // 计算今日体征完成度(4 个指标:血压/心率/血糖/体重) const summary = todaySummary || {}; const indicators = [ !!summary.blood_pressure, !!summary.heart_rate, !!summary.blood_sugar, !!summary.weight, ]; const completedCount = indicators.filter(Boolean).length; const progressPercent = Math.round((completedCount / 4) * 100); const indicatorCapsules = [ { label: '血压', done: !!summary.blood_pressure }, { label: '心率', done: !!summary.heart_rate }, { label: '血糖', done: !!summary.blood_sugar }, { label: '体重', done: !!summary.weight }, ]; const healthItems = [ { label: '血压', value: summary.blood_pressure ? `${summary.blood_pressure.systolic}/${summary.blood_pressure.diastolic}` : '—', unit: 'mmHg', status: summary.blood_pressure?.status, indicator: 'blood_pressure_systolic' }, { label: '心率', value: summary.heart_rate ? `${summary.heart_rate.value}` : '—', unit: 'bpm', status: summary.heart_rate?.status, indicator: 'heart_rate' }, { label: '血糖', value: summary.blood_sugar ? `${summary.blood_sugar.value}` : '—', unit: 'mmol/L', status: summary.blood_sugar?.status, indicator: 'blood_sugar_fasting' }, { label: '体重', value: summary.weight ? `${summary.weight.value}` : '—', unit: 'kg', status: summary.weight?.status, indicator: 'weight' }, ]; const getStatusTag = (status?: string) => { if (status === 'high' || status === 'low') return { label: status === 'high' ? '偏高' : '偏低', cls: 'tag-warn' }; if (status === 'normal') return { label: '正常', cls: 'tag-ok' }; return null; }; return ( {/* 区域 1:问候 + 日期 + 消息入口 */} {greeting},{displayName} {new Date().toLocaleDateString('zh-CN', { month: 'long', day: 'numeric', weekday: 'short' })} Taro.switchTab({ url: '/pages/messages/index' })} > 🔔 {/* 区域 2:今日体征完成度 */} Taro.switchTab({ url: '/pages/health/index' })} > {completedCount === 4 ? '今日体征已全部记录' : completedCount === 0 ? '今日尚未记录体征' : `今日已记录 ${completedCount}/4 项`} {indicatorCapsules.map((cap) => ( {cap.done ? '✓' : ''}{cap.label} ))} {/* 区域 3:今日体征 2x2 网格 */} {loading && !todaySummary ? ( ) : ( {healthItems.map((item) => { const tag = getStatusTag(item.status); return ( Taro.navigateTo({ url: `/pages/pkg-health/trend/index?indicator=${item.indicator}` })} > {item.label} {item.value} {item.unit} {tag && {tag.label}} {!item.status && 未记录} ); })} )} {/* 区域 4:今日待办(≤3 条) */} 今日待办 {upcomingLoading ? ( ) : upcomingItems.length === 0 ? ( 今天没有待办事项 ) : ( {upcomingItems.map((item) => ( { if (item.type === 'appointment') { Taro.navigateTo({ url: '/pages/appointment/index' }); } else { Taro.navigateTo({ url: `/pages/followup/detail/index?id=${item.id}` }); } }} > {item.icon} {item.title} {item.subtitle} ))} )} {/* 区域 5:快捷操作 */} Taro.switchTab({ url: '/pages/health/index' })} > 记录体征 Taro.navigateTo({ url: '/pages/appointment/create/index' })} > 预约挂号 ); }