Przestrzeń nazw ActionRunner
Podsumowanie:W akcji C# można używać klas z przestrzeni nazw CSharpScript.ActionRunner, które umożliwiają wykonywanie niektórych typów akcji.
W tym temacie
Wprowadzenie
Do wykonania akcji służy funkcja RunActionAsync, która działa asynchronicznie. Aby akcje wykonywały się synchronicznie, wywołanie tej funkcji należy poprzedzić słowem kluczowym await. Funkcja przyjmuje dwa parametry: identyfikator wykonywanej akcji oraz model w formacie JSON. Identyfikator akcji można podać, używając składni smart numbers ({&BaseApp.Actions.BaseModule.KodAkcji}).
Modele danych dla akcji przedstawiono poniżej, jeśli nie trzeba przekazywać parametrów, można wstawić wartość NULL lub pusty ciąg znaków.
Funkcja RunActionAsync zwraca obiekt typu ActionExecutionResult, który jest zbudowany następująco:
public class ActionExecutionResult
{
public string Result { get; set; }
public bool IsValid { get; set; }
public ValidationResult ValidationResult { get; set; }
public List<ResponseMessage> ResponseMessages { get; set; }
}
gdzie:
-
Result: zmienna z obiektem JSON odpowiedzi z wykonywanej akcji, w większości wypadków będzie to typ bool:
{ "ExecutedSuccessfully": true, "ReturnValue": "", }
- IsValid: flaga poprawności wykonania akcji.
- ValidationResult: lista błędów, które wystąpiły w czasie wykonania akcji. Jest to klasa pochodząca z biblioteki FluentValidation, a dokładnie z przestrzeni nazw FluentValidation.Results.ValidationResult. ResponseMessages; jest to klasa która może przekazywać komunikaty z serwera SQL Server. Struktura:
public class ResponseMessage
{
public string Message { get; set; }
public ResponseMessageType Type { get; set; }
public IList<object> Arguments { get; set; }
public bool ShowImmediately { get; set; }
}
Błędy, które wystąpią w akcjach, zostaną zalogowane i zwrócone w akcji Algorytm C#, gdzie można będzie je obsłużyć (w bloku try catch
). Błędy są zwracane jako Exception typu ActionExecutionException. Wyjątek zawiera właściwość ExecutionResult typu ActionExecutionResult, w której jest przechowywany wynik wykonanej akcji:
public ActionExecutionResult ExecutionResult { get; set; }
Akcja zapytania SQL
await CSharpScript.ActionRunner.SqlAction.Instance.RunActionAsync(id, model);
Struktura modelu:
{
"RecordId": "string",
"Model": "model JSON dla wykonywanej akcji",
"UserId": "00000000-0000-0000-0000-000000000000",
"GridId": null,
"FormDefinitionId": null,
"BusinessDocumentId": null
}
Akcja wysyłki e-mail
await CSharpScript.ActionRunner.EmailAction.Instance.RunActionAsync(id, model);
Struktura modelu:
{
"RecordId": "string",
"Model": "model JSON dla wykonywanej akcji",
"UserId": "00000000-0000-0000-0000-000000000000",
"GridId": null,
"FormDefinitionId": null,
"BusinessDocumentId": null,
"ExtraEmailsToSend": [
"string",
"string"
]
}
Akcja zapytania do webserwisu
await CSharpScript.ActionRunner.WebServiceAction.Instance.RunActionAsync(id, model);
Struktura modelu:
{
"RecordId": "string",
"Model": "model JSON dla wykonywanej akcji",
"UserId": "00000000-0000-0000-0000-000000000000",
"GridId": null,
"FormDefinitionId": null,
"BusinessDocumentId": null
}
Akcja C#
await CSharpScript.ActionRunner.CSharpScriptAction.Instance.RunActionAsync(id, model);
Struktura modelu:
{
"RecordId": "string",
"Model": "model JSON dla wykonywanej akcji",
"UserId": "00000000-0000-0000-0000-000000000000",
"GridId": null,
"FormDefinitionId": null,
"BusinessDocumentId": null
}
Akcja raportów
Akcja wywołana w ten sposób musi mieć włączony przełącznik Zapisz wygenerowany plik do załączników
, pobranie wygenerowanego raportu przez przeglądarkę nie jest możliwe.
Wywołanie:
var result = await CSharpScript.ActionRunner.ReportsAction.Instance.RunActionAsync({&BaseApp.Actions.BaseModule.AkcjaRaport}, model);
Parametr model jest przekazywany jako ciąg znaków. Aby wygenerowany raport został dodany do załącznika, w modelu należy wskazać RecordId (instancję dokumentu) oraz BusinessDocumentId (definicję dokumentu). Dla poprawnego działania uprawnień konieczne jest przekazanie parametru UserId. Parametry używane w zapytaniu raportu należy przekazać w polu Model parametru model. To pole nie może mieć wartości NULL, jeśli parametry nie są przekazywane, musi ono być pustym obiektem JSON ({}):
using System;
using System.Linq;
using System.Text;
using Shared.Exceptions;
using Newtonsoft.Json;
using System.Collections.Generic;
var recordId = 122;
var model = new Dictionary<string,object>()
{
{ "Model", @"{""Test"" : 1}" },
{ "RecordId", recordId},
{ "BusinessDocumentId", BusinessDocumentId},
{ "UserId", UserId }
};
var serializedModel = JsonConvert.SerializeObject(model);
var result = await CSharpScript.ActionRunner.ReportsAction.Instance.RunActionAsync({&BaseApp.Actions.BaseModule.AkcjaRaport}, serializedModel);
if(!result.IsValid)
{
throw new TranslatedException("Błąd akcji raportu:", result.ValidationResult);
}
return result.IsValid;
W parametrze model można przekazać do akcji raportów wartość kontekstu (pole Model) samej akcji Algorytm C#:
var model = new Dictionary<string,object>()
{
{ "Model", Model,
{ "RecordId", recordId},
{ "BusinessDocumentId", BusinessDocumentId},
{ "UserId", UserId }
};
Przy tworzeniu modelu można również pominąć krok serializacji słownika i ręcznie stworzyć odpowiedni ciąg znaków:
var model = @$""", ""RecordId"": ""{recordId}"", ""BusinessDocumentId"": {BusinessDocumentId}}}";
Akcja zapisu rekordu
Wywołanie:
var result = await CSharpScript.ActionRunner.SaveRecordAction.Instance.RunActionAsync(request);
Definicja typu parametru request:
public class SaveDocumentRequest
{
public int? BusinessDocumentId { get; set; }
public Dictionary<string, object> Model { get; set; }
public string RecordId { get; set; }
}
- BusinessDocumentId (int): id definicji dokumentu
- RecordId (string): id dokumentu (aktualizacja); w przypadku nowego rekordu należy przekazać wartość 0
- Model (Dictionary<string, object>): słownik par klucz: wartość, wartości pól dokumentu biznesowego
Przykład zapisu nowego dokumentu z przekazaniem wartości Email. Id dokumentu jest przypisane do zmiennej newId:
using System;
using System.Linq;
using System.Text;
using Shared.Exceptions;
using Newtonsoft.Json;
using System.Collections.Generic;
using CSharpScript.ActionRunner;
var request = new SaveDocumentRequest()
{
RecordId = "0",
BusinessDocumentId = BusinessDocumentId,
Model = new Dictionary<string, object>()
{
{"Email", "nowe c# nowy record"},
}
};
var result = await CSharpScript.ActionRunner.SaveRecordAction.Instance.RunActionAsync(request);
if(!result.IsValid)
{
throw new TranslatedException("Tworzenie rekordu nie powiodło się", result.ValidationResult);
}
var newId = result.Result;
Akcja zmiany statusu
Wywołanie:
var result = await CSharpScript.ActionRunner.ChangeStatusAction.Instance.RunActionAsync(request);
Definicja typu parametru request:
public class ChangeStatusRequest
{
public int? BusinessDocumentId { get; set; }
public string TransitionInternalId { get; set; }
public IDictionary<string, object> Model { get; set; }
public string RecordId { get; set; }
}
- TransitionInternalId (GUID): wartość pola InternalId przejścia, które ma zostać wykonane (core.BusinessTransitions.InternalId)
- BusinessDocumentId (int): id definicji dokumentu
- RecordId (string): id dokumentu (aktualizacja); w przypadku nowego rekordu należy przekazać wartość 0
- Model (Dictionary<string, object>): słownik par klucz: wartość, umożliwia przekazanie kontekstu danych dla akcji przed i po wykonywanych podczas zmiany statusu
Przykład zmiany statusu dla bieżącego rekordu (otworzonego w formularzu, na którym znajduje się przycisk wywołujący akcję):
using System;
using System.Linq;
using System.Text;
using Shared.Exceptions;
using Newtonsoft.Json;
using System.Collections.Generic;
using CSharpScript.ActionRunner;
var request = new ChangeStatusRequest()
{
RecordId = RecordId,
BusinessDocumentId = BusinessDocumentId,
TransitionInternalId = "c70a1fd2-32b2-7d0b-c470-d42eba506425",
Model = JsonConvert.DeserializeObject<Dictionary<string, object>>(Model)
};
var result = await CSharpScript.ActionRunner.ChangeStatusAction.Instance.RunActionAsync(request);
if(!result.IsValid)
{
throw new TranslatedException("Zmiana statusu nie powiodła się", result.ValidationResult);
}
Powiązane tematy: