====== 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)" } ] } }