POST /api/v0/PrintQueue/enqueue – masowe asynchroniczne drukowanie

Opis mechanizmu

Endpoint służy do asynchronicznego zlecania generowania (renderowania) gotowych dokumentów do kolejki zadań w tle (zarządzanej przez system Hangfire) na podstawie szablonów sPrint (.sp) oraz dynamicznie przekazywanych danych. Działa w sposób nieblokujący – zamiast czekać na zakończenie procesu tworzenia pliku, natychmiast rejestruje zadanie i zwraca jego unikalne identyfikatory, co pozwala na obsługę ciężkich i masowych wydruków bez ryzyka zerwania timeoutu połączenia.

Struktura żądania wejściowego (Request Body) jest w 100% kompatybilna z kontrolerem synchronicznym. Silnik pozwala na pełne nadpisanie parametrów szablonu, zmianę zapytań SQL oraz dynamiczne przepięcie źródeł danych w locie (zarówno dla raportu głównego, jak i wybranych podszablonów). Wygenerowany asynchronicznie plik (w formacie PDF, XLS, XLSX lub DOCX) zostanie odłożony w lokalizacji plikowej/chmurowej bądź – w przypadku konfiguracji typu Bytes – zapamiętany w bazie danych do momentu jego jawnego pobrania dedykowanym endpointem wynikowym.

  • Wersja: v0
  • Metoda HTTP: POST
  • Format danych żądania: application/json

Struktura żądania (Request Body)

Model wejściowy payloadu JSON składa się z następujących sekcji głównych pierwszego poziomu:

{
  "operationId": "string",
  "printFormat": "string",
  "data": {},
  "report": {},
  "output": {},
  "dataSources": [],
  "parameters": []
}
Wskazówka
? Dokumentacja modeli: Szczegółowy opis polimorfizmu dla sekcji data (w tym różnice między trybami WebApi, a Sql), obiektu report i output (obsługa formatów Path, Bytes oraz S3) , tablicy dataSources (Db, Json, Odbc) oraz tablicy parameters (definiowanie parametrów szablonu) znajdziesz w osobnych poświęconym im artykułach
  • operationId (string): Opcjonalny, unikalny identyfikator danej operacji wydruku (np. GUID). W architekturze kolejki jest wysoce zalecany – staje się kluczem biznesowym, za pomocą którego pobiera się gotowy plik z endpointu wynikowego.
  • printFormat (string): Definiuje docelowy format wyjściowy pliku. Przyjmuje wartości z zamkniętego słownika Enum: "Pdf", "Xls", "Xlsx", "Docx"
  • data (object): Kontener opcjonalny. Zawiera poświadczenia licencyjne serwera Comarch dla tego konkretnego wywołania.
  • report (object): Kontener wymagany. Definiuje plik wejściowy szablonu sPrint (.sp) oraz metodę jego dostarczenia do kolejki.
  • output (object): Kontener wymagany. Określa fizyczny sposób dystrybucji oraz format zapisu gotowego dokumentu po przetworzeniu zadania w tle. Zachowanie systemu zależy od wybranego trybu wyjściowego:
      • Scenariusz 1 (dataFormat: „Bytes”): Procesor tła generuje plik i bezpiecznie buforuje jego bajty w StoragePath. Po tym, jak zadanie osiągnie status „Succeeded” co jest możliwe do sprawdzenia za pomocą endpointu GET /api/v0/PrintQueue/{jobId}/status plik należy jawnie pobrać osobnym żądaniem GET /api/v0/PrintQueue/{operationId}/result
      • Scenariusz 2 (dataFormat: „Path” lub „S3”): Proces tła automatycznie zapisuje gotowy plik bezpośrednio na wskazanym dysku serwera lub wysyła go do chmury Amazon S3. Gdy zadanie osiągnie status „Succeeded”, plik jest od razu gotowy do użycia w docelowym miejscu.
  • dataSources (array): Tablica opcjonalna. Pozwala na dynamiczne nadpisywanie ciągów połączeń bazodanowych i zapytań na czas asynchronicznego generowania dokumentu.
  • parameters (array): Tablica opcjonalna. Służy do wstrzykiwania wartości pod zmiennes zadeklarowane bezpośrednio w strukturze raportu.

Kody odpowiedzi (Responses)

? HTTP 202 Accepted

Zadanie wydruku zostało pomyślnie zwalidowane strukturalnie i umieszczone w kolejce przetwarzania Hangfire. W ciele odpowiedzi serwer zwraca unikalny identyfikator zadania (jobId) służący do monitorowania stanu oraz identyfikator powiązany z plikiem wynikowym (operationId).

Format odpowiedzi:

{
  "jobId": "hangfire-job-id-12345",
  "operationId": "my-operation-guid-123"
}

? HTTP 401 Unauthorized

Brak uprawnień. Dynamiczna walidacja licencji przekazanej w obiekcie „data” zakończyła się niepowodzeniem lub globalny token licencyjny serwera sPrint utracił ważność.

Format odpowiedzi: application/json (string)

? HTTP 422 Unprocessable Content

Błąd przetwarzania logiki biznesowej. Występuje, gdy model JSON jest niepoprawny strukturalnie, moduł kolejki asynchronicznej (Feature Flag) jest wyłączony w konfiguracji systemowej sPrint, lub zapytania zdefiniowane w dataSources zawierają błędy składniowe.

Format odpowiedzi: application/json (string)


Realne Kompleksowe Przykłady (JSON Payload)

 

Przykład 1: Zlecenie do kolejki z buforowaniem bajtów (Odbiór asynchroniczny przez /result)

Najbardziej powszechny scenariusz dla kolejki: serwer przyjmuje zadanie, renderuje plik w tle i bezpiecznie buforuje jego bajty w bazie danych. Po zakończeniu zadania (status Succeeded), dokument pobiera się dedykowanym endpointem GET.

{
  "operationId": "asynch-print-001",
  "printFormat": "Pdf",
  "report": {
    "dataFormat": "Path",
    "path": "C:\\sPrint\\Templates\\FakturaSprzedazy.sp"
  },
  "output": {
    "dataFormat": "Bytes"
  },
  "parameters": [
    {
      "name": "GidNumer",
      "value": "14255"
    }
  ]
}

Przykład 2: Kolejkowanie operacji opartej o dane binarne (report: Bytes -> output: Bytes)

Scenariusz asynchroniczny dla architektur chmurowych. Zarówno szablon wejściowy przekazywany jest jako ciąg Base64, jak i proces tła odłoży wygenerowany plik Excel (Xlsx) bezpośrednio w pamięci bazy kolejki do późniejszego odebrania.

{
  "operationId": "asynch-print-002",
  "printFormat": "Xlsx",
  "report": {
    "dataFormat": "Bytes",
    "source": "SGVsbG8gd29ybGQhSW50ZWdyYWNqYSBTY3JpbnQgQVBJIHYw"
  },
  "output": {
    "dataFormat": "Bytes"
  }
}

Przykład 3: Ciężki raport w tle z nadpisaniem bazy danych i zapisem na dysk sieciowy (report: Path -> output: Path)

Zadanie zostaje wrzucone do kolejki Hangfire, dzięki czemu serwer od razu zwalnia wątek HTTP. W tle procesor pobiera szablon, przepina się na produkcyjny serwer SQL i trwale zapisuje gotowy plik PDF w strukturze katalogów sieciowych firmy.

{
  "operationId": "asynch-print-003",
  "printFormat": "Pdf",
  "report": {
    "dataFormat": "Path",
    "path": "C:\\sPrint\\Templates\\RaportZyskow.sp"
  },
  "output": {
    "dataFormat": "Path",
    "path": "D:\\Archiwum\\2026\\Raport_Finansowy.pdf"
  },
  "dataSources": [
    {
      "type": "Db",
      "reportIds": [],
      "server": "sql-prod-cluster",
      "connectionType": "MsSql",
      "databaseName": "CDN_Produkcja",
      "query": "SELECT * FROM cdn.KontaKsiegowe WHERE Rok = 2026",
      "credentials": {
        "login": "sprint_reader",
        "password": "UserPassword2026!"
      }
    }
  ]
}

Czy ten artykuł był pomocny?