Files
teatea-pension/.trellis/tasks/archive/2026-07/07-02-emergency-incident-workspace/design.md

81 lines
2.7 KiB
Markdown

# Emergency Incident Workspace Design
## Summary
Replace `/app/emergency` with a real safety/emergency incident workspace using the existing `systemIncidents` Drizzle table. The MVP covers manual event creation, status triage, filters, and metrics.
## Route Boundary
- Unscoped route: `app/(app)/app/emergency/page.tsx`
- Scoped route: `app/(app)/app/[organizationSlug]/emergency/page.tsx`
- Navigation remains under `运营`.
- Permissions:
- read: `incident:read`
- mutate: `incident:manage`
Server Component behavior:
1. Load `getCurrentAuthContext()`.
2. Redirect unauthenticated users to `/login`.
3. Redirect users without `incident:read` to dashboard.
4. Require active organization.
5. Load incidents through `listEmergencyIncidentData(organizationId)`.
6. Render client workspace with `canManage`.
## Data Model
Use existing `system_incidents`:
- `organizationId`
- `severity`: `info | warning | critical`
- `status`: `open | acknowledged | resolved | closed`
- `title`
- `description`
- `source`
- acknowledgement / resolution account and time fields
No schema change is required for MVP. Elder/bed linking stays future work for the context optimization task.
## Server Helpers
Create `modules/emergency/`:
- `modules/emergency/types.ts`
- labels, DTOs, create/status validators.
- `modules/emergency/server/operations.ts`
- `listEmergencyIncidentData(organizationId: string)`
- `createEmergencyIncident(input)`
- `updateEmergencyIncidentStatus(input)`
- `modules/emergency/components/EmergencyWorkspaceClient.tsx`
- metrics, filters, event table, create dialog, status actions.
## API Design
- `GET /api/emergency/incidents`
- permission: `incident:read`
- response: `{ success: true; reason: string; data }`
- `POST /api/emergency/incidents`
- permission: `incident:manage`
- request: `{ severity; title; description; source }`
- creates an organization-scoped incident
- `PATCH /api/emergency/incidents/[id]`
- permission: `incident:manage`
- request: `{ status }`
- updates only rows in the active organization
All create/update mutations write audit logs after successful persistence.
## UI Design
- Metrics: open, acknowledged, critical, resolved/closed today.
- Filters: status, severity, search by title/source/description.
- Dense table columns: event, severity, status, source, created time, updated time, actions.
- Actions: acknowledge, resolve, close.
- Manual creation dialog for authorized operators.
- Read-only users can see rows but not mutation controls.
## Compatibility
- Existing `/api/system/incidents/[id]` stays for system status settings.
- The emergency workspace uses dedicated `/api/emergency/...` routes so tests and UI contracts are local to the operational module.