Konfiguracja komunikacji między Flowee a Portalem Klienta
Ten fragment procesu odpowiada za:


Krok 1: Script Task „Setup danych dla komunikacji”
Task tworzy strukturę danych procesowych dla komunikacji między Flowee a Portalem.
➤ Dodanie elementu do diagramu
Z lewego menu wybierz Create task → Script task
Nazwa: Setup danych dla komunikacji
Podłącz do diagramu przepływem z poprzedniego elementu.
➤ Konfiguracja
➤ Script
import groovy.json.JsonOutput
def jsonOuput = new JsonOutput()
def communicationInitData = [
'flowee': [
'messages': []
],
'system': [
'messages': []
],
'portal': [
'messages': []
]
]
def valuesMap = [
'communication': jsonOuput.toJson(communicationInitData)
]
dataDelegate.setValuesByPath(processInstanceId, valuesMap)
Efekt działania
Proces posiada zmienną communication, w której przygotowane są trzy kanały wiadomości: flowee, system i portal.
Znaczenie kanałów:
System: wiadomości systemowe wysłane z Flowee do klienta na portal
Portal: wiadomości wysyłane z portalu do Flowee do zadania komunikacja
Flowee: wiadomości wysyłane przez Doradcę do klienta na portal
Krok 2: Script Task „wiadomość systemowa”
Task dodaje wiadomość systemową do kanału communication.system.messages.
➤ Dodanie elementu do diagramu
Z lewego menu wybierz Create task → Script task
Nazwa: wiadomość systemowa
Podłącz do diagramu przepływem z poprzedniego taska.
➤ Konfiguracja
➤ Input parameter
Dodaj w Extensions → Input/Output:
➤ Script
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
def slurper = new JsonSlurper()
def jsonOuput = new JsonOutput()
def processInstanceId = execution.getProcessInstanceId()
def communication = dataDelegate.getValueByPath(processInstanceId, 'communication.system.messages')
if (communication == '-') {
return;
}
def messages = slurper.parseText(communication)
messages << [
content: content,
system: "system",
sender: "",
creationTime: ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT)
]
def valuesMap = [
'communication.system.messages': jsonOuput.toJson(messages)
]
dataDelegate.setValuesByPath(processInstanceId, valuesMap)
Efekt działania
w procesie powstaje zmienna communication z przygotowaną strukturą kanałów,
systemowa wiadomość trafia do communication.system.messages z odpowiednim timestampem,
dalsze taski procesu (np. wysyłka wiadomości do Portalu) mogą korzystać z tej zmiennej.
Wysyłka wiadomości z Flowee do Portalu Klienta
Ten fragment procesu odpowiada za:
odebranie nowej wiadomości w procesie,
zapisanie jej w strukturze komunikacji (communication.flowee.messages),
przygotowanie do wysyłki do Portalu Klienta lub dalszej obsługi w procesie.

Krok 1: Start Event dla nowej wiadomości
Start Event odpowiada na przychodzącą wiadomość (Message Event).
➤ Dodanie elementu do diagramu
Z lewego menu wybierz Start Event → Message Start Event
Nazwa: brak (opcjonalnie Nowa wiadomość)
Ustaw właściwości:
Start event uruchamia flow, gdy w systemie pojawi się nowa wiadomość.
Krok 2: Script Task „Zapisanie nowej wiadomości”
Task zapisuje treść nowej wiadomości w zmiennej communication.flowee.messages i czyści tymczasowe dane widokowe.
➤ Dodanie elementu do diagramu
Create task → Script Task
Nazwa: Zapisanie nowej wiadomości
Podłącz przepływem od Start Event.
➤ Konfiguracja taska
➤ Script
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
def slurper = new JsonSlurper()
def jsonOuput = new JsonOutput()
def processInstanceId = execution.getProcessInstanceId()
def communicationTaskFlowee = dataDelegate.getValueByPath(processInstanceId, 'formData.private.communication')
def cleanUpCommunicationMessageView(taskData, jsonOuput) {
taskData.remove('messagesView')
def valuesMap = [
'formData.private.communication': jsonOuput.toJson(taskData),
]
dataDelegate.overrideValuesByPath(processInstanceId, valuesMap)
}
if (communicationTaskFlowee == '-') {
return;
}
def parsedCommunicationTaskFlowee = slurper.parseText(communicationTaskFlowee)
if (!parsedCommunicationTaskFlowee.newMessage) {
cleanUpCommunicationMessageView(parsedCommunicationTaskFlowee, jsonOuput)
return;
}
def communication = dataDelegate.getValueByPath(processInstanceId, 'communication.flowee.messages')
if (communication == '-') {
cleanUpCommunicationMessageView(parsedCommunicationTaskFlowee, jsonOuput)
return;
}
def messages = slurper.parseText(communication)
messages << [
content: parsedCommunicationTaskFlowee.newMessageObject.content,
system: "flowee",
sender: parsedCommunicationTaskFlowee.newMessageObject.sender,
creationTime: ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT)
];
parsedCommunicationTaskFlowee.remove('newMessage')
cleanUpCommunicationMessageView(parsedCommunicationTaskFlowee, jsonOuput)
def valuesMap = [
'communication.flowee.messages': jsonOuput.toJson(messages)
]
dataDelegate.setValuesByPath(processInstanceId, valuesMap)
Efekt działania
każda nowa wiadomość z Flowee trafia do zmiennej procesowej communication.flowee.messages,
tymczasowe pola widokowe (messagesView, newMessage) są czyszczone,
dane są gotowe do dalszej obsługi (wysyłka do Portalu, powiadomienia, logi).
Aby wysłanie wiadomości nastąpiło prawidłowo to w manual tasku np. „Komunikacja” musi być:
dodany formularz zawierający poniższą definicję:
Formularz do komunikacji
prawidłowo skonfigurowana akcja
„Wyślij wiadomość”
{
"actionName": "save",
"model": {
"order": 3,
"type": "button",
"transition": null,
"contexts": ["TASK"],
"columnName": null,
"classes": ["secondary", "right"],
"eventName": "saveTaskAndSendMessageV2"
},
"dictionaryPath": "DEFAULT.ACTIONS.sendMessage",
"metadata": {
"onComplete": "reload",
"onClick": "submit",
"validate": "structure",
"messageName": "submitCommunication",
"displayOnForms": ["ID formularza"],
"formsScopeRestrictor": ["ID formularza"],
"message": "CUSTOM.WARNINGS.messageSentSuccessfully"
}
}
09 lutego 2026