letzte Woche habe ich das Thema angesprochen. @metasnw meinte, es wäre für andere im Forum auch von Interesse. Es geht um Geschäftsprozesse (BP) allgemein und die Workflow engine im package org.compiere.wf
im Besonderen.
Wer sich zum Thema Workflow (wf) einlesen will, den verweise ich auf den Wikipedia-Artikel, und zum Vertiefen das activiti-Handbuch. Eine Übesicht der BPM-Notation ist hier.
Stichworte ohne Vertiefung:
- Activities/Aktionen werden im BP grafisch als Rechtecke dargestellt, sie werden auch Knoten oder wf-Schritte genannt
- Tasks sind elementare Aktionen, die durch Personen “User Task” ausgeführt werden (Rechner einschalten), oder automatisch ablaufen (“Auftrag fertigstellen” in metasfresh)
- der typische Dokumenten-wf in mf/ADempiere beinhaltet die Belegaktionen
Prepare
undComplete
Hier ist eine mögliche Erweiterung des typischen Dokumenten-Workflows beschrieben. Zwischen Prepare und Complete wurde ein Prozeßschritt p
definiert, der unter bestimmten Bedingungen ausgeführt wird:
p
ist als AD_Prozess definiert und muss als Klasse implementiert werden. Das bedeutet, dass die wf-Anpassung eine Erweiterung von metasfresh nach sich zieht, da compiliert werden muss. Geht es auch anders?
- Knoten in Workflow, typischerweise kennt man “vorbereiten” und “fertigstellen”, können auch ganz normale AD_Prozesse sein, wie oben gezeigt
- AD_Prozesse (die mit dem Rädchen) können in java oder in einer script Sprache, etwa groovy, implementiert werden, siehe hier
- die übliche Aussagelogik sagt: dann können goovy scripte auch als Knoten im Workflows definiert werden
- der grosse Vorteil einer script-Implementierung ist, dass für die wf-Änderung die metasfresh Applikation nicht neu kompiliert werden müßte. Die scripte werden in die DB kopiert und zur Laufzeit übersetzt und ausgeführt. Wow!
Die Logik gilt für mf leider nicht, denn der Start eines AD_Prozesses (mit Rädchen ) ist anders implementiert als der Start eines AD_Prozesses als
AppsProcess
. Das ist schade, denn die Vorteile sind nicht zu übersehen.
Daher mein Vorschlag, die Stelle in MWFActivity
und die Abhängigen anzupassen:
public class MWFActivity extends X_AD_WF_Activity implements Runnable {
...
private boolean performWork (Trx trx) throws Exception {
...
/****** Process ******/
else if (MWFNode.ACTION_AppsProcess.equals(action)) {
... // hier Änderungen notwendig
}
}