Inpatient radiology workflow module for Honeycomb EHR. Implements the complete imaging lifecycle from order entry through diagnostic reporting.
This package provides a multi-user workflow for radiology departments with role-based dashboards:
| Actor | Dashboard | Phase | FHIR Resources |
|---|---|---|---|
| Nurse | /radiology/nursing |
Order Entry | ServiceRequest |
| Rad Tech | /radiology/tech |
Safety & Acquisition | Questionnaire, QuestionnaireResponse, Procedure, ImagingStudy |
| Radiologist | /radiology/reading |
Interpretation & Reporting | Observation, RiskAssessment, DiagnosticReport |
EXTRA_WORKFLOWS=@node-on-fhir/radiology-workflow meteor run --settings configs/settings.honeycomb.localhost.jsoncd /path/to/honeycomb-ehr
npm install
# The package is automatically linked via workspaces- Select patient from sidebar
- Navigate to
/radiology/nursing - Click "New Order"
- Select modality (CT, MRI, X-ray, etc.)
- Set priority and clinical indication
- Submit order (creates ServiceRequest)
- Navigate to
/radiology/tech - Select order from worklist (sorted by priority)
- Complete safety questionnaire
- System evaluates for contraindications
- Proceed to acquisition
- Click "Start Procedure" (creates Procedure)
- Acquire images on modality
- Upload via
/dicom/upload(if needed) - Click "Complete Procedure" (creates ImagingStudy, marks ServiceRequest complete)
- Navigate to
/radiology/reading - Select study from worklist
- Open in DICOM viewer (
/dicom/viewer/:studyId) - Add findings (creates Observations)
- Add risk assessment if needed (creates RiskAssessment)
- Write impression and sign report (creates DiagnosticReport)
The package registers .after() hooks for workflow automation:
| Collection | Trigger | Action |
|---|---|---|
| ServiceRequests | insert | Log new imaging order, update tech worklist |
| QuestionnaireResponses | insert | Evaluate contraindications, flag if issues |
| ImagingStudies | insert | Notify radiologist worklist |
| DiagnosticReports | insert | Link to Procedure, calculate turnaround time |
| Procedures | update (status) | Audit state transitions |
Roles are determined from PractitionerRole.code:
import { useRadiologyRole } from '@node-on-fhir/radiology-workflow/client/hooks/useRadiologyRole';
function MyComponent() {
const { role, isLoading } = useRadiologyRole();
// role: 'nurse' | 'tech' | 'radiologist' | null
}| PractitionerRole.code | Radiology Role |
|---|---|
RN, nurse, LPN, NP |
nurse |
RAD_TECH, technologist, radiographer |
tech |
RAD, radiologist, physician, MD |
radiologist |
All resources are pre-existing in Honeycomb:
- Patient - Subject of imaging
- Practitioner - Ordering provider, technologist, radiologist
- PractitionerRole - Role-based access control
- Encounter - Patient visit context
- ServiceRequest - Imaging order
- Questionnaire - Safety screening form
- QuestionnaireResponse - Completed screening
- BodyStructure - Anatomical target
- Procedure - Imaging event
- ImagingStudy - Study metadata and series
- DocumentReference - DICOM access URLs
- Observation - Individual findings
- RiskAssessment - BI-RADS, Lung-RADS, etc.
- DiagnosticReport - Final signed report
- Measure - Quality metric definitions
- MeasureReport - Quality results
// Create imaging order
await Meteor.callAsync('radiology.createImagingOrder', {
patientId: 'patient-123',
modality: 'CT',
modalityDisplay: 'CT (Computed Tomography)',
priority: 'urgent',
reasonDisplay: 'Abdominal pain'
});// Submit screening
await Meteor.callAsync('radiology.submitSafetyScreening', {
questionnaireId: 'pre-imaging-safety',
serviceRequestId: 'order-456',
patientId: 'patient-123',
items: [
{ linkId: 'allergy', answer: [{ valueBoolean: false }] }
]
});// Start procedure
const procedureId = await Meteor.callAsync('radiology.startProcedure', {
serviceRequestId: 'order-456',
patientId: 'patient-123',
modality: 'CT'
});
// Complete procedure
await Meteor.callAsync('radiology.completeProcedure', {
procedureId: procedureId,
serviceRequestId: 'order-456',
patientId: 'patient-123',
modality: 'CT'
});// Add finding
const observationId = await Meteor.callAsync('radiology.addFinding', {
imagingStudyId: 'study-789',
patientId: 'patient-123',
code: 'mass',
codeDisplay: 'Mass identified',
valueString: '2cm nodule in right lower lobe'
});
// Sign report
await Meteor.callAsync('radiology.signReport', {
imagingStudyId: 'study-789',
serviceRequestId: 'order-456',
procedureId: 'proc-789',
patientId: 'patient-123',
observationIds: [observationId],
conclusion: 'Suspicious pulmonary nodule. Recommend follow-up CT in 3 months.'
});The package integrates with Honeycomb's existing DICOM viewer:
/dicom/studies- Study list/dicom/upload- Image upload/dicom/viewer/:studyId- Cornerstone3D viewer
npmPackages/radiology-workflow/
├── package.json
├── workflow.json
├── client.js
├── server.js
├── server/
│ ├── methods.js
│ └── hooks.js
├── client/
│ ├── RadiologyHome.jsx
│ ├── NursingDashboard.jsx
│ ├── TechDashboard.jsx
│ ├── ReadingDashboard.jsx
│ ├── hooks/
│ │ └── useRadiologyRole.js
│ └── components/
└── README.md
- Admin UI for role assignment
- Push notifications for worklist updates
- Radiation dose tracking (DLP, CTDIvol)
- HL7v2 ADT integration
- Order reconciliation workflows
- DICOM MPPS integration
- Advanced quality measures dashboard
Artistic 2.0