Przejdź do głównej zawartości

SOAP Notes

Na tej stronie

SOAP to standardowy format dokumentacji medycznej używany w Wietnamie. Każda wizyta ma cztery sekcje SOAP plus dodatkowe pola.


flowchart TB
subgraph SOAP["SOAP Note"]
S[Subjective<br/>Wywiad]
O[Objective<br/>Badanie]
A[Assessment<br/>Rozpoznanie]
P[Plan<br/>Zalecenia]
end
subgraph Additional["Additional Fields"]
Internal[Internal Notes<br/>Notatki wewnętrzne]
Transcript[Transcript<br/>Transkrypcja]
end
S --> O --> A --> P
Additional -.-> SOAP

Co pacjent/właściciel zgłasza.

// Database field
soap_subjective: string
// UI split in editor
reasonForVisit: string // "Powód wizyty" - first part
restOfSubjective: string // Remaining history

Zawartość:

  • Powód wizyty
  • Historia obecnej choroby
  • Zgłaszane objawy
  • Timeline objawów
  • Dotychczasowe leczenie

Obiektywne wyniki badania.

// Database field
soap_objective: string

Zawartość:

  • Badanie fizyczne
  • Parametry życiowe (temp, HR, RR)
  • Wyniki badań laboratoryjnych
  • Wyniki badań obrazowych
  • Stan ogólny pacjenta

Diagnoza i interpretacja.

// Database field
soap_assessment: string

Zawartość:

  • Rozpoznanie główne
  • Rozpoznania różnicowe
  • Stopień pewności diagnozy
  • Powiązania z historią pacjenta

Plan leczenia i follow-up.

// Database field
soap_plan: string

Zawartość:

  • Zalecone leki i dawkowanie
  • Zalecenia dla właściciela
  • Termin kontroli
  • Badania do wykonania
  • Znaki ostrzegawcze

// Visit SOAP fields (database)
interface VisitSOAP {
soap_subjective: string | null;
soap_objective: string | null;
soap_assessment: string | null;
soap_plan: string | null;
// AI-generated suggestions
ai_sugestie: string | null;
}
// EditedVisitData (UI state)
interface EditedSOAP {
subjective: string;
objective: string;
assessment: string;
plan: string;
ai_sugestie?: string;
}

sequenceDiagram
participant User
participant Editor as VisitEditor
participant AI as useSOAPGeneration
participant BE as unified_ai_generate_soap
User->>Editor: Click "Generate SOAP"
Editor->>AI: generateSOAP(patient, visit, visitId)
AI->>AI: Build context
Note over AI: patient data<br/>visit type<br/>transcript<br/>reason for visit
AI->>BE: unified_ai_generate_soap
BE->>BE: LLM processing
BE-->>AI: SOAP sections
AI->>Editor: Update editedData.soap
Editor->>Editor: source: 'system'
Editor->>Editor: Auto-save after delay
// AINotesPatientData
{
name: string;
species: string;
breed: string;
age: number;
weight: number;
owner: string;
}
// AINotesVisitData
{
visitType: string;
reasonForVisit: string;
transcript: string;
vetName: string;
}

AI może wygenerować sugestie zapisane w ai_sugestie:

// parseAiSuggestions() extracts sections
const suggestions = parseAiSuggestions(visit.ai_sugestie);
// Returns: { interview, exam, diagnosis, plan }
// Polish keywords recognized:
// subjective: 'wywiad', 'anamneza'
// objective: 'badanie', 'examination'
// assessment: 'rozpoznanie', 'diagnosis'
// plan: 'zalecenia', 'plan', 'treatment'

┌─────────────────────────────────────┐
│ Patient Header + Visit Info │
├─────────────────────────────────────┤
│ Reason for Visit [text input] │
├─────────────────────────────────────┤
│ [S] Subjective │
│ [expandable textarea] │
├─────────────────────────────────────┤
│ [O] Objective │
│ [expandable textarea] │
├─────────────────────────────────────┤
│ [A] Assessment │
│ [expandable textarea] │
├─────────────────────────────────────┤
│ [P] Plan │
│ [expandable textarea] │
├─────────────────────────────────────┤
│ Internal Notes (collapsed) │
└─────────────────────────────────────┘
// EditedVisitData.soap
editedData.soap = {
subjective: '',
objective: '',
assessment: '',
plan: '',
ai_sugestie: ''
}
// Update single section
setEditedData(prev => ({
...prev,
soap: {
...prev.soap,
[section]: value
}
}), { source: 'user' });

SOAP pola są automatycznie zapisywane:

// useAutosave in useVisitSelection
useAutosave({
trigger: `${selectedVisit?.id}:${editCounter}:${version}`,
idleMs: 2000,
canSave: hasChanges && !errors && !aiBusy,
save: () => saveVisit(true),
});

Przed finalizacją wizyty SOAP powinien być kompletny:

// visitApi.finalize
await visitApi.finalize(visitId, editedData, version);
// Updates visit_status to 'finalized'
// SOAP fields are locked after finalization

SOAP może być pre-filled z szablonu:

// VisitTemplate
{
visitType: 'vaccination',
defaultSubjective: 'Szczepienie profilaktyczne.',
defaultObjective: 'Pacjent w dobrym stanie ogólnym.',
defaultAssessment: '',
defaultPlan: 'Szczepienie wykonane. Kontrola za rok.',
}

→ Zobacz Visit Templates