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:
0 1 2 3 4 5 6 7 8 9 10 11 12 |
public abstract class Worker { protected Dictionary<string, string> _config; public virtual void Initialize(Dictionary<string, string> d) { _config = d; } public abstract Task<Msg> 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:
0 1 2 3 4 5 6 7 8 9 10 11 12 |
public abstract class Worker { protected Dictionary<string, string> _config; public virtual void Initialize(Dictionary<string, string> d) { _config = d; } public abstract Task<Msg> Execute(Ipool pool, Msg msgOuter); } |
oraz implementującą metodę Execute:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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.Dictionary<string, string> d) { _utc = d["utc"] == "1"; } public override Task<Msg> 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:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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.Dictionary<string, string> d) { _utc = d["utc"] == "1"; } public override Task<Msg> 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); } } } |
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:
0 1 2 3 4 5 6 7 8 9 10 |
{ "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:
0 1 2 3 4 5 |
public override void Initialize(System.Collections.Generic.Dictionary<string, string> d) { _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:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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)) }); } |