====== 4.2 wvds-amed-pims — PIMS-Extension ======
//Stand: 2026-03-06//
Übergeordnet: [[de:int:wvdsshell:notes:04-vsix:start|4. VSIX-Module — Gesamtübersicht]]
Verwandt: [[de:int:wvdsshell:notes:03-pims:start|3. PIMS-Architektur]] | [[de:int:wvdsshell:notes:03-pims:inspection|3.1 Prüfwesen]] | [[de:int:wvdsshell:notes:03-pims:work-orders|3.2 Aufträge]] | [[de:int:wvdsshell:notes:03-pims:safety|3.3 Sicherheitsgespräche]] | [[de:int:wvdsshell:notes:04-vsix:amed-cafm|← 4.1 CAFM-Extension]]
===== Zweck =====
Die Extension ''wvds-amed-pims'' ist die Benutzeroberfläche für die Prozessführung. Sie zeigt Prüfpläne, Arbeitsaufträge, Sicherheitsgespräche und Rohrleitungsprüfungen aus ENIVERSPIMS. Die vier Topics (PIMS-INSP, PIMS-EZA, PIMS-WORK, PIMS-PIPE) bilden die Prozesskette ab, die bisher über WIS/TimeTrain, vierzig AMED-Module und LD/ENIVERS ARBEIT verteilt war.
PIMS verwaltet keine Assets selbst — alle physischen Objekte (TP, Equipment, Rohre) liegen in ENIVERSCAFM. PIMS referenziert sie über ''asset.item.id'' via Cross-DB-Synonym.
===== Views =====
==== PIMS-INSP — Inspektionsplanung ====
^ View ^ Form ^ Beschreibung ^
| INSP-Planung | ''InspPlan.wfm'' | Prüfpläne verwalten: ''inspection.schedule'' mit zugeordneten Regeln (''inspection.rule''). Filter nach Disziplin, Intervall, Fälligkeit. Forecast-Ansicht: welche Prüfungen stehen in den nächsten 30/90/365 Tagen an? |
| INSP-Aufgaben | ''InspTasks.wfm'' | Offene Prüfaufgaben (''inspection.task''). Fällig heute, diese Woche, überfällig. Zuweisungs-Dialog für Prüfer. Status-Wechsel: offen → in Arbeit → erledigt. |
| INSP-Ergebnisse | ''InspResult.wfm'' | Prüfergebnis erfassen: Bestanden/Mangel, Messwerte (''inspection.measurement''), Bemerkungen, Foto-Upload. Bei Mangel: automatische Weiterleitung an ''fault.report'' (→ PIMS-WORK). |
**Gateway-Endpunkte:**
^ Methode ^ Route ^ Beschreibung ^
| GET | ''/api/v1/pims/insp/schedules?branch={id}'' | Prüfpläne pro Betriebsstätte |
| GET | ''/api/v1/pims/insp/schedules/{id}/rules'' | Regeln eines Prüfplans |
| GET | ''/api/v1/pims/insp/tasks?due={range}'' | Offene Aufgaben nach Fälligkeitszeitraum |
| GET | ''/api/v1/pims/insp/forecast?days={n}'' | Forecast: fällige Prüfungen in n Tagen |
| POST | ''/api/v1/pims/insp/tasks/{id}/result'' | Prüfergebnis erfassen |
| POST | ''/api/v1/pims/insp/tasks/{id}/assign'' | Aufgabe einem Prüfer zuweisen |
**Pascal-Units:**
^ Unit ^ Verantwortung ^
| ''Pims.InspPlan.pas'' | Prüfplan-Verwaltung, Regel-Editor, Forecast-Chart |
| ''Pims.InspTasks.pas'' | Aufgabenliste, Fälligkeits-Ampel, Zuweisungs-Dialog |
| ''Pims.InspResult.pas'' | Ergebnis-Formular, Messwert-Eingabe, Mangel-Weiterleitung |
**WP-Abhängigkeiten:**
^ WP ^ Inhalt (Backend) ^ Freigeschaltete UI-Funktion ^
| PIMS-INSP 01 | ''inspection.*'' Schema Grundstruktur | Leere INSP-Views ladbar (Schema existiert) |
| PIMS-INSP 02 | RuleBase-Migration aus WIS | Regeln sichtbar in Prüfplan-View |
| PIMS-INSP 03 | TimeTrain + ''sp_GenerateTasks'' | Aufgaben sichtbar in INSP-Aufgaben |
| PIMS-INSP 04 | Nachtjob ''sp_JedeNacht'' | Automatisch generierte Aufgaben am nächsten Tag |
| PIMS-INSP 05 | Forecast-Funktionen | Forecast-Chart in INSP-Planung |
| PIMS-INSP 06 | WIS Synonym-Ablösung (63 Synonyme) | Kein WIS-Linked-Server mehr nötig (Backend-only) |
| PIMS-INSP 07 | PROOF/HIST-DB Ablösung | Historische Daten in INSP-Ergebnisse sichtbar |
==== PIMS-EZA — Sicherheit / EZA-Verwaltung ====
^ View ^ Form ^ Beschreibung ^
| EZA-Verwaltung | ''Eza.wfm'' | EZA-Stammdaten (''safety.eza_master'') verwalten: Instrument, Schutzziel, SIL-Bewertung, zugeordnete Prüfvorschriften (BGV A3, ATEX). Filter nach SIL-Stufe, Prüfstatus. |
| Sicherheitsgespräche | ''EzaTalk.wfm'' | Sicherheitsgespräch-Protokoll erfassen (''safety.conversation''): Aktoren, Sensoren, Begründungen, 4-dimensionale Risikobewertung, Unterschriften. |
**Gateway-Endpunkte:**
^ Methode ^ Route ^ Beschreibung ^
| GET | ''/api/v1/pims/eza?sil={level}'' | EZA-Instrumente nach SIL-Stufe |
| GET | ''/api/v1/pims/eza/{id}'' | EZA-Stammdaten inkl. Schutzziel, SIL |
| GET | ''/api/v1/pims/eza/{id}/conversations'' | Sicherheitsgespräche zu einem Instrument |
| POST | ''/api/v1/pims/eza/{id}/conversation'' | Neues Sicherheitsgespräch anlegen |
| GET | ''/api/v1/pims/eza/{id}/prerequisites'' | Prüfvorschriften (BGV A3, ATEX etc.) |
**Pascal-Units:**
^ Unit ^ Verantwortung ^
| ''Pims.Eza.pas'' | EZA-Liste, SIL-Filter, Prüfvorschriften-Zuordnung |
| ''Pims.EzaTalk.pas'' | Gesprächsprotokoll: Risikomatrix, Aktoren/Sensoren, Signatur |
**WP-Abhängigkeiten:**
^ WP ^ Inhalt (Backend) ^ Freigeschaltete UI-Funktion ^
| PIMS-EZA 01 | ''safety.*'' Schema Grundstruktur | Leere EZA-Views ladbar |
| PIMS-EZA 02 | AMED EZAMASTER Migration | EZA-Instrumente sichtbar in EZA-Verwaltung |
| PIMS-EZA 03 | Sicherheitsgespräche aus AMED | Gesprächs-Historie in EzaTalk |
| PIMS-EZA 04 | Prüfvorschriften BGV A3, ATEX | Vorschriften-Tab in EZA-Verwaltung |
| PIMS-EZA 05 | EZA-Lifecycle + PIMS-INSP Anbindung | Cross-Ref: Prüfaufgaben pro EZA-Instrument |
==== PIMS-WORK — Arbeitsaufträge / Instandhaltung ====
^ View ^ Form ^ Beschreibung ^
| Arbeitsaufträge | ''WorkOrders.wfm'' | Zentrale Auftragsliste (''work.order''): Typ-Filter (U=Überprüfung, R=Reparatur, W=Wartung, S=Sonstiges). Status-Tracking: offen → geplant → in Arbeit → abgeschlossen. Kosten-Übersicht (''work.order_cost''). |
| Schadensmeldungen | ''FaultReports.wfm'' | Schaden/Mangel melden (''fault.report''): Asset auswählen, Schadensart, Fotos, Priorität. Automatische Erzeugung eines ''work.order'' (Typ R). Rückverfolgung zur Prüfung (wenn aus INSP-Ergebnis erzeugt). |
**Gateway-Endpunkte:**
^ Methode ^ Route ^ Beschreibung ^
| GET | ''/api/v1/pims/work/orders?type={t}&status={s}'' | Aufträge mit Typ/Status-Filter |
| GET | ''/api/v1/pims/work/orders/{id}'' | Auftrags-Detail inkl. Kosten, Plan, verknüpfte Prüfung |
| POST | ''/api/v1/pims/work/orders'' | Neuen Auftrag anlegen |
| PATCH | ''/api/v1/pims/work/orders/{id}/status'' | Status-Wechsel |
| GET | ''/api/v1/pims/fault/reports?priority={p}'' | Schadensmeldungen nach Priorität |
| POST | ''/api/v1/pims/fault/reports'' | Neue Schadensmeldung (erzeugt automatisch work.order) |
**Pascal-Units:**
^ Unit ^ Verantwortung ^
| ''Pims.WorkOrders.pas'' | Auftragsliste, Typ/Status-Filter, Kosten-Zusammenfassung |
| ''Pims.FaultReports.pas'' | Schadensmeldungs-Formular, Verknüpfung mit Prüfergebnis |
**WP-Abhängigkeiten:**
^ WP ^ Inhalt (Backend) ^ Freigeschaltete UI-Funktion ^
| PIMS-WORK 01 | ''work.*'' Schema | Leere WORK-Views ladbar |
| PIMS-WORK 02 | AMED Reparaturen-Migration | Historische Reparaturen sichtbar |
| PIMS-WORK 03 | Schadenmeldungen + Schadensarten | Schadensmeldungs-Formular aktiv |
| PIMS-WORK 04 | Stillstandsplanung | Planungs-Tab in Auftrags-Detail |
| PIMS-WORK 05 | Archivierung + PIMS-INSP Anbindung | Cross-Ref: Auftrag → Prüfung, Archiv-Filter |
==== PIMS-PIPE — Rohrleitungen ====
^ View ^ Form ^ Beschreibung ^
| Rohr-Bestand | ''Piping.wfm'' | Rohrleitung-Übersicht: ''asset.item'' mit ''type_code=piping''. Property-Grid mit JSON-Eigenschaften (ehemals 150 EAV-Spalten aus TecDB). Zugeordnete Prüfpläne (Cross-Ref PIMS-INSP). Dekommissionierungs-Status. |
**Gateway-Endpunkte:**
^ Methode ^ Route ^ Beschreibung ^
| GET | ''/api/v1/cafm/obj?type=piping'' | Rohrleitungsobjekte (via CAFM-API, type-Filter) |
| GET | ''/api/v1/cafm/obj/{id}'' | Rohrleitungs-Detail inkl. JSON-Properties |
| GET | ''/api/v1/pims/insp/schedules?item={id}'' | Prüfpläne für diese Rohrleitung (via INSP-API) |
**Pascal-Unit:**
^ Unit ^ Verantwortung ^
| ''Pims.Piping.pas'' | Rohr-Bestand, Property-Grid, Prüfplan-Cross-Ref, Dekomm. |
**Besonderheit:** PIMS-PIPE nutzt **keine eigenen Gateway-Endpunkte** — die Asset-Daten kommen aus der CAFM-API (''type=piping''), die Prüfpläne aus der INSP-API. Die PIPE-View ist damit ein reiner Cross-Domain-Consumer, der beide APIs kombiniert.
**WP-Abhängigkeiten:**
^ WP ^ Inhalt (Backend) ^ Freigeschaltete UI-Funktion ^
| PIMS-PIPE 01 | TecDB Analyse (150 Spalten, EAV) | — (Analyse-Phase, keine UI) |
| PIMS-PIPE 02 | ''property_schema'' für piping | Property-Grid in Piping.wfm zeigt Felder |
| PIMS-PIPE 03 | EAV → JSON Migration | JSON-Properties sichtbar |
| PIMS-PIPE 04 | Trigger-Ablösung (''trgRohrMaster'') | — (Backend-Stabilität, keine UI) |
| PIMS-PIPE 05 | ''v_item_piping'' View + Validierung | Validierter Rohr-Bestand in der Liste |
| PIMS-PIPE 06 | Rohr-Prüfpläne in PIMS-INSP einbinden | Prüfplan-Tab in Piping.wfm |
| PIMS-PIPE 07 | TecDB Abnahme + Dekommissionierung | Dekomm.-Status und Abnahme-Historie |
===== TreeView-Struktur =====
Der TreeView ''amedPimsExplorer'' in der Activity-Bar-Sidebar:
amedPimsExplorer
├── Prüfwesen (INSP) → öffnet InspPlan.wfm
│ ├── Prüfpläne
│ │ └── [Prüfplan X] → öffnet InspPlan.wfm (Detail)
│ ├── Offene Aufgaben (12) → öffnet InspTasks.wfm
│ │ ├── Überfällig (3)
│ │ ├── Heute (4)
│ │ └── Diese Woche (5)
│ └── Forecast → öffnet InspPlan.wfm (Forecast-Tab)
├── Sicherheit (EZA) → öffnet Eza.wfm
│ ├── EZA-Instrumente
│ │ ├── SIL 1
│ │ ├── SIL 2
│ │ └── SIL 3
│ └── Sicherheitsgespräche → öffnet EzaTalk.wfm
├── Arbeitsaufträge (WORK) → öffnet WorkOrders.wfm
│ ├── Offen (23)
│ ├── In Arbeit (8)
│ └── Abgeschlossen (dieses Jahr)
└── Rohrleitungen (PIPE) → öffnet Piping.wfm
├── Aktiv
└── Dekommissioniert
===== Workflow-Kette in der UI =====
Die Views sind entlang des PIMS-Workflows verknüpft — ein Klick führt den Benutzer entlang der Prozesskette:
InspPlan.wfm InspTasks.wfm InspResult.wfm
[Prüfplan auswählen] ────► [Aufgabe öffnen] ────► [Ergebnis erfassen]
│
┌──────┴──────┐
│ │
[Bestanden] [Mangel]
│
▼
FaultReports.wfm
[Schadensmeldung]
│
▼
WorkOrders.wfm
[Reparaturauftrag]
│
[Sicherheitsgespräch nötig?]
│
▼
EzaTalk.wfm
[Gespräch protokollieren]
===== Verzeichnisstruktur =====
wvds-amed-pims/
├── src-pas/
│ ├── extension.pas
│ ├── Pims.Interop.pas
│ ├── Pims.InspPlan.pas
│ ├── Pims.InspTasks.pas
│ ├── Pims.InspResult.pas
│ ├── Pims.Eza.pas
│ ├── Pims.EzaTalk.pas
│ ├── Pims.WorkOrders.pas
│ ├── Pims.FaultReports.pas
│ ├── Pims.Piping.pas
│ ├── services/
│ │ ├── Services.Lifecycle.pas
│ │ └── Services.Gateway.pas
│ └── tree/
│ └── Tree.Pims.pas
├── forms/
│ ├── InspPlan.wfm
│ ├── InspTasks.wfm
│ ├── InspResult.wfm
│ ├── Eza.wfm
│ ├── EzaTalk.wfm
│ ├── WorkOrders.wfm
│ ├── FaultReports.wfm
│ └── Piping.wfm
├── media/
│ └── icons/
│ ├── activity-bar.svg
│ └── pims.svg
├── dist/
├── package.json
├── package.nls.json
├── package.nls.de.json
├── build.ps1
├── CLAUDE.md
└── .vscodeignore
===== package.json (Gerüst) =====
{
"name": "wvds-amed-pims",
"displayName": "%extension.displayName%",
"description": "%extension.description%",
"version": "0.1.0",
"publisher": "wvds",
"engines": { "vscode": "^1.85.0" },
"categories": ["Other"],
"activationEvents": ["onStartupFinished"],
"main": "./dist/extension.js",
"contributes": {
"viewsContainers": {
"activitybar": [
{ "id": "amedPims", "title": "%viewsContainer.title%", "icon": "media/icons/activity-bar.svg" }
]
},
"views": {
"amedPims": [
{ "id": "amedPimsExplorer", "name": "%views.explorer.name%" }
]
},
"commands": [
{ "command": "amed.pims.openInspPlan", "title": "%commands.openInspPlan.title%" },
{ "command": "amed.pims.openInspTasks", "title": "%commands.openInspTasks.title%" },
{ "command": "amed.pims.openEza", "title": "%commands.openEza.title%" },
{ "command": "amed.pims.openWorkOrders", "title": "%commands.openWorkOrders.title%" },
{ "command": "amed.pims.openFaultReports", "title": "%commands.openFaultReports.title%" },
{ "command": "amed.pims.openPiping", "title": "%commands.openPiping.title%" },
{ "command": "amed.pims.refreshExplorer", "title": "%commands.refresh.title%", "icon": "$(refresh)" }
]
}
}