Immobilien-Projektmanager · Monatliche Betriebsanalyse-PPT
Der Kern liegt nicht darin, „die Daten auf die Folie zu setzen“, sondern die Betriebskennzahlen in der kognitiven Reihenfolge des Publikums klar darzulegen und die abweichenden Probleme dann dem Verantwortlichen und einer Frist zuzuordnen.
Das Wissen dieser Fähigkeit ist an zwei Orten gespeichert
| Datei | Für wen | Enthält |
|---|---|---|
SKILL.md (diese Datei) | Mensch / Agent | Warum diese Erzählweise: Erzählbegründung, Ursachenzuordnung, Ausdrucksdisziplin |
deck_spec.json | Werkzeug | Wie es umgesetzt wird: Anzahl der Seiten, Reihenfolge, Vorlagen für Schlussfolgerungen, Farbschema |
deck_spec.json ist das maschinenlesbare Wissen dieser Fähigkeit. Wenn Sie es ändern, können Sie die Seitenanzahl und die Erzählweise der PPT anpassen, ohne Python-Code ändern zu müssen:
{
"page_rules": [ // ← „Wie viele Seiten soll die PPT haben?“ wird hier festgelegt
{"max_minutes": 10, "sections": [7 Abschnitte]},
{"max_minutes": 20, "sections": [11 Abschnitte]},
{"max_minutes": 40, "sections": [16 Abschnitte]}
],
"sections": [{
"key": "revenue", "label": "Einnahmen", "layout": "chart",
"data": {"value_column": "Rechnungsbetrag (Yuan)", "group_column": "Gebührenart"},
"narrative": [ // ← Vorlagen für Schlussfolgerungen: von „Zahlen nennen“ zu „Urteile fällen“
{"when": "top_share > 0.9",
"so_what": "{top_name} macht {top_share_pct}% der Einnahmen aus, die Struktur ist einseitig und die Risikotragfähigkeit gering; "
"im nächsten Monat sollten die Gemeinschaftseinnahmen als eigener Schwerpunkt behandelt werden."},
{"when": "", "so_what": "…Standardklausel…"}
]
}],
"theme": {"colors": {...}, "palette": [...]} // ← Auch das Farbschema ist Wissen
}
Wie die Satzvorlagen funktionieren
Die Engine wählt aus der Liste der Vorlagen die erste Treffer-Bedingung aus und füllt die Platzhalter {Platzhalter} mit echten Zahlen.
Verfügbare Platzhalter (automatisch aus den Daten berechnet): {total} {count} {top_name} {top_share}
{top_share_pct} {group_count} {bottom_name} {bottom_value} …
Formatierungssuffixe: {total:Wan} (÷10000) {share:1%} (Verhältnis → Prozent)
{count:,} (Tausendertrennzeichen) {value:2} (Dezimalstellen)
Unterstützte Bedingungen: > >= < <= == !=, and/or/not, has(x)/empty(x).
Nicht parsbare Bedingungen gelten als nicht zutreffend und verursachen keinen Fehler.
Bei fehlenden Daten erfolgt ehrliche Herabstufung: Der Seitentitel wird mit „Daten fehlen, bitte ergänzen“ gekennzeichnet. Es werden auf keinen Fall andere Spalten verwendet, um die Lücke zu füllen. Wenn z. B. auf der Seite „Kosten“ die Spalte „Kostenart“ deklariert ist, diese Spalte aber in den Daten nicht vorhanden ist, wird klar angegeben, was fehlt.
Kennzahlen müssen aus den Daten berechnet werden, nicht manuell übergeben werden
Im Abschnitt derived wird deklariert, „wie gerechnet wird“, und das Werkzeug führt die Berechnung durch:
"derived": {
"Eingenommener Betrag (Yuan)": {"expr": "Rechnungsbetrag (Yuan) - Ausstehender Betrag (Yuan)"}, // Zeilenweise, wird zur neuen Spalte
"Einzugsquote": {"expr": "Eingenommener Betrag (Yuan) / Rechnungsbetrag (Yuan) * 100",
"scope": "total", "format": "{:.2f}%"} // Berechnet **einen Wert** aus der Summe
}
⚠ Der Standardwert für
scopeistrow(zeilenweise Berechnung, das Ergebnis wird eine neue Spalte); Verhältnis-Indikatoren MÜSSENscope: "total"verwenden – eine zeilenweise Berechnung des Verhältnisses und anschließende Summierung würde absurde Werte wie 1.476.800% ergeben.
Die berechneten Werte werden automatisch in die Faktenliste der Erzählung aufgenommen, sodass {Einzugsquote} direkt in den Satzvorlagen verwendet werden kann.
Praktische Verifizierung (2, Forderungsinformationen.xlsx): Einzugsquote = 92,48%, Ausfallquote = 7,52%.
Die separate Überprüfung anhand der Gruppe „Zahlungsstatus“ stimmt vollständig überein (die Summe der Ausstände bei bezahlten Zeilen = 0).
Ausdrücke dürfen nur Spaltennamen und numerische Konstanten referenzieren und werden mit einer AST-Whitelist ausgewertet – kein eval.
__import__('os') wird zurückgewiesen.
Nur wenn die Dimension nicht in der Haupttabelle vorhanden ist, ist ein Cross-Table-Join erforderlich
datasets + join deklarieren, „welche Tabelle verwendet wird, welche Spalten übernommen werden und nach welchem Schlüssel joined wird“:
"datasets": {
"properties": {"file": "1, Immobilienkundeninformationen.xlsx", "key_column": "Immobiliencode",
"pick": {"Tatsächliche abrechenbare Fläche (m²)": "Tatsächliche abrechenbare Fläche"}}
},
"join": {"dataset": "properties", "left_on": "Vollständiger Immobilienname", "how": "left"}
Reihenfolge: Zuerst join, dann berechne die abgeleiteten Werte – sonst sind die in den abgeleiteten Ausdrücken referenzierten Dimensionsspalten noch nicht vorhanden.
Lektion: Zuerst prüfen, ob ein Join wirklich nötig ist. Ursprünglich wurde angenommen, dass für die Einzugsquote ein Cross-Table-Join erforderlich sei. Nach der Überprüfung stellte sich jedoch heraus, dass Tabelle 2 sowohl Rechnungs- als auch Ausstehende Beträge enthält, sodass eine einzelne Tabelle ausreicht. Was wirklich einen Join benötigt, ist der „Durchschnittspreis“ (die Fläche befindet sich in Tabelle 1).
Es müssen drei Dinge geliefert werden
| Liefergegenstand | Form | Zweck |
|---|---|---|
| ① Berichts-PPTX | 16:9 bearbeitbare Präsentation | Folien, zum „Ansehen“ |
| ② Prüfbericht checks.json | JSON (vom Werkzeug pptx_check erzeugt) | Struktureller Integritätsnachweis |
| ③ Sprechnotiz | Chat-Text / Markdown (Vorlage siehe references/03- Besprechungsnotiz.md) | Wortlaut, zum „Sprechen“ |
Wann verwenden
- PPT für die monatliche/quartalsweise Betriebsanalyse eines Immobilienprojekts
- Betriebsberichte für die regionale Betriebszentrale oder den General Manager
- Benötigt: Ursachenanalyse von Kostenüberschreitungen, Einzugsquotenanalyse, Personalproduktivitätsanalyse
- Schlüsselwörter: „Monatsbericht des Projektmanagers“, „Material für die Betriebsanalyse-Sitzung", „PPT für das Projektbetriebs-Dashboard“
Fünfstufige Verarbeitungspipeline
Benutzereingabe (Daten)
|
v
+-------------------+
| Stufe 1: Datenverständnis | Eingabe parsen, Standardwerte ergänzen, Messgrößen validieren
+-------------------+
|
v
+-------------------+
| Stufe 2: Datenanalyse | Berechnung von Einnahmen/Kosten/Einzugsquote/Effizienz, Sortierung von Abweichungen, Ursachenzuordnung
+-------------------+
|
v
+-------------------+
| Stufe 3: PPT-Strukturplanung | Seitenanzahl, Diagrammtypen, Schlussfolgerungstitel pro Seite festlegen
+-------------------+
|
v
+-------------------+
| Stufe 4: Inhaltsgenerierung | DATA-Wörterbuch erstellen, Schlussfolgerungen generieren, Sprechnotiz füllen
+-------------------+
|
v
+-------------------+
| Stufe 5: Aufruf des PPT-Tools| Ausführen von build_deck.py → Prüfung → Auslieferung
+-------------------+
|
v
Erstellen von .pptx + checks.json + Besprechungsnotiz
Stufe 1: Datenverständnis
1.0 Woher kommen die Daten (drei Pfade, nach Priorität)
| Priorität | Methode | Erklärung |
|---|---|---|
| 1 | Benutzer hat Daten im Gespräch bereitgestellt | Agent füllt die Daten in den data-Parameter |
| 2 | Benutzer hat Dateinamen/Hinweise gegeben | Skill sucht automatisch in Standardverzeichnissen nach Dateien und extrahiert Daten (siehe unten) |
| 3 | Keine von beidem | Mit Standardvorlage generieren, dazu eine Warnung wegen unzureichender Daten ausgeben |
Automatische Datenextraktion: Wenn data leer ist, wird der Skill:
- Aus der
requestDateinamen-Hinweise parsen (z. B. „die Verkaufstabelle vom letzten Monat“) - In
data/commonunddata/inboxmit unscharfer Suche nach Dateien suchen - Mit pandas lesen, Datums-/Betrags-/Gruppenspalten automatisch erkennen
- In die Vertragsstruktur umwandeln (Beträge ÷10000 in Wan-Yuan, Verhältnisse als Dezimalbrüche)
- Als
input_data.jsonspeichern und dem Generierungsskript übergeben
Der Benutzer muss also nur sagen: „Erstellen Sie mit der Verkaufstabelle vom letzten Monat eine Betriebsanalyse-PPT“. Der Pfad muss nicht angegeben werden – vorausgesetzt, die Datei befindet sich bereits in data/common.
Überschreibbare Suchwurzel: SKILL_COMMON_DIRS=D:\Tabellen;E:\Monatsberichte
Automatische Datenextraktion deaktivieren: auto_resolve_data=False
Immobilienprojekt-Datenquellen (gemessene Messgrößen in data/common)
| Tabelle | Datei | Zweck | Messgrößen-Erläuterung |
|---|---|---|---|
| Tabelle 2 | 2, Forderungsinformationen.xlsx | Haupttabelle (15.876 Zeilen) | Einnahmen gruppiert nach „Gebührenart“; „Rechnungsbetrag/Ausstehender Betrag“ leitet Einzugsquote ab (gemessen: 92,48%) |
| Tabelle 1 | 1, Immobilienkundeninformationen.xlsx | Dimensionstabelle: Tatsächliche abrechenbare Fläche | Join nach „Immobiliencode“ = Haupttabelle „Vollständiger Immobilienname“ → leitet Durchschnittspreis ab (gemessen: 0,30 Yuan/m²·Periode) |
| Tabelle 4 | 4, Bericht über Außenstände.xlsx | Dimensionstabelle: Säumnisgründe (7 Kategorien) | Kopfzeile in Zeile 2 (header_row=1), Tabellenende mit Summenzeile (wird automatisch verworfen); Join nach „Vollständiger Immobilienname“ → Seite „Ursachen für Außenstände“ |
| Tabelle 5 | 5, Detailtabelle zur Immobilieneinzugsquote.xlsx | Nicht verwenden | Drei Header-Zeilen, breites Tabellenformat, neigt zu Konflikten mit der abgeleiteten Messgröße aus Tabelle 2; Tabelle 2 hat immer Vorrang |
Ehrliche Herabstufungserklärung: In den Projektdaten sind keine Kosten, Budgets, Personenzahlen oder Arbeitsaufträge enthalten.
Die Kostenseite wurde durch die Seite „Außenstände & Mahnung“ ersetzt (mit echten, nutzbaren Daten). Die Effizienzseite enthält nur den datengestützten „Durchschnittspreis“. Viertel-Altersdaten sind nicht in Tabelle 2 – wenn benötigt, führt der Haupt-Agent zuerst eine Fälligkeitsanalyse mit dem Unter-Agenten für Mahnwesen durch und übergibt die Ergebnisse dann als extra_facts an diesen Skill.
1.1 Parsen der Benutzereingabe → Extrahieren der grundlegenden Informationen
| Element | Standard/Beispiel | Erklärung |
|---|---|---|
| Projektname | XX Wohnanlage | Erforderlich, falls fehlend mit „Noch zu ergänzen“ kennzeichnen |
| Berichtszeitraum | Dieser Monat | Erforderlich |
| Währungseinheit | Wan-Yuan (10.000 Yuan) | Im gesamten Dokument einheitlich, nicht mischen; wenn Rohdaten in „Yuan“ vorliegen, muss ÷10000 gerechnet werden |
| Verhältnis-Messgröße | Dezimalbruch | 0.952 = 95,2%; Übergabe von 95.2 würde als 9520% dargestellt |
| Vergleichsbasis | Monatsbudget + Vormonat | Mindestens ein Referenzrahmen |
| Berichtsdauer | 20 Minuten | Bestimmt die Seitenanzahl |
1.2 Datenvollständigkeitsprüfung – Sieben erforderliche Datengruppen
Prüfen, ob der Benutzer die folgenden sieben Datengruppen bereitgestellt hat. Fehlt eine Gruppe, wird die entsprechende Seite mit „Noch zu ergänzen“ gekennzeichnet:
| # | Datengruppe | Spezifische Felder |
|---|---|---|
| 1 | Einnahmenpositionen | Verwaltungsgebühren, Gemeinschaftseinnahmen, Nebengeschäfte, Sonstige (Ist + Budget) |
| 2 | Kostenpositionen | Personal, Allgemeinenergie, Fremdvergabe, Wartung/Instandhaltung, Material, Verwaltungskosten (Ist + Budget) |
| 3 | Einzugsdaten | Forderungen laufender Monat / Eingänge laufender Monat / Alte Außenstände Anfangsbestand / Alte Außenstände Rückgewinnung |
| 4 | Altersstruktur | 0-30 / 31-90 / 91-180 / 180+ Tage ausstehende Beträge |
| 5 | Effizienzdaten | Personalanzahl, Verwaltungsfläche, Arbeitsauftragsvolumen, Personalkosten |
| 6 | Abweichende Posten | 3-5 Posten mit der größten Abweichung und deren nachvollziehbare Ereignisse |
| 7 | Maßnahmen Vormonat | Erledigungsstatus (muss rückgemeldet werden, um einen Kreislauf zu schließen) |
1.3 Validierung der Messgrößen
Vor dem Eintritt in die Analyse MÜSSEN die Datenmessgrößen anhand der folgenden roten Linien überprüft werden:
- Gemeinschaftseinnahmen stehen gesetzlich allen Eigentümern zu, müssen separat ausgewiesen und nicht in den Betriebsgewinn einbezogen werden
- Nenner der laufenden Einzugsquote = Rechnungsbetrag des laufenden Monats, darf nicht die Rückgewinnung alter Außenstände enthalten
- Personalkosten müssen Sozialversicherung, Wohnbauzuschuss, Überstundenvergütung, umgerechnete Fremdleistungskosten enthalten
- Energiekosten müssen zwischen „Umlage Allgemeinfläche“ und „Eigenverbrauch Verwaltung“ unterscheiden
- Einmalausgaben (Notfallreparaturen, Großreparaturen) werden separat ausgewiesen und nicht in die monatlich vergleichbare Messgröße einbezogen
- Personalproduktivität muss zusammen mit der Personalkostenquote beurteilt werden, nicht nur die reine Personalzahlenänderung betrachten
Stufe 2: Datenanalyse
2.1 Analysereihenfolge (MUSS in dieser Reihenfolge erfolgen, nicht ändern)
Einnahmenanalyse → Kostenanalyse → Einzugsquotenanalyse → Personalproduktivitätsanalyse → Ursachenanalyse abweichender Posten
Grund für die Reihenfolge: Die Einzugsquote ist die Frucht der Servicequalität (nicht geschlossene Beschwerden → Eigentümer verweigern Zahlung). Die Darstellung von Ursache und Wirkung ist erst nach den Einnahmen und Kosten sinnvoll. Die Ursachenanalyse muss auf den vier betrieblichen Grundpfeilern aufbauen, sonst wird die Diskussion unkonzentriert.
2.2 Einnahmenanalyse
- Berechnung der Ist-vs-Budget-Abweichung für jede Einnahmenposition
- Berechnung der Budgeterfüllungsquote = Ist-Einnahmen des Monats / Budget-Einnahmen des Monats
- Berechnung des Anteils der Einnahmenstruktur
- Gemeinschaftseinnahmen separat ausweisen, mit dem Vermerk „Gehört allen Eigentümern gemeinsam, nicht im Betriebsgewinn enthalten“
2.3 Ursachenanalyse für Außenstände (ursprüngliche Kostenanalyse, aber in diesem Projekt keine Kostendaten)
Da dieses Projekt keine Kostenpositionen enthält, wird dieser Abschnitt durch eine Ursachenanalyse für Außenstände nach Säumnisgrund ersetzt – eine Seite, die für den Cashflow ebenso wichtig ist wie die Kosten im Immobiliengeschäft:
- Gruppierung und Aggregation von „Ausstehender Betrag (Yuan)“ aus der Haupttabelle nach dem gejointen Feld „Säumnisgrund“ (gemessene Summe: 36.400 Yuan, vollständig mit der Einzelpostensumme im Bericht über Außenstände übereinstimmend)
- ⚠ Nicht den gejointen Wert „Gesamtausstehender Betrag (Yuan)“ aggregieren – dies ist die Summe pro Wohneinheit und würde durch mehrere Rechnungszeilen derselben Einheit mehrfach gezählt
- Vierstufige Klassifizierung der Säumnisgründe und Zuordnung von Mahnstrategien: Servicestreitigkeit (zuerst Verbesserung, dann Mahnung) / Objektive Schwierigkeit (Ratenzahlungsplan) / Böswillige Nichtzahlung (eskalierendes Schreiben) / Unbekannt/Leerstand (Vor-Ort-Prüfung)
- Sobald Kostendaten verfügbar sind, kann der Abschnitt
arrearsin derdeck_spec.jsoneinfach wieder durch den Abschnittcostersetzt werden. Die Toolkette muss nicht angepasst werden.
2.4 Einzugsquotenanalyse – Drei-Ebenen-Aufschlüsselung der Kennzahlen
| Kennzahl | Berechnungsformel |
|---|---|
| Laufende Einzugsquote | Eingänge laufender Monat / Forderungen laufender Monat (ohne Rückgewinnung alter Außenstände) |
| Kumulierte Einzugsquote | Eingänge seit Jahresbeginn / Forderungen seit Jahresbeginn |
| Rückgewinnungsquote alter Außenstände | Rückgewinnung historischer Außenstände in der Periode / Gesamtbestand alter Außenstände zu Periodenbeginn |
In Kombination mit einer Fälligkeitspyramide: 0-30 / 31-90 / 91-180 / 180+ Tage. Je länger die Fälligkeit, desto geringer die Wahrscheinlichkeit einer Rückgewinnung (über 180 Tage nur 10 %–20 %).
Schichtung der Säumnisgründe: Servicestreitigkeit / Objektive Schwierigkeit / Böswillige Nichtzahlung / Unbekannt/Leerstand. Die ersten beiden Arten werden durch Service-Wiederherstellung behoben, die letzten beiden durch Mahnmechanismen.
2.5 Personalproduktivitätsanalyse
| Kennzahl | Berechnungsformel |
|---|---|
| Verwaltungsfläche pro Kopf | Verwaltete Bruttogeschossfläche ÷ (Eigenpersonal + umgerechnete Fremdleistungskräfte) |
| Wertschöpfung pro Kopf | Betriebseinnahmen ÷ Gesamtpersonal Projekt |
| Arbeitsaufträge pro Kopf | Anzahl abgeschlossener Arbeitsaufträge ÷ Anzahl Techniker |
| Personalkostenquote | Personalkosten ÷ Betriebseinnahmen (inverser Indikator, je niedriger desto besser) |
⚠ Fallstrick: Der Ersatz von Eigenpersonal durch Fremdpersonal macht den Nenner kleiner und die Zahlen besser. Dies muss in Verbindung mit der Personalkostenquote beurteilt werden.
2.6 Ursachenanalyse abweichender Posten – Drei-Ebenen-Penetrationsmethode
Dies ist der wertvollste Schritt der gesamten Analyse.
| Ebene | Zu beantwortende Frage | Ausgabe |
|---|---|---|
| Erste Ebene: Quantifizierung der Abweichung | Handelt es sich um eine Mengen-, Preis- oder methodische Abweichung? | Abweichungsbetrag + Abweichungsrate |
| Zweite Ebene: Treiberfaktoren | Bis zu einem nachvollziehbaren konkreten Ereignis aufschlüsseln | Eine verifizierbare Ereignisbeschreibung |
| Dritte Ebene: Verantwortungszuordnung | Kontrollierbar / Teilweise kontrollierbar / Unkontrollierbar? Hauptverantwortlich? | Verantwortliche Abteilung + Korrekturmaßnahme + Frist |
Beispiel für die Aufschlüsselung der Personalkostenabweichung:
Abweichung = Personalabweichung × Budget-Durchschnittsgehalt (Mengenabweichung)
+ Budgetpersonal × Durchschnittsgehaltsabweichung (Preisabweichung)
+ Methodische / Einmaleffekte (Methodische Abweichung)
Schreibregeln:
- ❌ „Energiekosten gestiegen“ → ✅ „Energiekosten über Budget um 21.000 Yuan, verursacht durch die Verzögerung der Tiefgaragenbeleuchtungs-Umrüstung (vollmonatlicher Einsatz alter Leuchten, 12.000 Yuan) + verlängerte Testläufe von 3 Aufzügen nach der jährlichen Prüfung (9.000 Yuan)“
- ❌ „Reparaturkosten über Budget“ → ✅ „Reparaturkosten über Budget um 13.000 Yuan, Notfallreparatur eines geplatzten Abwasserrohrs in Gebäude 5 (13.000 Yuan, unkontrollierbar)“
Eine Ursachenanalyse ohne Verantwortlichen und Frist ist keine Ursachenanalyse.
Stufe 3: PPT-Strukturplanung
3.1 Berichtsreihenfolge (sechsteilig, nicht änderbar)
① Einseitiges Fazit (30-Sekunden-Entscheidung)
② Einnahmen: Woher kommt das Geld → Verwaltungsgebühren / Gemeinschaftseinnahmen / Nebengeschäfte / Sonstige
③ Außenstände & Mahnung: Wer schuldet Geld? → Vierstufige Klassifizierung der Säumnisgründe: Service / Schwierigkeit / Böswillig / Unbekannt
④ Einzugsquote: Wurde das Geld eingezogen? → Laufend / Kumuliert / Alte Außenstände / Altersstruktur
⑤ Personalproduktivität: Ist das Personal wirtschaftlich? → Durchschnittspreis / Fläche pro Kopf / Personalkostenquote / Arbeitsaufträge pro Kopf
⑥ Ursachenanalyse abweichender Posten → Drei-Ebenen-Penetration: Quantifizierung → Treiberereignis → Verantwortung & Kontrollierbarkeit
⑦ Zusammenfassung & Maßnahmen → 3–5 Punkte, jeder mit Verantwortlichem + Frist + quantifizierbarem Abnahmekriterium
3.2 Seitenplanung
| Dauer | Empfohlene Seitenanzahl | Strukturbehandlung |
|---|---|---|
| 10 Minuten | 6–8 Seiten | Einseitiges Fazit + Einnahmen/Kosten + TOP 3 Abweichungen + Maßnahmen |
| 20 Minuten | 12–16 Seiten | Vollständiger sechsteiliger Aufbau, Ursachenanalyse für TOP 5 Abweichungen |
| 40 Minuten | 20–28 Seiten | Zusätzlich: Trendvergleiche (3–6 Monate), Branchenbenchmarks, vertiefte Einzelanalysen |
3.3 Diagrammauswahl
| Analyseinhalt | Diagrammtyp |
|---|---|
| Einnahmen Ist vs. Budget | Zweifach-Säulendiagramm |
| Rangfolge der Kostenabweichungen | Balkendiagramm (semantische Farben Rot/Gelb/Grün) |
| Einzugsquote + Altersstruktur | Gestapeltes Säulendiagramm + 3-stufige Kennzahlenkarten |
| Personalproduktivitätstrend | Kombiniertes Säulen- und Liniendiagramm (Sekundärachse für Kostenquote) |
| Abweichungs-Ursachenanalyse | Balkendiagramm + Zuordnungstabelle |
| Maßnahmen | Aktionskarten (Verantwortlicher/Frist/Abnahmekriterium) |
3.4 Vorlage für die Seitenstruktur
┌──────────────────────────────┐
│ Kopfzeile: Nummer + schlussfolgernder Titel + Phasen-Label │
├──────────────────────────────┤
│ │
│ Diagramm-/Datenvisualisierungsbereich │
│ │
├──────────────────────────────┤
│ Schlussfolgerungszeile: so_what Satz │
├──────────────────────────────┤
│ Fußnote: Messgrößenerläuterung │
└──────────────────────────────┘
Stufe 4: Inhaltsgenerierung
4.1 Erstellung des DATA-Wörterbuchs
Basierend auf den Analyseergebnissen aus Stufe 2 werden die Daten in das standardisierte DATA-Wörterbuch eingetragen.
DATA = {
"Projekt": "<Projektname>",
"Zeitraum": "<YYYY Monat M>",
"Einnahmen": {"Verwaltungsgebühren": 0, "Gemeinschaftseinnahmen": 0, "Nebengeschäfte": 0, "Sonstige": 0},
"Einnahmen_Budget": {...},
"Kosten": {"Personalkosten": 0, "Allgemeinenergie": 0, "Fremdvergabe": 0, "Reparatur/Wartung": 0, "Material/Verbrauch": 0, "Verwaltung/Sonstige": 0},
"Kosten_Budget": {...},
"Einzug": {"Forderungen laufender Monat": 0, "Eingänge laufender Monat": 0, "Alte Außenstände Anfangsbestand": 0, "Rückgewinnung alter Außenstände": 0},
"Altersstruktur": {"0-30 Tage": 0, "31-90 Tage": 0, "91-180 Tage": 0, "Über 180 Tage": 0},
"Effizienz": {"Verwaltungsfläche pro Kopf": 0, "Wertschöpfung pro Kopf": 0, "Personalkostenquote": 0, "Arbeitsaufträge pro Kopf": 0},
"Trend_Monate": [...],
"Trend_Einnahmen": [...],
"Trend_Kosten": [...],
"Budgeterfüllungsquote": 0,
"Kostenquote": 0,
"Budget_Kostenquote": 0,
"Fazit_des_Monats": "<Dreizeilige Zusammenfassung: Betriebsergebnis + größte Abweichung + erste Maßnahme des nächsten Monats>",
"Groesste_Abweichung": "<Posten und Betrag der größten Abweichung>",
"Erste_Massnahme": "<Maßnahme mit höchster Priorität für den nächsten Monat>",
}
4.2 Generieren von Schlussfolgerungen pro Seite (so_what)
Pro Seite muss ein Schlussfolgerungssatz generiert werden, der das Publikum nicht im Unklaren lässt.
| Seite | Muster für den Schlussfolgerungssatz |
|---|---|
| Einseitiges Fazit | „Die Einnahmenseite hat die Anforderungen im Wesentlichen erfüllt, die Kostenseite ist der einzige Minuspunkt in diesem Monat; lösen Sie zuerst die Kosten, dann wird die Einzugsquote von selbst steigen.“ |
| Einnahmen | „Die Lücke von X Wan-Yuan bei den Nebengeschäften muss im nächsten Monat wieder aufgeholt werden; Gemeinschaftseinnahmen dürfen nicht in den Betriebsgewinn einfließen, um das Ergebnis zu schönen.“ |
| Kosten | „Die ersten beiden Abweichungen sind teilweise kontrollierbar und müssen in diesem Monat korrigiert werden; die letzten beiden sind unkontrollierbare/methodische Faktoren.“ |
| Einzugsquote | „Die Einzugsquote ist die Frucht der Servicequalität: Die Beschwerdeschließungsrate in diesem Monat liegt bei X%, die Reparaturzeitquote bei Y%. Dies sind die vorgelagerten Ursachen für die Einzugsquotenlücke.“ |
| Personalproduktivität | „Die Personaleffizienz hat sich nicht verschlechtert, aber die Kostenquote steigt zwei Monate in Folge. Im nächsten Monat müssen strukturelle Anpassungen bei der Schichtplanung und der Fremdleistungsabrechnung vorgenommen werden.“ |
| Abweichungs-Ursachenanalyse | „Die Verzögerung der Maßnahme (XXX) aus dem Vormonat ist die direkte Ursache für die Energieüberschreitung. Diese muss diesen Monat abgeschlossen werden, sonst wiederholt sich das Problem im nächsten Monat.“ |
| Zusammenfassung & Maßnahmen | „Ziele für den nächsten Monat: Einnahmen X Wan-Yuan, Kostenquote auf höchstens Y% senken; Risikowarnung: XXX muss vorzeitig beantragt werden.“ |
4.3 Ausdrucksdisziplin
Diese 6 Regeln entscheiden darüber, ob der Bericht professionell ist, und müssen in der Inhaltsgenerierungsphase eingehalten werden:
- Der Titel formuliert die Schlussfolgerung, nicht den Spaltennamen. ❌ „Kostenanalyse“ → ✅ „Kosten überschreiten Budget um 39.000 Yuan, Personal und Energie tragen gemeinsam 92% der Abweichung bei“
- Jede Seite hat einen so-what-Satz. Unter dem Diagramm muss eine Schlussfolgerungszeile stehen.
- Zahlen müssen mit Messgröße und Zeitraum angegeben werden. ❌ „Einzugsquote 92%“ → ✅ „Laufende Einzugsquote 92,0% (Messgröße: Eingänge laufender Monat / Forderungen laufender Monat, ohne Rückgewinnung alter Außenstände)“
- Die Farbbedeutung ist im gesamten Dokument festgelegt: Ziel erreicht = Grün (#2EA06A), Warnung = Gelb (#E8A31D), Ziel nicht erreicht = Rot (#D9453D)
- Die Ursachenanalyse muss geschlossen sein: Posten / Abweichungsbetrag / Abweichungsrate / Hauptgrund / Kontrollierbarkeit / Verantwortliche Abteilung / Frist
- Details in den Anhang, nur die Schlussfolgerungsdiagramme in den Hauptteil
4.4 Generieren der Besprechungsnotiz
Gemäß der Vorlage in references/03- Besprechungsnotiz.md wird für jede Seite eine dreiteilige Besprechungsnotiz generiert:
| Teil | Inhalt | Dauer |
|---|---|---|
| Schlussfolgerung zuerst | Was ist die Schlussfolgerung dieser Seite? | 10 Sekunden |
| Datenunterstützung | Schlüsselzahlen + Messgröße + Referenzrahmen | 30 Sekunden |
| Hauptursache & Maßnahme | Warum + Wer + Wann + Wie abnahmen | 30 Sekunden |
Rote Linien für die Besprechungsnotiz:
- Zuerst die Schlussfolgerung, dann den Prozess
- Quantifizierungsangaben müssen umsetzbar sein: ❌ „Kosten senken, Effizienz steigern“ → ✅ „Überstundenvergütung im Monatsvergleich um 30% senken, monatliche Kontoabstimmung“
- Keine Zahl nennen, ohne den Mund zu öffnen: Jedes Adjektiv muss durch eine Zahl untermauert sein
- Überprüfbar: Zu jeder Zahl muss die Antwort „Wo kann ich das nachschlagen?“ möglich sein
- Kontrollierbare Probleme proaktiv übernehmen: Zuerst sagen „Das ist mein Verantwortungsbereich, bis wann ich es korrigiert habe“
- Nicht erfinden, wenn die Antwort nicht bekannt ist: Standard-Ansatz: „Diese Zahl muss ich mit der Finanzabteilung abstimmen. Ich gebe heute bis Feierabend eine schriftliche Rückmeldung.“
Stufe 5: Aufruf des PPT-Tools
5.1 Ausführen des Generierungsskripts
Das Skript hängt von der Bibliothek python-pptx ab. Führen Sie das Generierungsskript dieser Fähigkeit aus:
pip install python-pptx
python <skill-dir>/scripts/build_deck.py
Das Skript liest das DATA-Wörterbuch und erstellt eine bearbeitbare Präsentation im Format 16:9 (13,333 × 7,5 Zoll).
build_pptx(data, output_path) erzeugt auf einmal 4 Dateien (gleicher Name, verschiedene Endungen):
| Datei | Inhalt |
|---|---|
<name>.pptx | Präsentationsdatei selbst |
<name>.speech.json | Seitenweise Besprechungsnotiz (maschinenlesbare Version von Liefergegenstand ③) |
<name>.speech.md | Seitenweise Besprechungsnotiz (kann direkt in den Chat-Text eingefügt werden) |
<name>.deck.json | Metadaten Seite ↔ Kapitel (für die Ausrichtungsprüfung durch das Prüfwerkzeug) |
Zum Hinzufügen einer neuen Seite: Kopieren Sie das Seitenfunktionsmuster aus dem Skript:
add_slide() → header(s, idx, schlussfolgernder Titel, Phasen-Label) → Diagramm → so_what(s, Schlussfolgerungssatz)
Vergessen Sie nicht, beim Hinzufügen eines neuen Kapitels dessen Schlüsselwort in SECTION_KEYWORDS zu registrieren, sonst kann das Prüfwerkzeug den Inhalt nicht seitenweise abgleichen.
5.2 Strukturprüfung (MUSS durchgeführt werden)
Rufen Sie das pptx_check-Werkzeug aus dem Capability Center auf, um die Strukturprüfung durchzuführen und checks.json zu erzeugen:
router.execute("pptx_check", {
"file_path": "<output>.pptx",
"expected_count": <Seitenanzahl>,
"must_contain": "Ursachenanalyse abweichender Posten, Laufende Einzugsquote, Personalproduktivität, Maßnahmen",
"out": "<output>.checks.json",
})
Es prüft die folgenden Punkte und gibt eine Bewertung pass / warn / fail aus:
| Prüfung | Erklärung |
|---|---|
package / ooxml / open | Datei-Validität, OOXML-Paketstruktur, kann geöffnet werden |
aspect | Ist es 16:9? |
count | Entspricht die Seitenanzahl den Erwartungen? |
contains | Sind die Schlüsselinhalte vorhanden? |
section_content | Seitenweise Abgleich der „für dieses Kapitel erforderlichen Schlüsselinhalte“ |
so_what | Befindet sich am unteren Rand jeder Seite ein Schlussfolgerungssatz? (Ausnahme: Deckblatt, Roadmap, Anhang) |
overflow | Fließt der Text über die Form hinaus? (Schätzung basierend auf Schriftmetriken) |
color_semantics | Werden nur die definierten semantischen Farben verwendet? |
chart_data | Stimmen die Anzahl der Kategorien/Reihen der Diagramme mit der Quelle überein? |
no_empty_slide | Gibt es leere Seiten? |
Bewertungsmaßstab: Ein fail → es muss korrigiert werden, bevor ausgeliefert werden darf; warn → manuelle Überprüfung erforderlich (normalerweise Schätzungenauigkeiten).
overflowist eine Schätzung, kein echtes Layout. Einwarnmit wenigen Einträgen ist normal; bei vielen Einträgen oder offensichtlich abgeschnittenem Text die optische Prüfung in 5.3 zur Bestätigung verwenden.Falls der Tool-Name nicht verfügbar ist, direkt die Modulfunktion aufrufen:
tool.common.pptx_check_tool.check_pptx(...).
5.3 Visuelle Prüfung (optional, abhängig von der Umgebung)
libreoffice --headless --convert-to png <file.pptx> --outdir preview
⚠ LibreOffice ist möglicherweise nicht in der Umgebung installiert. Falls nicht verfügbar, zurückfallen auf:
- Jede Seite mit
python-pptxlesen (Formen und Text) und Schlüsselseiten manuell überprüfen; oder - Mit PIL eine ungefähre Miniaturansicht basierend auf der Seitengröße erstellen (zeigt nur die Layoutverteilung, nicht die tatsächliche Darstellung).
Seitenweise Prüfung: Ist Text abgeschnitten? Stimmen die Zahlen in den Diagrammen mit der Datenquelle überein? Ist die Farbbedeutung einheitlich?
5.4 Auslieferung
Gleichzeitige Auslieferung von drei Dingen:
- PPTX-Datei — Bearbeitbare 16:9-Präsentation
- checks.json — Strukturprüfungsbericht (vom
pptx_checkerzeugt, Bewertung solltepasssein) - Besprechungsnotiz — Direkt im Chat-Text geschrieben, Format siehe
references/03- Besprechungsnotiz.md, mit Zeitverteilungstabelle + Notfallplan für Rückfragen der Führung (≥6 Gruppen)
Fallstricke und Anti-Patterns
- ❌ Mit einer bestimmten Beschwerde/einem bestimmten Streit beginnen – ohne den betrieblichen Rahmen kann das Publikum die Prioritäten nicht erkennen
- ❌ Nur Zahlen auflisten – nur „wie viel“, ohne „warum“ und „was folgt daraus“
- ❌ Nur den Abweichungsbetrag nennen, ohne den Verantwortlichen – in der Sitzung können keine Aufgaben entstehen
- ❌ „Objektive Faktoren“ als Erklärung verwenden – muss auf ein konkretes Ereignis heruntergebrochen werden
- ❌ Maßnahmen aus dem Vormonat nicht rückmelden – der Bericht schließt keinen Kreislauf
- ❌ Nur eine einzige Zahl für die Einzugsquote angeben – muss in laufend / kumuliert / alte Außenstände / Altersstruktur aufgeschlüsselt werden
Verzeichnisstruktur
ppt_skill/
├── SKILL.md # Diese Datei: Anweisungen für die fünfstufige Pipeline
├── references/
│ ├── 01-Berichtslogik.md # Sechsteiliger Rahmen, Seitenkontrolle, Ausdrucksdisziplin
│ ├── 02-Kennzahlensystem und Ursachenanalyse.md # Tabelle der Messgrößen, Drei-Ebenen-Ursachenanalyse, Diagrammauswahl
│ └── 03- Besprechungsnotiz.md # Vorlage für seitenweise Besprechungsnotiz, Zeitverteilung, Notfallplan für Rückfragen
├── assets/
│ └── Beispiel-Immobilienprojekt Monatliche Betriebsanalyse.pptx
├── scripts/
│ └── build_deck.py # Generierungsskript (DATA ändern reicht für Wiederverwendung)
└── checks.json # Beispiel eines historischen Prüfberichts (wird zur Laufzeit von pptx_check neu erstellt)
Abhängige Fähigkeiten und Werkzeuge
| Fähigkeits-/Werkzeugname | Ort | Zweck | Erforderlich |
|---|---|---|---|
pptx_check | tool/common/pptx_check_tool.py | Stufe 5.2 Strukturprüfung, erzeugt checks.json | Erforderlich |
| LibreOffice | Externes Programm | Stufe 5.3 Visuelle Prüfung (in PNG konvertieren) | Optional, wird bei Nichtverfügbarkeit degradiert |
pptx_check ist ein universelles Werkzeug, das von dieser Fähigkeit unabhängig ist und über das Capability Center bereitgestellt wird:
from core.capability import CapabilityRouter
from tool.common.pptx_check_tool import PptxCheckTool
router = CapabilityRouter()
router.add_tool(PptxCheckTool()) # Fähigkeit und Werkzeug werden auf derselben Ebene registriert
Die Fähigkeit ist kein Tool, daher wird zur Registrierung
add_skillverwendet (build_capability_routerverarbeitet dies automatisch), währendpptx_checkein Tool ist und mitadd_toolregistriert wird.