using SOG.Base.Attributes;
using SOG.Base.Helper;
using SOG.Base.SOGMessage;
using SOG.ERP.Entity.Workflow;
using System;
namespace SOG.ERP.Modules.Aufgabensystem
{
/// <summary>
/// </summary>
public class AufgabenWorkflowBspLinear : AufgabenWorkflow
{
// =================================================
// Eingabefelder
// =================================================
/// <summary>
/// </summary>
[InputPrompt("Benutzer 1", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_1 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 2", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_2 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 3", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_3 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 4", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_4 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 5", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_5 { get; set; }
/// <summary>
/// </summary>
[InputPrompt("Benutzer 6", 6, VAwl = "sachbea.awl")]
// ReSharper disable once InconsistentNaming
public string m_user_6 { get; set; }
// =================================================
// Aktueller Benutzer
// =================================================
/// <summary>
/// </summary>
[SOGSerialize(true)]
// ReSharper disable once InconsistentNaming
public int m_current_user { get; set; }
readonly TypeHelperArray<string> _user;
// =================================================
// Initialisierung
// =================================================
/// <summary>
/// </summary>
/// <param name="wfId"></param>
/// <param name="wfClass"></param>
public AufgabenWorkflowBspLinear(string wfId, string wfClass)
: base(wfId, wfClass)
{
Status = "dlg1";
FreieFelder.Add("m_zusatz_1");
FreieFelder.Add("m_status");
FreieFelder.Add("m_prio");
_user = new TypeHelperArray<string>(this, "m_user", 6);
}
// =================================================
// Workflow fortsetzen
// =================================================
/// <summary>
/// </summary>
/// <param name="sender"></param>
/// <param name="feargs"></param>
public override void SOGEventHandler_WorkflowFortsetzen(object sender, SOGFireEventArgs feargs)
{
switch (Status)
{
case "dlg1":
feargs.Redirect = new SOGRedirect("AufgabenWorkflowBspLinear_dlg1", WFId);
break;
case "forward":
NextUser(feargs);
break;
default:
throw new ArgumentException();
}
}
// =================================================
// Maskeneingabe verarbeiten
// =================================================
/// <summary>
/// </summary>
/// <param name="sender"></param>
/// <param name="feargs"></param>
public override void SOGEventHandler_MaskePositivBeenden(object sender, SOGFireEventArgs feargs)
{
if (Status == "dlg1")
{
if (m_user_1.Length > 0)
{
Status = "forward";
WriteLog(Aph.Format("Status={0}", Status));
for (int i = 0; i < _user.Length; i++ )
if (_user[i]?.Length > 0)
WriteLog(Aph.Format(" Benutzer {0}:{1}", i+1, _user[i]));
m_current_user = -1;
NextUser(feargs);
feargs.Changed = true;
}
else
{
EndWorkflow();
feargs.Changed = true;
}
}
}
// =================================================
// Aufgabe an nächsten Benutzer weiterleiten
// =================================================
/// <summary>
/// </summary>
/// <param name="feargs"></param>
public void NextUser(SOGFireEventArgs feargs)
{
m_current_user++;
Save();
string nextsach = _user[m_current_user];
WriteLog(Aph.Format("Nächster Benutzer={0}", nextsach));
if (!string.IsNullOrEmpty(nextsach))
{
RefAufgabe.SetZustaendig(nextsach);
if (m_current_user + 1 >= _user.Length
|| _user[m_current_user + 1] == null
|| _user[m_current_user + 1]?.Length == 0)
{
EndWorkflow();
}
}
else
{
EndWorkflow();
}
feargs.Changed = true;
}
/* Beispiel für einen "abbrechbaren" Workflow:
/// <summary>
/// </summary>
/// <param name="Sender"></param>
/// <param name="State"></param>
public override void SOGEventState_WorkflowAbbrechen(object Sender, SOGMaskState State)
{
State.Enabled = true;
}
/// <summary>
/// </summary>
protected override void AbortWorkflow()
{
// Info in RefAufgabe schreiben:
RefAufgabe.InsertText(Aph.Format("Workflow wurde bei Benutzer {0} von {1} abgebrochen!",
RefAufgabe.m_sach4, Aph.Sess.sach));
base.AbortWorkflow();
}*/
}
}
Die Workflow-Klasse ist von der Basisklasse "AufgabenWorkflow" abgeleitet, und erbt damit die Möglichkeit im Aufgabendialog einer Aufgabe zugewiesen zu werden, und anschließend die Eingabemaske der Aufgabe beeinflussen zu können. "AufgabenWorkflow" selbst ist von "VacosWorkflow" abgeleitet, der wiederum von "SOGWorkflow" abgeleitet ist. In diesen Basisklassen wird die "Persistenz" der Workflowinstanz implementiert. Also: Das Speichern und Laden des Workflows in und aus der Datenbank.
Im Bereich "Eingabefelder" werden Datenfelder definiert, die in der Eingabemaske des Workflows zur Verfügung stehen, und somit direkt vom Benutzer eingegeben werden können.
Über "InputPrompt" werden die Dialogeigenschaften der Datenfelder festgelegt.
Im Bereich "Aktueller Benutzer" wird das Datenfeld "m_current_user " erzeugt. In diesem Datenfeld wird gespeichert, welcher der eingegebenen Benutzer zuletzt vom Workflow die Aufgabe zugewiesen bekommen hat.
"Workflow fortsetzen" wertet den aktuellen "Status" des Workflow aus, und schickt den Benutzer entweder auf die aktuelle Eingabemaske, oder weisst die verbundene Aufgabe jeweils dem nächsten Benutzer der Benutzerkette zu.
Dazu wird dann die Funktion "NextUser" im Bereich "Aufgabe an nächsten Benutzer weiterleiten" aufgerufen. Sollten keine weiteren Benutzer mehr in der Kette vorhanden sein, wird der Workflow über "EndWorkflow" abgebaut, und die verbundene Aufgabe wieder freigegeben.
Der verwendete Dialogschritt "AufgabenWorkflowBspLinear_dlg1" hat keine eigene Implementierung, sondern nur einen Eintrag im c084/c083
Typ = "VacosObjectDefinition"
Id = "AufgabenWorkflowBspLinear_dlg1"
Text = "Aufgabenworkflow Beispiel linear"
Classname = "SOG.ERP.Entity.Dialog.Workflow.DlgVacosWorkflow"
Assembly = "SOG.ERP.Entity.Dialog.dll"
sichtbar = Invisible
Außerdem ist ein weiterer Eintrag für die Definition des Workflow selbst in "c084" notwendig:
Typ = "Workflow"
Id = "BeispielAufgabeLinear"
Text = "Beispielworkflow für lineare Aufgabenweiterleitung"
Classname = "SOG.ERP.Modules.Aufgabensystem.AufgabenWorkflowBspLinear"
Dataobject = "Aufgaben"
Assembly = "SOG.ERP.Modules.Aufgabensystem.dll"
sichtbar = Visible
Hier wird also der Workflow-Klasse "BeispielAufgabeLinear" eine CSharp-Klasse "SOG.ERP.Modules.Aufgabensystem.AufgabenWorkflowBspLinear" zugeordnet.
Durch Anpassung dieses Eintrags kann auch eine Workflow-Klasse aus einem SOG ActiveSkin Script angesteuert werden.
Durch das Setzen des Parameters "Dataobject" auf den Wert "Aufgaben" wird erreicht, dass dieser Workflow in der Auswahlliste der für Aufgaben geeigneten Workflows mit angezeigt wird.
Daneben kann über Sichtbarkeit, Rechte und Lizenzen gesteuert werden, ob der Eintrag in dieser Liste sichtbar ist.