fix(admin): 报读操作统一失效档案与班级查询缓存
CI / check (pull_request) Failing after 40s
Dependency Check / check (pull_request) Failing after 34s

报读增删改/归档都会经 syncRosterMembership 变更班级花名册,4 个 mutation
统一失效 ['archive', studentId] + queryKeys.classes.all(抽 ENROLLMENT_INVALIDATE
常量),避免班级详情/花名册读到陈旧数据;操作列拍平嵌套三元。
This commit was merged in pull request #85.
This commit is contained in:
2026-08-12 16:18:45 +08:00
parent 0ea31b8bc3
commit 74fb09bdba
@@ -56,23 +56,26 @@ export const EnrollmentsTab: React.FC<TabProps & { data: EnrollmentRecord[] }> =
const [saving, setSaving] = useState(false);
const [selectedClassId, setSelectedClassId] = useState<number>();
// 报读相关操作都会经 syncRosterMembership 变更班级花名册(加人/移出/改班),
// 统一失效档案 + 班级侧查询,避免增删 key 时漏改
const ENROLLMENT_INVALIDATE = [['archive', studentId], queryKeys.classes.all];
const addEnrollmentMutation = useApiMutation(
async (payload: Record<string, unknown>) =>
api.post(`/archive/${studentId}/enrollments`, payload),
{ invalidate: [['archive', studentId]] },
{ invalidate: ENROLLMENT_INVALIDATE },
);
const saveEnrollmentCellMutation = useApiMutation(
async ({ id, payload }: { id: number; payload: Record<string, unknown> }) =>
api.put(`/archive/enrollments/${id}`, payload),
{ invalidate: [['archive', studentId]] },
{ invalidate: ENROLLMENT_INVALIDATE },
);
const purgeEnrollmentMutation = useApiMutation(
async (id: number) => api.delete(`/archive/enrollments/${id}/permanent`),
{ invalidate: [['archive', studentId]] },
{ invalidate: ENROLLMENT_INVALIDATE },
);
const archiveEnrollmentMutation = useApiMutation(
async (id: number) => api.delete(`/archive/enrollments/${id}`),
{ invalidate: [['archive', studentId]] },
{ invalidate: ENROLLMENT_INVALIDATE },
);
const {
@@ -323,18 +326,20 @@ export const EnrollmentsTab: React.FC<TabProps & { data: EnrollmentRecord[] }> =
},
{
title: '操作',
render: (_: unknown, r: EnrollmentRecord) =>
r.status === 'archived' ? (
canPurgeArchive && (
render: (_: unknown, r: EnrollmentRecord) => {
if (r.status === 'archived') {
return canPurgeArchive ? (
<Button size="small" danger type="link" onClick={() => handlePurge(r)}>
</Button>
)
) : hasPermission('student:edit') ? (
) : null;
}
return hasPermission('student:edit') ? (
<Button size="small" type="link" onClick={() => handleArchive(r)}>
</Button>
) : null,
) : null;
},
},
];