feat(medications): 优化药物显示逻辑,未服用药品优先排序并更新计数逻辑
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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 ====================
|
||||||
|
|||||||
Reference in New Issue
Block a user