Architektura modułu Dozór celny i włączenie go w bazie - dla wdrożeniowców
Strona opisuje, z czego składa się moduł Dozór celny po stronie serwera i bazy oraz jak go włączyć na wskazanej bazie. Moduł jest ewidencją magazynową: nie składa zgłoszeń celnych i nie jest certyfikowanym modułem celnym. Schemat bazy wgrywa się na każdą bazę z wyłączonym modułem, a menu i dane demonstracyjne tylko na bazie demo. Opis funkcjonalny ekranów zaczyna się od sekcji DOZÓR CELNY.
Na tej stronie
Warstwy modułu
Przeglądarka ładuje jeden z trzech skryptów JavaScript przypisanych do transakcji JQS21. Skrypt rysuje ekran i wysyła zapytania do serwera pod identyfikatorami z rodziny zapytań modułu. Serwer podstawia zmienne zastrzeżone (magazyn, oddział, login zalogowanego użytkownika) i wywołuje procedurę w bazie. Cała logika zmieniająca dane leży w procedurach, a skrypt ekranu tylko wyświetla wynik.
Odczyty idą sterownikiem ssDataSQL: procedura zwraca zbiór wierszy i może mieć własną transakcję. Zapisy idą sterownikiem ssExSQL, w którym serwer owija wywołanie we własną transakcję. Procedury akcji zwracają jeden wiersz z polami OK i KOMUNIKAT, a dwie procedury rzucają wyjątek zamiast zwracać wiersz: zapis PZC i kontrola wydania WZC. Rzucony wyjątek cofa transakcję zatwierdzenia dokumentu magazynowego, w której procedura została wywołana.
Moduł nie ma własnych tabel ruchów magazynowych. Przyjęcie i wydanie zapisują zwykłe wiersze ruchów magazynowych, a tabele modułu przechowują tylko status celny partii z historią zmian oraz dokumenty celne z kolejką komunikatów. Opis tabel znajduje się na stronie model danych i znaczniki.
Trzy transakcje JQS21
Transakcje leżą w skorowidzu (PRX równe JQS21). Każda ma kod otwierający ekran i własny UNIQUEID, a pole KOD1 nadaje jej nazwę techniczną. Adres skryptu jest zapisany w polu IKONA wraz ze znacznikiem wersji.
| Kod transakcji | Skrypt | KOD1 | UNIQUEID | Zakres |
|---|---|---|---|---|
| CE1A-47D2-9B30 | jqs_wms_cel.js | WMS_CEL | A9C4E2B7-5D13-4F86-8E20-3B7D1C9F5A11 | osiem ekranów modułu |
| CE2B-58E3-AC41 | jqs_wms_pzc.js | WMS_PZC | B1D5F3C8-6E24-4097-9F31-4C8E2DAF6B22 | dokument PZC |
| CE3C-69F4-BD52 | jqs_wms_wzc.js | WMS_WZC | C2E6A4D9-7F35-41A8-A042-5D9F3EB07C33 | dokument WZC |
Pozycje menu z sekcji DOZÓR CELNY otwierają wszystkie tę samą transakcję CE1A-47D2-9B30. O tym, który z ośmiu widoków zobaczy użytkownik, decyduje parametr adresu ekran w polu TARGETPARAMETERS wiersza menu. Skrypt czyta ten parametr przy starcie (funkcja MojaOnLoad) i dla wartości spoza listy otwiera kokpit.
| Wartość parametru ekran | Widok |
|---|---|
| kokpit | Kokpit dozoru celnego |
| rejestr | Rejestr dokumentów celnych |
| blokady | Zwolnienia i blokady |
| import | Kolejka importu od agencji |
| terminy | Terminy dozoru |
| raporty | Raporty celne |
| kartoteki | Agencje i kontenery |
| ustawienia | Ustawienia modułu |
Transakcje PZC i WZC dostają w adresie typ dokumentu: prx=PZ&typdok=PZC oraz prx=WZ&typdok=WZC&refno=0. Parametr refno z wartością 0 otwiera nowy dokument, a refno z numerem referencyjnym wczytuje bufor do edycji.
Wiersze menu
Wiersze menu powstają w skrypcie demonstracyjnym przez sklonowanie działających pozycji roli Magazyn. Klonuje się jeden wzorcowy wiersz sekcji (PRX równe MBR) i jeden wzorcowy wiersz paska (PRX równe BAR), a w nich podmienia się teksty widoczne w menu i kolejność pozycji, a także parametry adresu. Dzięki temu nowe pozycje dziedziczą pozostałe kolumny techniczne z pozycji, które w tej bazie już działają.
| Sekcja | PRX | NAME | Tekst w menu | Ekran lub dokument | KOLEJNOSC |
|---|---|---|---|---|---|
| DOZÓR CELNY | MBR | DOZOR_CELNY | DOZÓR CELNY | wiersz sekcji | 12 |
| DOZÓR CELNY | BAR | CEL_KOKPIT | Kokpit dozoru celnego | kokpit | 10 |
| DOZÓR CELNY | BAR | CEL_REJ | Rejestr dokumentów celnych | rejestr | 20 |
| DOZÓR CELNY | BAR | CEL_BLK | Zwolnienia i blokady | blokady | 30 |
| DOZÓR CELNY | BAR | CEL_IMP | Kolejka importu od agencji | import | 40 |
| DOZÓR CELNY | BAR | CEL_TER | Terminy dozoru | terminy | 50 |
| DOZÓR CELNY | BAR | CEL_RAP | Raporty celne | raporty | 60 |
| DOZÓR CELNY | BAR | CEL_KAR | Agencje i kontenery | kartoteki | 70 |
| DOZÓR CELNY | BAR | CEL_ADM | Ustawienia modułu | ustawienia | 80 |
| NOWY | BAR | PZC | Przyjęcie PZC | transakcja CE2B-58E3-AC41 | 12 |
| NOWY | BAR | WZC | Wydanie WZC | transakcja CE3C-69F4-BD52 | 14 |
Wiersz sekcji ma KOLEJNOSC 12, więc sekcja stoi między MAGAZYN a KARTOTEKI. Wiersze paska mają TARGETURL równy role_sys/jqs21.aspx, a w TARGETPARAMETERS wartości w postaci kod=CE1A-47D2-9B30&uid=...&ekran=kokpit. Każdy wiersz menu ma UNIQUEID z rodziny D4F2B8E6-3C59-4A7B-8D21-9F6E8C4ADExx, gdzie xx przyjmuje wartości od 01 do 11. Po tej rodzinie parametr MODUL_CELNY rozpoznaje wiersze do włączenia i wyłączenia.
SELECT PRX, GRUPA, NAME, KOLEJNOSC, AKTYWNE, TARGETPARAMETERS
FROM dbo._menu
WHERE UNIQUEID LIKE 'D4F2B8E6-3C59-4A7B-8D21-9F6E8C4ADE%'
ORDER BY GRUPA, KOLEJNOSC;
Parametry modułu
Trzy parametry leżą w tabeli parametrów, w grupie WMS, z rolą SuperVisor. Skrypt schematu dodaje je tylko wtedy, gdy parametru o danym kodzie jeszcze nie ma, więc ponowne wgranie nie zmienia wartości ustawionych przez administratora.
| Kod | Wartość domyślna | Zakres | Znaczenie |
|---|---|---|---|
| MODUL_CELNY | 0 (typ bool) | 0 albo 1 | Włącza moduł; zmienia też AKTYWNE wierszy menu z rodziny UNIQUEID. |
| CEL_TOLERANCJA | 2 | 0-50 (%) | Tolerancja ilości w kontroli PZC i w raporcie CEL-06. |
| CEL_PROG_DNI | 14 | 1-365 (dni) | Próg dni do końca dozoru w kokpicie i w raporcie CEL-03. |
Parametry zapisuje procedura wołana z ekranu Ustawienia modułu pod zapytaniem 30 z rodziny C3E1A7D5-2B48-4F6A-9C10-8E5D7B3FCExx. Przy MODUL_CELNY procedura dodatkowo ustawia AKTYWNE na 1 albo 0 we wszystkich wierszach menu z rodziny D4F2B8E6-3C59-4A7B-8D21-9F6E8C4ADExx. Dlatego ręczna zmiana samej wartości parametru w bazie nie ukryje menu: trzeba zmienić też wiersze menu albo użyć ekranu ustawień. Komunikaty zwrotne to Moduł włączony i Moduł wyłączony wraz z informacją, że menu odświeży się po ponownym zalogowaniu. Błędy walidacji mają kody 50061-50064.
SELECT KOD, WARTOSC, AKTYWNE, GRUPA, ROLA
FROM dbo._parametry
WHERE KOD IN ('MODUL_CELNY', 'CEL_TOLERANCJA', 'CEL_PROG_DNI');
Skorowidze
Moduł używa trzech rodzajów wpisów w skorowidzu, rozróżnianych kolumną PRX.
- CPR - słownik kodów procedur celnych (71, 40, 42, 51, 53) w roli WMS; ekran Dodaj dokument i ekran Ustawienia modułu czytają go przez procedurę słownika.
- MAG - lista magazynów roli WMS; moduł tylko czyta ją, aby pokazać nazwy magazynów i przypisać im typ oraz limit dni.
- JQS21 - trzy transakcje z poprzedniej sekcji.
- Zmiana słownika CPR - skrypt dodaje tylko brakujące kody, więc kod dopisany ręcznie przez wdrożeniowca zostaje.
SELECT PRX, KOD, KOD1, OPIS, IKONA, AKTYWNE
FROM dbo.x_skorowidze
WHERE (PRX = 'JQS21' AND KOD IN ('CE1A-47D2-9B30', 'CE2B-58E3-AC41', 'CE3C-69F4-BD52'))
OR (PRX = 'CPR' AND ROLASYS = 'WMS')
ORDER BY PRX, KOD;
Kolejność skryptów dbup
Skrypty leżą w katalogu skryptów aktualizacji bazy i są idempotentne: tabele powstają tylko wtedy, gdy ich nie ma; procedury używają CREATE OR ALTER; zapytania i transakcje są aktualizowane po UID. Drugie uruchomienie któregokolwiek skryptu nie zmienia danych.
| Skrypt | Gdzie się wykonuje | Co robi |
|---|---|---|
| ss-2026-10-13-1400-wms-dozor-celny-baza | każda baza | Tabele, funkcje, widok, procedury, zapytania z rodziny C3E1A7D5, dwa forki zapisu, transakcje JQS21, słownik CPR i trzy parametry; MODUL_CELNY zostaje 0. |
| ss-2026-10-13-1410-wms-dozor-celny-demo | tylko baza demo | Menu, dane demonstracyjne i MODUL_CELNY równe 1; bramka @tylkoDemo sprawdza, czy DB_NAME() to SS_demo. |
| ss-2026-10-17-1000-wms-dozor-celny-ikona-js | baza z wgranym 1400 | Poprawia adres skryptu w polu IKONA trzech transakcji do postaci ze znacznikiem .js?v@. |
Skrypt 1410 sprawdza dwa warunki wstępne: nazwę bazy i obecność schematu z poprzedniego skryptu. Gdy któryś nie jest spełniony, kończy pracę bez zmian i wypisuje komunikat PRINT. Dane demonstracyjne wstawia tylko wtedy, gdy w dokumentach celnych nie ma jeszcze numeru zawierającego fragment DEMO. Bramkę można zdjąć świadomie przez zmianę zmiennej @tylkoDemo, ale moduł nie jest jeszcze produktem wdrożonym u klientów, więc taką zmianę uzgadnia się osobno.
Dwa forki zapisu skrypt 1400 buduje z bieżącej treści zapytań źródłowych na danej bazie: zatwierdzenia PZB i PW dla PZC oraz zatwierdzenia WZ dla WZC. Jeśli zapytania źródłowego brakuje, fork zostaje pominięty, a skrypt wypisuje komunikat PRINT. Dla wdrożeniowca oznacza to, że zmiany klienta w zapytaniach zatwierdzających zostają zachowane, ale po każdej zmianie zapytania źródłowego fork trzeba odtworzyć ponownym uruchomieniem skryptu.
Adres skryptu w polu IKONA. Serwer rozpoznaje znacznik wersji tylko w postaci
.js?v@, na przykład/role_wms/26/jqs_wms_cel.js?v@20261017. Gdy adres nie zawiera rozszerzenia .js, serwer dokleja .js na końcu całego tekstu, przeglądarka pyta o nieistniejący plik i dostaje stronę błędu. Objaw to pusty ekran transakcji i komunikat MojaOnLoad is not defined w konsoli przeglądarki. Poprawkę zawiera skrypt 1000.
Pamięć podręczna po wdrożeniu
Zapytania z tabeli zapytań serwer trzyma w pamięci podręcznej, dlatego po każdym wgraniu skryptów trzeba ją wyczyścić adresem /DefaultAdministrator.aspx?isdeploy=reset. W przeglądarce użytkownika dodatkowo pomaga Ctrl+F5, bo zmienia się skrypt ekranu. Menu użytkownika odświeża się dopiero po ponownym zalogowaniu, także po zmianie parametru MODUL_CELNY.
Wymagania serwera SQL
Schemat korzysta z funkcji JSON (OPENJSON, JSON_VALUE, ISJSON) oraz z instrukcji CREATE OR ALTER i THROW, dlatego wymaga SQL Server 2016 SP1 i poziomu zgodności bazy co najmniej 130. Wersję serwera i poziom zgodności bieżącej bazy sprawdzają dwa zapytania poniżej, wykonywane przed wgraniem skryptów.
SELECT @@VERSION AS wersja;
SELECT name, compatibility_level FROM sys.databases WHERE name = DB_NAME();
Cofnięcie
Najprostsze cofnięcie to MODUL_CELNY równe 0 na ekranie Ustawienia modułu: menu znika po ponownym zalogowaniu i przestają być dostępne dokumenty PZC oraz WZC. Dane zostają w tabelach, więc ponowne włączenie przywraca poprzedni stan. Schematu bazy nie trzeba usuwać, ponieważ bez wierszy menu nikt nie otworzy ekranów modułu. Usuwanie danych demonstracyjnych opisuje strona wdrożenie i testy.
Zmiana wartości parametru bezpośrednio w bazie nie wystarczy, bo wiersze menu zmienia procedura zapisu parametru. Jeżeli parametr ustawiono poleceniem UPDATE, trzeba wykonać także UPDATE wierszy menu z rodziny UNIQUEID, ustawiając AKTYWNE na 0.
Najczęstsze pytania
Dlaczego po włączeniu modułu nie widzę menu DOZÓR CELNY?
Menu pojawia się dopiero po ponownym zalogowaniu. Jeżeli nadal go brak, sprawdź, czy wiersze menu z rodziny UNIQUEID D4F2B8E6-3C59-4A7B-8D21-9F6E8C4ADExx mają AKTYWNE równe 1 i czy skrypt 1410 nie pominął menu z braku wzorcowych wierszy roli Magazyn.
Skąd bierze się komunikat MojaOnLoad is not defined?
Adres skryptu w polu IKONA transakcji nie ma postaci .js?v@, więc serwer dokleja .js na końcu i przeglądarka dostaje stronę błędu zamiast skryptu. Naprawia to skrypt ss-2026-10-17-1000, po którym trzeba zresetować pamięć podręczną i odświeżyć stronę klawiszami Ctrl+F5.
Czy skrypt schematu można wgrać na bazę produkcyjną?
Skrypt 1400 jest przeznaczony do wykonania na każdej bazie i zostawia MODUL_CELNY równy 0, ale moduł jest dostępny w demo i nie jest jeszcze produktem wdrożonym u klientów. Skrypty zweryfikowano wykonawczo na kopii bazy demonstracyjnej, więc po wgraniu na inne środowisko wymagane są testy.
Czy wyłączenie modułu kasuje dane?
Nie. Parametr MODUL_CELNY równy 0 ukrywa menu i wyłącza dokumenty PZC i WZC, a tabele modułu zostają bez zmian.
Jaki poziom zgodności bazy jest wymagany?
Co najmniej 130, na SQL Server 2016 SP1, ponieważ procedury używają OPENJSON i CREATE OR ALTER.
Słownik pojęć
- JQS21
- Rodzaj wpisu w skorowidzu opisujący transakcję ekranową: kod, skrypt w polu IKONA, KOD1 i UNIQUEID.
- TARGETPARAMETERS
- Pole wiersza menu z parametrami adresu transakcji; dla modułu zawiera kod, uid i wartość parametru ekran.
- Rodzina UNIQUEID
- Wspólny początek identyfikatora wierszy menu modułu, po którym parametr MODUL_CELNY włącza i wyłącza całą grupę pozycji.
- Fork zapisu
- Zapytanie zatwierdzające zbudowane z bieżącej treści zapytania źródłowego z dopisanym wywołaniem procedury modułu.
- Skorowidz CPR
- Słownik kodów procedur celnych w tabeli skorowidzów, odczytywany przez listy wyboru modułu.
- Idempotentny skrypt
- Skrypt, którego drugie uruchomienie nie zmienia danych ani schematu.