fix: 修复多角色找茬测试 V2 发现的 11 个问题
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 (CRITICAL):
- C1: 统计 API 全部改为 safe_aggregate 容错,防止单个子查询崩溃导致 500
- C2: Token 刷新增加用户身份验证,防止并发场景下身份切换
- C3: 患者端线下活动接口添加患者档案验证,防止 Doctor/HM 越权访问

P1 (HIGH):
- H1: 操作记录用 EntityName 组件解析用户名,不再显示截断 UUID
- H4: 告警标题添加中英文映射 (translateAlertTitle)
- H5: 告警面板补全 message import + 修复 hooks 顺序
- H8: 咨询消息发送按钮添加 AuthButton 权限控制
- H9: routeConfig 日常监测权限码改为 health.daily-monitoring.*

P2 (MEDIUM):
- M4: 咨询类型映射补全 online/phone/doctor/follow_up 中文标签

DTO: LabReportStatisticsResp, AppointmentStatisticsResp, VitalSignsReportRateResp 添加 Default derive
This commit is contained in:
iven
2026-05-08 12:42:41 +08:00
parent 297a151b0c
commit 22b8ac7ac6
11 changed files with 1443 additions and 619 deletions

View File

@@ -21,74 +21,209 @@ interface RoutePermissionEntry {
const ENTRIES: RoutePermissionEntry[] = [
// ===== 基础模块 =====
{ path: '/users', permissions: ['user.list', 'user.update'] },
{ path: '/roles', permissions: ['role.list', 'role.update'] },
{ path: '/organizations', permissions: ['organization.list', 'organization.update'] },
{ path: '/workflow', permissions: ['workflow.list', 'workflow.read'] },
{ path: '/messages', permissions: ['message.list'] },
{ path: '/settings', permissions: ['setting.read', 'setting.update'] },
{ path: "/users", permissions: ["user.list", "user.update"] },
{ path: "/roles", permissions: ["role.list", "role.update"] },
{
path: "/organizations",
permissions: ["organization.list", "organization.update"],
},
{ path: "/workflow", permissions: ["workflow.list", "workflow.read"] },
{ path: "/messages", permissions: ["message.list"] },
{ path: "/settings", permissions: ["setting.read", "setting.update"] },
// ===== 插件模块(精确路径优先于前缀通配) =====
{ path: '/plugins/admin', permissions: ['plugin.admin'] },
{ path: '/plugins/market', permissions: ['plugin.admin'] },
{ path: "/plugins/admin", permissions: ["plugin.admin"] },
{ path: "/plugins/market", permissions: ["plugin.admin"] },
// 动态路由 catch-all: /plugins/:pluginId/:entityName 等
{ path: '/plugins', permissions: ['plugin.list', 'plugin.admin'] },
{ path: "/plugins", permissions: ["plugin.list", "plugin.admin"] },
// ===== 健康管理 — 患者与医生 =====
{ path: '/health/patients', permissions: ['health.patient.list', 'health.patient.manage'] },
{ path: '/health/tags', permissions: ['health.patient.list', 'health.patient.manage'] },
{ path: '/health/doctors', permissions: ['health.doctor.list', 'health.doctor.manage'] },
{ path: '/health/appointments', permissions: ['health.appointment.list', 'health.appointment.manage'] },
{
path: "/health/patients",
permissions: ["health.patient.list", "health.patient.manage"],
},
{
path: "/health/tags",
permissions: ["health.patient.list", "health.patient.manage"],
},
{
path: "/health/doctors",
permissions: ["health.doctor.list", "health.doctor.manage"],
},
{
path: "/health/appointments",
permissions: ["health.appointment.list", "health.appointment.manage"],
},
// ===== 健康管理 — 随访与咨询 =====
{ path: '/health/follow-up-tasks', permissions: ['health.follow-up.list', 'health.follow-up.manage'] },
{ path: '/health/follow-up-records', permissions: ['health.follow-up.list', 'health.follow-up.manage'] },
{ path: '/health/follow-up-templates', permissions: ['health.follow-up-templates.list', 'health.follow-up-templates.manage'] },
{ path: '/health/consultations', permissions: ['health.consultation.list', 'health.consultation.manage'] },
{ path: '/health/action-inbox', permissions: ['health.action-inbox.list', 'health.action-inbox.manage'] },
{
path: "/health/follow-up-tasks",
permissions: ["health.follow-up.list", "health.follow-up.manage"],
},
{
path: "/health/follow-up-records",
permissions: ["health.follow-up.list", "health.follow-up.manage"],
},
{
path: "/health/follow-up-templates",
permissions: [
"health.follow-up-templates.list",
"health.follow-up-templates.manage",
],
},
{
path: "/health/consultations",
permissions: ["health.consultation.list", "health.consultation.manage"],
},
{
path: "/health/action-inbox",
permissions: ["health.action-inbox.list", "health.action-inbox.manage"],
},
// ===== 健康管理 — 告警与设备 =====
{ path: '/health/alerts', permissions: ['health.alerts.list', 'health.alerts.manage'] },
{ path: '/health/alert-dashboard', permissions: ['health.alerts.list', 'health.alerts.manage'] },
{ path: '/health/alert-rules', permissions: ['health.alert-rules.list', 'health.alert-rules.manage'] },
{ path: '/health/devices', permissions: ['health.devices.list', 'health.devices.manage'] },
{ path: '/health/realtime-monitor', permissions: ['health.device-readings.list', 'health.device-readings.manage'] },
{ path: '/health/ble-gateways', permissions: ['health.ble-gateways.list', 'health.ble-gateways.manage'] },
{ path: '/health/critical-value-thresholds', permissions: ['health.critical-value-thresholds.list', 'health.critical-value-thresholds.manage'] },
{ path: '/health/daily-monitoring', permissions: ['health.device-readings.list', 'health.device-readings.manage'] },
{
path: "/health/alerts",
permissions: ["health.alerts.list", "health.alerts.manage"],
},
{
path: "/health/alert-dashboard",
permissions: ["health.alerts.list", "health.alerts.manage"],
},
{
path: "/health/alert-rules",
permissions: ["health.alert-rules.list", "health.alert-rules.manage"],
},
{
path: "/health/devices",
permissions: ["health.devices.list", "health.devices.manage"],
},
{
path: "/health/realtime-monitor",
permissions: [
"health.device-readings.list",
"health.device-readings.manage",
],
},
{
path: "/health/ble-gateways",
permissions: ["health.ble-gateways.list", "health.ble-gateways.manage"],
},
{
path: "/health/critical-value-thresholds",
permissions: [
"health.critical-value-thresholds.list",
"health.critical-value-thresholds.manage",
],
},
{
path: "/health/daily-monitoring",
permissions: [
"health.daily-monitoring.list",
"health.daily-monitoring.manage",
],
},
// ===== 健康管理 — 诊断与知情同意 =====
{ path: '/health/diagnoses', permissions: ['health.health-data.list', 'health.health-data.manage'] },
{ path: '/health/consents', permissions: ['health.consent.list', 'health.consent.manage'] },
{
path: "/health/diagnoses",
permissions: ["health.health-data.list", "health.health-data.manage"],
},
{
path: "/health/consents",
permissions: ["health.consent.list", "health.consent.manage"],
},
// ===== 健康管理 — AI 模块 =====
{ path: '/health/ai-prompts', permissions: ['ai.prompt.list', 'ai.prompt.manage'] },
{ path: '/health/ai-analysis', permissions: ['ai.analysis.list', 'ai.analysis.manage'] },
{ path: '/health/ai-usage', permissions: ['ai.usage.list'] },
{
path: "/health/ai-prompts",
permissions: ["ai.prompt.list", "ai.prompt.manage"],
},
{
path: "/health/ai-analysis",
permissions: ["ai.analysis.list", "ai.analysis.manage"],
},
{ path: "/health/ai-usage", permissions: ["ai.usage.list"] },
// ===== 健康管理 — 积分商城 =====
{ path: '/health/points-rules', permissions: ['health.points.list', 'health.points.manage'] },
{ path: '/health/points-products', permissions: ['health.points.list', 'health.points.manage'] },
{ path: '/health/points-orders', permissions: ['health.points.list', 'health.points.manage'] },
{ path: '/health/offline-events', permissions: ['health.points.list', 'health.points.manage'] },
{
path: "/health/points-rules",
permissions: ["health.points.list", "health.points.manage"],
},
{
path: "/health/points-products",
permissions: ["health.points.list", "health.points.manage"],
},
{
path: "/health/points-orders",
permissions: ["health.points.list", "health.points.manage"],
},
{
path: "/health/offline-events",
permissions: ["health.points.list", "health.points.manage"],
},
// ===== 健康管理 — 内容管理 =====
{ path: '/health/articles', permissions: ['health.articles.list', 'health.articles.manage'] },
{ path: '/health/article-categories', permissions: ['health.articles.list', 'health.articles.manage'] },
{ path: '/health/article-tags', permissions: ['health.articles.list', 'health.articles.manage'] },
{
path: "/health/articles",
permissions: ["health.articles.list", "health.articles.manage"],
},
{
path: "/health/article-categories",
permissions: ["health.articles.list", "health.articles.manage"],
},
{
path: "/health/article-tags",
permissions: ["health.articles.list", "health.articles.manage"],
},
// ===== 健康管理 — 其他 =====
{ path: '/health/oauth-clients', permissions: ['health.oauth.list', 'health.oauth.manage'] },
{ path: '/health/statistics', permissions: ['health.health-data.list', 'health.dashboard.manage'] },
{ path: '/health/medication-records', permissions: ['health.medication-records.manage'] },
{
path: "/health/oauth-clients",
permissions: ["health.oauth.list", "health.oauth.manage"],
},
{
path: "/health/statistics",
permissions: ["health.health-data.list", "health.dashboard.manage"],
},
{
path: "/health/medication-records",
permissions: ["health.medication-records.manage"],
},
// ===== 冻结路由 =====
{ path: '/health/care-plans', permissions: ['health.care-plan.list', 'health.care-plan.manage'], frozen: true },
{ path: '/health/shifts', permissions: ['health.shifts.list', 'health.shifts.manage'], frozen: true },
{ path: '/health/family-proxy', permissions: ['health.family-proxy.list', 'health.family-proxy.manage'], frozen: true },
{ path: '/health/medications', permissions: ['health.medication-records.list', 'health.medication-records.manage'], frozen: true },
{ path: '/health/dialysis', permissions: ['health.dialysis.list', 'health.dialysis.manage'], frozen: true },
{ path: '/health/schedules', permissions: ['health.appointment.list', 'health.appointment.manage'], frozen: true },
{
path: "/health/care-plans",
permissions: ["health.care-plan.list", "health.care-plan.manage"],
frozen: true,
},
{
path: "/health/shifts",
permissions: ["health.shifts.list", "health.shifts.manage"],
frozen: true,
},
{
path: "/health/family-proxy",
permissions: ["health.family-proxy.list", "health.family-proxy.manage"],
frozen: true,
},
{
path: "/health/medications",
permissions: [
"health.medication-records.list",
"health.medication-records.manage",
],
frozen: true,
},
{
path: "/health/dialysis",
permissions: ["health.dialysis.list", "health.dialysis.manage"],
frozen: true,
},
{
path: "/health/schedules",
permissions: ["health.appointment.list", "health.appointment.manage"],
frozen: true,
},
];
/** 活跃路由的权限映射 — 自动从配置生成,供 PrivateRoute 使用 */
@@ -97,13 +232,15 @@ export const ROUTE_PERMISSIONS: Record<string, string[]> = Object.fromEntries(
);
/** 冻结路由路径列表 — 自动从配置生成 */
export const FROZEN_ROUTES: string[] = ENTRIES.filter((e) => e.frozen).map((e) => e.path);
export const FROZEN_ROUTES: string[] = ENTRIES.filter((e) => e.frozen).map(
(e) => e.path,
);
/** 开发模式下校验:检查是否有路由路径重复 */
if (import.meta.env.DEV) {
const paths = ENTRIES.map((e) => e.path);
const dupes = paths.filter((p, i) => paths.indexOf(p) !== i);
if (dupes.length > 0) {
console.error('[routeConfig] 检测到重复路径:', dupes);
console.error("[routeConfig] 检测到重复路径:", dupes);
}
}