fix(health): 修复 5 角色深度测试发现的 8 个问题
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

P0 修复:
- 告警状态机新增 active 合法状态 + 转换规则 (active→acknowledged/dismissed)
- 前端路由守卫改为默认拒绝,未注册路由返回 403

P1 修复:
- 侧边栏菜单根据用户权限码过滤,非 admin 隐藏无权限菜单项
- Critical-alerts handler 增加详细错误日志 + div_ceil 安全防护
- 仪表盘统计 API 调用使用 silent 模式避免 500 触发全局 toast

P2 修复:
- 随访类型映射新增 visit → 上门 (前后端同步)
- 随访 fallback 选项新增 visit 类型

排除的假 BUG (代码已正确):
- 患者性别/血型: MCP fill() 不兼容 Select 组件,正常交互正确
- 随访筛选/对话框关闭: 代码逻辑验证正确

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
iven
2026-05-07 08:24:12 +08:00
parent 0acf901893
commit 85a7dacd16
8 changed files with 292 additions and 32 deletions

View File

@@ -384,61 +384,61 @@ export const pointsApi = {
},
// Points Statistics
getStatistics: async () => {
getStatistics: async (opts?: { silent?: boolean }) => {
const { data } = await client.get<{
success: boolean;
data: PointsStatistics;
}>('/health/admin/points/statistics');
}>('/health/admin/points/statistics', { skipGlobalError: opts?.silent } as any);
return data.data;
},
// --- Dashboard Statistics ---
getPatientStats: async (): Promise<PatientStatistics> => {
getPatientStats: async (opts?: { silent?: boolean }): Promise<PatientStatistics> => {
const { data } = await client.get<{
success: boolean;
data: PatientStatistics;
}>('/health/admin/statistics/patients');
}>('/health/admin/statistics/patients', { skipGlobalError: opts?.silent } as any);
return data.data;
},
getConsultationStats: async (): Promise<ConsultationStatistics> => {
getConsultationStats: async (opts?: { silent?: boolean }): Promise<ConsultationStatistics> => {
const { data } = await client.get<{
success: boolean;
data: ConsultationStatistics;
}>('/health/admin/statistics/consultations');
}>('/health/admin/statistics/consultations', { skipGlobalError: opts?.silent } as any);
return data.data;
},
getFollowUpStats: async (): Promise<FollowUpStatistics> => {
getFollowUpStats: async (opts?: { silent?: boolean }): Promise<FollowUpStatistics> => {
const { data } = await client.get<{
success: boolean;
data: FollowUpStatistics;
}>('/health/admin/statistics/follow-ups');
}>('/health/admin/statistics/follow-ups', { skipGlobalError: opts?.silent } as any);
return data.data;
},
getHealthDataStats: async (): Promise<HealthDataStats> => {
getHealthDataStats: async (opts?: { silent?: boolean }): Promise<HealthDataStats> => {
const { data } = await client.get<{
success: boolean;
data: HealthDataStats;
}>('/health/admin/statistics/health-data');
}>('/health/admin/statistics/health-data', { skipGlobalError: opts?.silent } as any);
return data.data;
},
getDialysisStats: async (): Promise<DialysisStatistics> => {
getDialysisStats: async (opts?: { silent?: boolean }): Promise<DialysisStatistics> => {
const { data } = await client.get<{
success: boolean;
data: DialysisStatistics;
}>('/health/admin/statistics/dialysis');
}>('/health/admin/statistics/dialysis', { skipGlobalError: opts?.silent } as any);
return data.data;
},
getPersonalStats: async (): Promise<PersonalStats> => {
getPersonalStats: async (opts?: { silent?: boolean }): Promise<PersonalStats> => {
const { data } = await client.get<{
success: boolean;
data: PersonalStats;
}>('/health/admin/statistics/personal-stats');
}>('/health/admin/statistics/personal-stats', { skipGlobalError: opts?.silent } as any);
return data.data;
},
};