Skip to main content Link Menu Expand (external link) Document Search Copy Copied

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);
}
|← Przestrzeń nazw WebServiceRunner |↑ Do góry |→ Algorytm C# - Przykład 1: zmiana statusu dokumentów i wysyłka e-mail |

Copyright © 2025 OPTEAM SA. Theme Copyright © 2017-2020 Patrick Marsceill. Distributed by an MIT license.