Zastosowanie
W Comarch e-Sklep Sync istnieje możliwość obsługi dodatkowych funkcji za pomocą tzw. Workerów. Dzięki tym programom można odpytywać zewnętrzne usługi sieciowe, bazy danych itp. a następnie zwracać określone dane, które potem będą wyświetlane w Comarch e-Sklep. Workery są to klasy dziedziczące po klasie Comarch.eShop.Isync.Worker:
Klasa:
public abstract class Worker { protected Dictionary_config; public virtual void Initialize(Dictionary d) { _config = d; } public abstract Task Execute(Ipool pool, Msg msgOuter); }
Schemat komunikacji Comarch e-Sklep Sync
- W Comarch e-Sklep zostaje odpytana akcja z Worker i Message (w Comarch e-Sklep Sync powinien być taki Worker).
- Worker wykonuje akcje na podstawie Message.
- Worker zwraca wynik do sklepu w postaci JSONA.
- Zmodyfikowany szablon wyświetla informacje z otrzymanego JSONA.
Jak stworzyć przykładowego Workera?
W Comarch e-Sklep Sync konfigurujemy przykładowy Worker:
public abstract class Worker { protected Dictionary_config; public virtual void Initialize(Dictionary d) { _config = d; } public abstract Task Execute(Ipool pool, Msg msgOuter); }
oraz implementującą metodę Execute:
namespace WorkerTime { using System; using System.Threading.Tasks; using Comarch.eShop.Isync; public class Time : Worker { private bool _utc; public override void Initialize(System.Collections.Generic.Dictionaryd) { _utc = d["utc"] == "1"; } public override Task Execute(/*Ipool pool,*/ Msg msgOuter) { return Task.Factory.StartNew((o) => { var m = o as Msg; m.Response = string.Concat("\"", (_utc ? DateTime.UtcNow : DateTime.Now).ToString("o"), "\""); return m; }, msgOuter); } } }
Przykładowy kod:
namespace WorkerTime { using System; using System.Threading.Tasks; using Comarch.eShop.Isync; public class Time : Worker { private bool _utc; public override void Initialize(System.Collections.Generic.Dictionaryd) { _utc = d["utc"] == "1"; } public override Task Execute(/*Ipool pool,*/ Msg msgOuter) { return Task.Factory.StartNew((o) => { var m = o as Msg; m.Response = string.Concat("\"", (_utc ? DateTime.UtcNow : DateTime.Now).ToString("o"), "\""); return m; }, msgOuter); } } }
Metoda Execute jako drugi parametr przyjmuje obiekt klasy Msg, który posiada property Message oraz Response. W Message jest json, który zawiera dane przesłane requestem z Comarch e-Sklep, których po deserializacji można użyć jako parametrów dla pisanego workera.
Dane wynikowe, które chcemy zwrócić do Comarch e-Sklep należy również serializować do json’a oraz przypisać je do property Response klasy Msg.
Konfiguracja Workera
Tak napisaną klasę należy następnie dodać do pliku configWorkers.json, który zawiera wszystkie Workery zarejestrowane w aplikacji.
Wpis dodający workera wygląda następująco:
{ "Key": "timelocal", "Assembly": "WorkerTime.dll", "Type": "WorkerTime.Time", "Default": false, "Config": { "utc": "0" } },
P l i k c o n f i g W o r k e r s . j s o n | |
P a r a m e t r | O p i s |
Key | To unikatowa nazwa workera przesyłana z requestem dzięki, której aplikacja wie któryz zarejestrowanych workerów powinien obsłużyć request, |
Assembly | Nazwa assembly, gdzie znajduje się worker, którego chcemy dodać |
Type | Nazwa klasy będącej workerem |
Default | Określa czy jest to domyślny worker. Domyślny worker obsługuje requesty, które nie zawierały nazwy workera |
W sekcji config należy dodać listę parametrów wymaganych do inicjalizacji workera:
public override void Initialize(System.Collections.Generic.Dictionaryd) { _utc = d["utc"] == "1"; }
Akcja SYNC/EXEC
Silnik graficzny Liquid ma akcje sync/exec. Ta akcja odpowiada za komunikację interfejsu z Comarch e-Sklep Sync. Akcja przyjmuje parametry:
P a r a m e t r | O p i s |
worker |
|
message |
Treść polecenia do wykonania przez worker. |
Po wykonaniu akcji zwracana jest odpowiedź. Odpowiedź zawiera obiekt lub kolekcję obiektów, które należy wyświetlić na interfejsie. Kolekcja obiektów zwraca jest przykładowo, gdy procedura SQL zwraca kilka recordsetów.
Kod wywołania:
function getData() { $.post(null, { action: 'sync/exec', CSRF: CSRF, worker: 'erpData', message: JSON.stringify( { command: 'CDN.eShop_GetOrders', parameters: { DateFrom: '2017-01-01', DateTo: '2017-03-31', LanguageId: lngId, PageNo: '1'} }) }, function (d) { if (!d.action.Result) { /* wystąpił błąd */ console.log(JSON.stringify(d)) return; } var r = d.action.Object[0]; /* wynik */ console.log(JSON.stringify(d)) /* wynik kolekcja */ var r = d.action.Object[0]; console.log(JSON.stringify(r)) var r2 = d.action.Object[1]; console.log(JSON.stringify(r2)) var r3 = d.action.Object[2]; console.log(JSON.stringify(r3)) }); }