feat(medications): 优化药物显示逻辑,未服用药品优先排序并更新计数逻辑

This commit is contained in:
richarjiang
2025-11-19 16:12:52 +08:00
parent ee60f0756e
commit da09df1e9d
2 changed files with 38 additions and 2 deletions

View File

@@ -177,12 +177,24 @@ export default function MedicationsScreen() {
if (activeFilter === 'all') { if (activeFilter === 'all') {
return medicationsWithImages; return medicationsWithImages;
} }
// "未服用" tab 包含 missed已错过和 upcoming待服用两种状态
if (activeFilter === 'missed') {
return medicationsWithImages.filter((item: any) =>
item.status === 'missed' || item.status === 'upcoming'
);
}
// 其他状态按原逻辑过滤
return medicationsWithImages.filter((item: any) => item.status === activeFilter); return medicationsWithImages.filter((item: any) => item.status === activeFilter);
}, [activeFilter, medicationsWithImages]); }, [activeFilter, medicationsWithImages]);
const counts = useMemo(() => { const counts = useMemo(() => {
const taken = medicationsWithImages.filter((item: any) => item.status === 'taken').length; const taken = medicationsWithImages.filter((item: any) => item.status === 'taken').length;
const missed = medicationsWithImages.filter((item: any) => item.status === 'missed').length; // "未服用"计数包含 missed已错过和 upcoming待服用
const missed = medicationsWithImages.filter((item: any) =>
item.status === 'missed' || item.status === 'upcoming'
).length;
return { return {
all: medicationsWithImages.length, all: medicationsWithImages.length,
taken, taken,

View File

@@ -729,6 +729,7 @@ export const selectSelectedDateStats = (state: RootState) => {
/** /**
* 获取指定日期的展示项列表用于UI渲染 * 获取指定日期的展示项列表用于UI渲染
* 将药物记录和药物信息合并为展示项 * 将药物记录和药物信息合并为展示项
* 排序规则优先显示未服用的药品upcoming、missed然后是已服用的药品taken、skipped
*/ */
export const selectMedicationDisplayItemsByDate = (date: string) => (state: RootState) => { export const selectMedicationDisplayItemsByDate = (date: string) => (state: RootState) => {
const records = state.medications.medicationRecords[date] || []; const records = state.medications.medicationRecords[date] || [];
@@ -739,7 +740,7 @@ export const selectMedicationDisplayItemsByDate = (date: string) => (state: Root
medications.forEach((med) => medicationMap.set(med.id, med)); medications.forEach((med) => medicationMap.set(med.id, med));
// 转换为展示项 // 转换为展示项
return records const displayItems = records
.map((record) => { .map((record) => {
const medication = medicationMap.get(record.medicationId); const medication = medicationMap.get(record.medicationId);
if (!medication) return null; if (!medication) return null;
@@ -768,6 +769,29 @@ export const selectMedicationDisplayItemsByDate = (date: string) => (state: Root
} as import('@/types/medication').MedicationDisplayItem; } as import('@/types/medication').MedicationDisplayItem;
}) })
.filter((item): item is import('@/types/medication').MedicationDisplayItem => item !== null); .filter((item): item is import('@/types/medication').MedicationDisplayItem => item !== null);
// 排序未服用的药品upcoming、missed优先已服用的药品taken、skipped其次
// 在同一组内,按计划时间升序排列
return displayItems.sort((a, b) => {
// 定义状态优先级:数值越小优先级越高
const statusPriority: Record<MedicationStatus, number> = {
'missed': 1, // 已错过 - 最高优先级
'upcoming': 2, // 待服用
'taken': 3, // 已服用
'skipped': 4, // 已跳过
};
const priorityA = statusPriority[a.status];
const priorityB = statusPriority[b.status];
// 首先按状态优先级排序
if (priorityA !== priorityB) {
return priorityA - priorityB;
}
// 状态相同时,按计划时间升序排列
return a.scheduledTime.localeCompare(b.scheduledTime);
});
}; };
// ==================== Export ==================== // ==================== Export ====================