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

@@ -39,6 +39,7 @@ const FOLLOW_UP_TYPE_FALLBACK = [
{ value: 'phone', label: '电话' },
{ value: 'outpatient', label: '门诊' },
{ value: 'home_visit', label: '家访' },
{ value: 'visit', label: '上门' },
{ value: 'online', label: '线上' },
{ value: 'wechat', label: '微信' },
];
@@ -47,6 +48,7 @@ const FOLLOW_UP_TYPE_MAP: Record<string, string> = {
phone: '电话',
outpatient: '门诊',
home_visit: '家访',
visit: '上门',
online: '线上',
wechat: '微信',
};

View File

@@ -53,12 +53,12 @@ export function useStatsData(): StatsData {
};
await Promise.all([
tryFetch(pointsApi.getPatientStats, setPatientStats, '患者'),
tryFetch(pointsApi.getConsultationStats, setConsultationStats, '咨询'),
tryFetch(pointsApi.getFollowUpStats, setFollowUpStats, '随访'),
tryFetch(pointsApi.getStatistics, setPointsStats, '积分'),
tryFetch(pointsApi.getHealthDataStats, setHealthDataStats, '健康数据'),
tryFetch(pointsApi.getDialysisStats, setDialysisStats, '透析'),
tryFetch(() => pointsApi.getPatientStats({ silent: true }), setPatientStats, '患者'),
tryFetch(() => pointsApi.getConsultationStats({ silent: true }), setConsultationStats, '咨询'),
tryFetch(() => pointsApi.getFollowUpStats({ silent: true }), setFollowUpStats, '随访'),
tryFetch(() => pointsApi.getStatistics({ silent: true }), setPointsStats, '积分'),
tryFetch(() => pointsApi.getHealthDataStats({ silent: true }), setHealthDataStats, '健康数据'),
tryFetch(() => pointsApi.getDialysisStats({ silent: true }), setDialysisStats, '透析'),
tryFetch(
async () => { const r = await doctorApi.list({ page: 1, page_size: 1 }); return r.total; },
setDoctorCount,