[{"data":1,"prerenderedAt":1389},["ShallowReactive",2],{"project-pl-ecommerce-oe":3},[4,175,330,520,685,1223],{"id":5,"title":6,"body":7,"client":148,"cover":29,"description":139,"extension":149,"featured":150,"links":151,"meta":152,"navigation":153,"order":154,"path":155,"role":156,"seo":157,"slug":158,"stack":159,"stem":166,"summary":167,"tags":168,"thumb":172,"year":173,"__hash__":174},"projects_pl\u002Fprojects\u002Fpl\u002Fawp.md","Automat licytacyjny AWP",{"type":8,"value":9,"toc":138},"minimark",[10,15,19,22,31,35,38,61,65,68,71,98,101,105,108,111,117,121],[11,12,14],"h2",{"id":13},"wprowadzenie","Wprowadzenie",[16,17,18],"p",{},"Firma kupuje części w pakietach wygrywanych na aukcjach. Aukcja kończy się o 16:00:00, a wygrywa ten, kto do tej sekundy złoży najwyższą ofertę. Liczy się timing, bo decydują ostatnie sekundy.",[16,20,21],{},"Napisałem AWP, program, który licytuje za nas. Nazwę wziąłem od snajperki z CS:GO, bo cała sztuka polega na jednym, dobrze wymierzonym strzale na końcu. Stoi na Pythonie z biblioteką CustomTkinter i działa tak samo na Windowsie i macOS.",[16,23,24],{},[25,26],"img",{"alt":27,"height":28,"src":29,"width":30},"Główne okno AWP: tabela dostępnych aukcji u góry, ustawienia licytowania i wątków na dole.",1440,"\u002Fimages\u002Fprojects\u002Fawp\u002Fglowna.webp",2560,[11,32,34],{"id":33},"trzy-wersje","Trzy wersje",[16,36,37],{},"Program dochodził do obecnej formy w trzech krokach, a każdy zdejmował wąskie gardło poprzedniego.",[39,40,41,49,55],"ol",{},[42,43,44,48],"li",{},[45,46,47],"strong",{},"Selenium."," Pierwsza wersja wchodziła na każdą aukcję i klikała wszystkie oferty, a po cenę minimalną musiała wejść w szczegóły. Działała wolno, bo każde kliknięcie czekało, aż strona się załaduje i wyrenderuje.",[42,50,51,54],{},[45,52,53],{},"Sześć przeglądarek."," Druga wersja była wielowątkowa. Otwierała sześć przeglądarek headless i dzieliła między nie pracę: jedne odświeżały oferty, inne oddawały strzały.",[42,56,57,60],{},[45,58,59],{},"Bezpośrednie endpointy."," Obecna wersja wymagała rozpracowania, co i jak leci na serwer aukcji. Znalazłem endpointy do oddania strzału i do odświeżania ofert, więc przeglądarka przestała być potrzebna. Doszły do tego optymalizacje. Dziś jedynym hamulcem programu jest limit pieniędzy, do którego ma licytować.",[11,62,64],{"id":63},"strategia-licytowania","Strategia licytowania",[16,66,67],{},"Program nie licytuje pierwszy. Dopóki nikt nie podbije ceny, AWP czeka. Dopiero gdy ktoś inny odda ofertę, od razu ją przebija, więc sami nie nakręcamy ceny.",[16,69,70],{},"Resztę zachowania ustawiasz na dole okna.",[72,73,74,80,86,92],"ul",{},[42,75,76,79],{},[45,77,78],{},"minimalny i maksymalny skok ceny",", a między tymi wartościami program losuje, żeby nie podbijać zawsze o tę samą kwotę,",[42,81,82,85],{},[45,83,84],{},"maksymalna cena",", do której wolno licytować,",[42,87,88,91],{},[45,89,90],{},"przebijanie tylko po cudzej ofercie",", opisane wyżej,",[42,93,94,97],{},[45,95,96],{},"moment startu",", czyli od kiedy program zaczyna oddawać strzały.",[16,99,100],{},"Program dzieli się na dwie tabele. U góry jest filtrowanie i lista wszystkich dostępnych aukcji. Niżej siedzą ustawienia licytowania dla ofert, w których bierzemy udział.",[11,102,104],{"id":103},"wątki-i-odświeżanie","Wątki i odświeżanie",[16,106,107],{},"Przy starcie ustawiasz, ile wątków przeznaczyć na program. Każda aktywna oferta dostaje jeden osobny wątek tylko do oddawania strzałów, żeby nic jej nie blokowało. Pozostałe wątki odświeżają oferty.",[16,109,110],{},"Przy ośmiu wątkach i czterech ofertach cztery wątki strzelają, po jednym na ofertę, a cztery odświeżają. Starty wątków rozkładam równomiernie w czasie, więc w każdej chwili któryś z nich właśnie kończy odświeżanie. W efekcie oferty odświeżają się co około 50 ms, a oddanie strzału zajmuje około 10 ms.",[112,113,114],"blockquote",{},[16,115,116],{},"Trzecia wersja licytuje prosto po endpointach, bez przeglądarki. Jedynym hamulcem został limit pieniędzy, do którego program ma dobić.",[11,118,120],{"id":119},"rezultaty","Rezultaty",[72,122,123,126,129,132,135],{},[42,124,125],{},"Program wygrywa 99,9% licytacji, w których bierze udział.",[42,127,128],{},"Trzecia wersja licytuje bezpośrednio po endpointach, bez przeglądarki. Oferty odświeżają się co około 50 ms, a strzał schodzi w około 10 ms.",[42,130,131],{},"Strategia snajpera sprawia, że program nie licytuje pierwszy, przebija z losowym skokiem ceny i trzyma twardy limit, więc nie przepłaca.",[42,133,134],{},"Jedna aplikacja na Windowsa i macOS.",[42,136,137],{},"Wygrane pakiety trafiają prosto do Stacji, która przetwarza je na części.",{"title":139,"searchDepth":140,"depth":140,"links":141},"",3,[142,144,145,146,147],{"id":13,"depth":143,"text":14},2,{"id":33,"depth":143,"text":34},{"id":63,"depth":143,"text":64},{"id":103,"depth":143,"text":104},{"id":119,"depth":143,"text":120},"Komercyjne, branża automotive","md",false,[],{},true,5,"\u002Fprojects\u002Fpl\u002Fawp","Full-Stack & Automation Engineer",{"title":6,"description":139},"awp",[160,161,162,163,164,165],"Python","CustomTkinter","Selenium","Web scraping","API","Multithreading","projects\u002Fpl\u002Fawp","Program, który automatycznie licytuje pakiety części na aukcjach. Przeszedł od Selenium, przez sześć przeglądarek headless, po bezpośrednie endpointy bez przeglądarki. Gra jak snajper, bo nie licytuje pierwszy, przebija z losowym skokiem i trzyma twardy limit ceny. Dostarcza wygrane pakiety do Stacji.",[169,170,171],"Automation","Reverse engineering","Desktop",null,"2025","uByHGha1QmcTRJ8L6RJMztEQNAtgMU1rUEsr8HJv3vg",{"id":176,"title":177,"body":178,"client":306,"cover":307,"description":139,"extension":149,"featured":153,"links":308,"meta":312,"navigation":153,"order":143,"path":313,"role":314,"seo":315,"slug":316,"stack":317,"stem":323,"summary":324,"tags":325,"thumb":172,"year":173,"__hash__":329},"projects_pl\u002Fprojects\u002Fpl\u002Fbrogear-ai.md","Platforma AI BroGear dla firm B2B",{"type":8,"value":179,"toc":298},[180,184,187,190,194,197,204,208,211,218,221,225,228,231,256,260,263,269,272,275,280,284],[11,181,183],{"id":182},"problem","Problem",[16,185,186],{},"BroGear to platforma B2B dla warsztatów, blacharzy i mechaników. Zamiast szukać części po Allegro, eBayu, Ovoko i kolejnych hurtowniach, klient zamawia wszystko w jednym miejscu. Wrzuca kosztorys naprawy z programu do wyceny szkód, plik z numerami części albo zdjęcie kartki, a my znajdujemy części.",[16,188,189],{},"Zbudowałem trzy filary. Wyszukiwarkę po ponad 60 milionach ofert postawiłem na Elasticsearch, BroBot to agent AI oparty o DeepSeek, a trzeci moduł czyta kosztorysy przez OCR i dopasowuje numery do katalogu.",[11,191,193],{"id":192},"dziesięć-źródeł-jedno-zamówienie","Dziesięć źródeł, jedno zamówienie",[16,195,196],{},"Strona główna pokazuje sedno usługi. Klient nie przeszukuje już Allegro, eBaya ani Ovoko. Składa jedno zamówienie, dostaje jedną dostawę i jedną fakturę na wszystko.",[16,198,199],{},[25,200],{"alt":201,"height":202,"src":203,"width":30},"Strona główna: zamów części z wielu hurtowni w jednym miejscu, z jedną dostawą i jedną fakturą.",921,"\u002Fimages\u002Fprojects\u002Fbrogear-ai\u002Fglowna-2.webp",[11,205,207],{"id":206},"_60-mln-ofert-w-około-100-ms","60 mln ofert w około 100 ms",[16,209,210],{},"Sercem platformy jest wyszukiwarka. Klient podaje numer części albo jego fragment, a system przeszukuje ponad 60 milionów produktów od różnych hurtowni. Taki zbiór zwykłą bazą przeszukuje się wolno, zwłaszcza przy niepełnym numerze. Postawiłem na Elasticsearch, dzięki czemu wynik wraca w około 100 ms.",[16,212,213],{},[25,214],{"alt":215,"height":216,"src":217,"width":30},"Wyniki wyszukiwania: oferty wielu hurtowni z legendą jakości i cenami.",1452,"\u002Fimages\u002Fprojects\u002Fbrogear-ai\u002Fsearch.webp",[16,219,220],{},"Wyniki pokazują oferty różnych hurtowni i różnych jakości, z legendą i cenami pod spodem. Zamiast wszystkiego widać po trzy najtańsze oferty z każdego dostępnego rodzaju.",[11,222,224],{"id":223},"agent-dopytuje-zamiast-zgadywać","Agent dopytuje zamiast zgadywać",[16,226,227],{},"BroBot to nasz chatbot. Pod spodem działa agent AI z DeepSeek. LLM jest mózgiem, a agent sam uruchamia narzędzia, żeby zdobyć dane i uzupełnić braki. Odpowiada w każdym języku, a na stronie pomaga też zostawić mail albo numer telefonu.",[16,229,230],{},"Na przykładzie poniżej pytam o zderzak. BroBot dopytuje o generację modelu, o to, czy zakup jest na firmę, i prosi o VIN, żeby część na pewno pasowała. Na końcu podaje link do sklepu.",[16,232,233,240,241,240,246,240,251],{},[25,234],{"alt":235,"height":30,"src":236,"width":237,"className":238},"Rozmowa z BroBotem: pytanie o zderzak.","\u002Fimages\u002Fprojects\u002Fbrogear-ai\u002Fbrobot-1.webp",1719,[239],"chat-shot"," ",[25,242],{"alt":243,"height":30,"src":244,"width":237,"className":245},"Rozmowa z BroBotem: dopytanie o generację modelu.","\u002Fimages\u002Fprojects\u002Fbrogear-ai\u002Fbrobot-2.webp",[239],[25,247],{"alt":248,"height":30,"src":249,"width":237,"className":250},"Rozmowa z BroBotem: zakup na firmę i prośba o VIN.","\u002Fimages\u002Fprojects\u002Fbrogear-ai\u002Fbrobot-3.webp",[239],[25,252],{"alt":253,"height":30,"src":254,"width":237,"className":255},"Rozmowa z BroBotem: link do pasującej części w sklepie.","\u002Fimages\u002Fprojects\u002Fbrogear-ai\u002Fbrobot-4.webp",[239],[11,257,259],{"id":258},"od-kosztorysu-do-koszyka","Od kosztorysu do koszyka",[16,261,262],{},"To jedna z najbardziej rozbudowanych części. Warsztat dostaje od ubezpieczalni kosztorys naprawy z numerami części. Bywa to plik z Eurotaksu, ale też PDF, CSV, Excel albo zdjęcie kartki z ręcznie pisanymi numerami.",[16,264,265],{},[25,266],{"alt":267,"height":216,"src":268,"width":30},"BroGear PRO AI: kosztorys przechodzi przez OCR i DeepSeek, a numery trafiają do koszyka.","\u002Fimages\u002Fprojects\u002Fbrogear-ai\u002Fbrogear-ai.webp",[16,270,271],{},"Agent AI uruchamia OCR i odczytuje każdy plik. DeepSeek na danych z OCR znajduje numery części i liczbę sztuk, po czym zwraca je w JSON. Agent przeszukuje Elasticsearch i przy trafieniu dokładnego numeru dodaje część do listy.",[16,273,274],{},"OCR się myli, potrafi wziąć 0 za O albo I za L. Dlatego agent szuka też wariantów z takimi podmianami. Jeśli znajdzie pasującą część, dodaje ją, ale oznacza innym kolorem, żeby klient sam sprawdził dopasowanie. Całość trafia do koszyka i do zakupu.",[112,276,277],{},[16,278,279],{},"Kosztorys z ubezpieczalni wchodzi jako PDF, Excel albo zdjęcie kartki. Wychodzi gotowy koszyk z dopasowanymi numerami części.",[11,281,283],{"id":282},"co-trafiło-na-produkcję","Co trafiło na produkcję",[72,285,286,289,292,295],{},[42,287,288],{},"Jedno miejsce na zakup części, z jedną dostawą i jedną fakturą zamiast dziesięciu zakładek.",[42,290,291],{},"Wyszukiwarka po 60M+ ofert w około 100 ms dzięki Elasticsearch.",[42,293,294],{},"BroBot dopytuje o generację i VIN, ograniczając ryzyko złego dopasowania.",[42,296,297],{},"Kosztorys zamienia się w koszyk. OCR i DeepSeek wyciągają numery, a niepewne dopasowania trafiają do ręcznej kontroli.",{"title":139,"searchDepth":140,"depth":140,"links":299},[300,301,302,303,304,305],{"id":182,"depth":143,"text":183},{"id":192,"depth":143,"text":193},{"id":206,"depth":143,"text":207},{"id":223,"depth":143,"text":224},{"id":258,"depth":143,"text":259},{"id":282,"depth":143,"text":283},"Komercyjne · branża automotive","\u002Fimages\u002Fprojects\u002Fbrogear-ai\u002Fcover.webp",[309],{"label":310,"url":311},"Odwiedź BroGear.eu","https:\u002F\u002Fbrogear.eu",{},"\u002Fprojects\u002Fpl\u002Fbrogear-ai","AI & Full-Stack Engineer",{"title":177,"description":139},"brogear-ai",[318,160,319,320,321,322],"Nuxt","FastAPI","Elasticsearch","OCR","Integracja LLM","projects\u002Fpl\u002Fbrogear-ai","Wyszukiwarka nad 60 mln ofert oraz pipeline, który zamienia kosztorys naprawy w zweryfikowaną listę części i gotowy koszyk.",[326,327,328],"AI","Search","RAG","qBEfoWAhvSqEry1Cpl3js6kAcCiB0lFRXuf5xLINO-s",{"id":331,"title":332,"body":333,"client":306,"cover":498,"description":139,"extension":149,"featured":153,"links":499,"meta":503,"navigation":153,"order":140,"path":504,"role":505,"seo":506,"slug":507,"stack":508,"stem":512,"summary":513,"tags":514,"thumb":172,"year":518,"__hash__":519},"projects_pl\u002Fprojects\u002Fpl\u002Fecommerce-oe.md","Sklep internetowy DwParts z częściami",{"type":8,"value":334,"toc":486},[335,337,340,343,346,350,353,359,365,370,373,379,383,386,392,396,399,411,419,422,426,429,435,438,442,445,451,455,458,464,466],[11,336,14],{"id":13},[16,338,339],{},"DwParts to sklep internetowy firmy z częściami samochodowymi. Po pierwszej wersji sklepu przeanalizowałem ruch na stronie i zobaczyłem, że klienci najczęściej szukają części po numerze OE. Dlatego wyszukiwarkę umieściłem od razu w sekcji hero. Sklep stoi na Nuxt, a płatności obsługuje Stripe.",[16,341,342],{},"Własny sklep oznacza brak prowizji marketplace, więc firma sprzedaje na własnych warunkach.",[16,344,345],{},"Najtrudniejszy okazał się jednak nie sam sklep, tylko SEO. Firma trzyma po kilka części o tym samym numerze OE, więc każdy wariant musiał dostać własny, indeksowalny adres. Opisuję to niżej.",[11,347,349],{"id":348},"strona-główna","Strona główna",[16,351,352],{},"Hero prowadzi prosto do wyszukiwarki, bo to najczęstsza droga klienta. Niżej układają się produkty na promocji, dodatkowe promocje i bestsellery.",[16,354,355],{},[25,356],{"alt":357,"height":216,"src":358,"width":30},"Strona główna: produkty na promocji.","\u002Fimages\u002Fprojects\u002Fecommerce-oe\u002Fglowna-2.webp",[16,360,361],{},[25,362],{"alt":363,"height":216,"src":364,"width":30},"Strona główna: bestsellery.","\u002Fimages\u002Fprojects\u002Fecommerce-oe\u002Fglowna-3.webp",[366,367,369],"h3",{"id":368},"wyszukiwanie-po-oe-i-aucie","Wyszukiwanie po OE i aucie",[16,371,372],{},"Klient wpisuje numer OE albo wybiera konkretny samochód, a sklep pokazuje pasujące części. To skraca drogę do właściwego produktu, zwłaszcza gdy ktoś zna tylko numer z dowodu.",[16,374,375],{},[25,376],{"alt":377,"height":216,"src":378,"width":30},"Wyszukiwanie części po numerze OE.","\u002Fimages\u002Fprojects\u002Fecommerce-oe\u002Fwyszukanie-oe.webp",[366,380,382],{"id":381},"sklep-i-filtry","Sklep i filtry",[16,384,385],{},"Strona sklepu daje filtry i wygodne przeglądanie całego katalogu.",[16,387,388],{},[25,389],{"alt":390,"height":216,"src":391,"width":30},"Strona sklepu z filtrami.","\u002Fimages\u002Fprojects\u002Fecommerce-oe\u002Fsklep.webp",[11,393,395],{"id":394},"warianty-oe-i-seo","Warianty OE i SEO",[16,397,398],{},"Najtrudniejszym elementem było SEO. Firma trzyma w magazynie po kilka części o tym samym numerze OE. To na przykład kilka takich samych zderzaków, ale każdy w innym stanie, innym kolorze i z innego pakietu, więc koszt zakupu każdej sztuki bywa inny.",[16,400,401,402,406,407,410],{},"Gdyby w adresie produktu siedział sam numer OE, wszystkie te warianty wskazywałyby jeden link i konkurowały o tę samą pozycję w Google. Dlatego adres składa się z numeru OE i konkretnego wariantu, w formie ",[403,404,405],"code",{},"numer-oe?sku=X",". Numer OE łapie ruch z wyszukiwań po numerze, a ",[403,408,409],{},"sku"," rozróżnia fizyczne sztuki, więc każdy wariant ma własny, indeksowalny adres i nie kanibalizuje pozostałych.",[112,412,413],{},[16,414,415,416,418],{},"Każdy wariant tej samej części dostaje własny adres ",[403,417,405],{},", więc identyczne zderzaki nie biją się o jedną pozycję w Google.",[16,420,421],{},"Poza klasycznym SEO sklep jest też przygotowany pod GEO, czyli widoczność w odpowiedziach modeli AI. Struktura stron i dane produktów są ułożone tak, żeby czytały je nie tylko roboty Google, ale i modele, które coraz częściej polecają sklepy w rozmowie.",[11,423,425],{"id":424},"strona-produktu","Strona produktu",[16,427,428],{},"Na karcie produktu klient widzi wcześniejsze ceny oraz najniższą cenę z ostatnich 30 dni, zgodnie z dyrektywą Omnibus.",[16,430,431],{},[25,432],{"alt":433,"height":216,"src":434,"width":30},"Strona produktu z historią ceny i ceną zgodną z dyrektywą Omnibus.","\u002Fimages\u002Fprojects\u002Fecommerce-oe\u002Fprodukt.webp",[16,436,437],{},"Każda część ma też własną wysyłkę, liczoną zależnie od kraju dostawy, więc klient od razu widzi realny koszt przesyłki dla swojej lokalizacji.",[11,439,441],{"id":440},"koszyk","Koszyk",[16,443,444],{},"W koszyku klient wpisuje kupony rabatowe. Blokada pilnuje, żeby nie dało się dodać części ponad stan magazynowy.",[16,446,447],{},[25,448],{"alt":449,"height":216,"src":450,"width":30},"Koszyk z polem na kupon i kontrolą dostępności.","\u002Fimages\u002Fprojects\u002Fecommerce-oe\u002Fkoszyk.webp",[11,452,454],{"id":453},"płatności","Płatności",[16,456,457],{},"Płatności idą przez Stripe, czyli karta, BLIK, Apple Pay, Google Pay i inne metody, a do tego zwykłe przelewy. Sklep działa w trzech językach (polski, angielski, niemiecki) i czterech walutach (PLN, EUR, USD, GBP). Klient z Unii, który poda numer VAT, dostaje cenę bez 23% podatku, ale tylko gdy numer jest aktywny w VIES. Sklep sprawdza to automatycznie, więc numer spoza UE (na przykład z USA czy Azji) nie zadziała.",[16,459,460],{},[25,461],{"alt":462,"height":216,"src":463,"width":30},"Płatności Stripe z obsługą wielu metod i walut.","\u002Fimages\u002Fprojects\u002Fecommerce-oe\u002Fplatnosc.webp",[11,465,120],{"id":119},[72,467,468,474,477,480,483],{},[42,469,470,471,473],{},"Osobny adres SEO dla każdego wariantu części (numer OE + ",[403,472,409],{},"), więc warianty nie kanibalizują się w Google.",[42,475,476],{},"Wyszukiwarka po numerze OE w hero, bo tak najczęściej szukają klienci.",[42,478,479],{},"SEO i GEO, czyli widoczność w Google oraz w odpowiedziach modeli AI.",[42,481,482],{},"Płatności Stripe (karta, BLIK, Apple Pay, Google Pay) i przelewy, w czterech walutach, z wysyłką liczoną per kraj dostawy.",[42,484,485],{},"Trzy języki, dyrektywa Omnibus i odliczenie 23% VAT dla klientów z UE z numerem aktywnym w VIES.",{"title":139,"searchDepth":140,"depth":140,"links":487},[488,489,493,494,495,496,497],{"id":13,"depth":143,"text":14},{"id":348,"depth":143,"text":349,"children":490},[491,492],{"id":368,"depth":140,"text":369},{"id":381,"depth":140,"text":382},{"id":394,"depth":143,"text":395},{"id":424,"depth":143,"text":425},{"id":440,"depth":143,"text":441},{"id":453,"depth":143,"text":454},{"id":119,"depth":143,"text":120},"\u002Fimages\u002Fprojects\u002Fecommerce-oe\u002Fcover.webp",[500],{"label":501,"url":502},"Odwiedź DwParts.eu","https:\u002F\u002Fdwparts.eu",{},"\u002Fprojects\u002Fpl\u002Fecommerce-oe","Full-Stack Developer",{"title":332,"description":139},"ecommerce-oe",[318,509,510,511],"Stripe","TypeScript","i18n","projects\u002Fpl\u002Fecommerce-oe","Sklep z częściami samochodowymi w Nuxt. Wyszukiwarka po numerze OE w hero, osobny adres SEO dla każdego wariantu części (OE + SKU), płatności Stripe, trzy języki i cztery waluty.",[515,516,517],"Full-stack","E-commerce","SEO","2024","ArWp5EkSXsHt-9NH9YgIBgxBAnuEU2pknBB6Mp0v1RY",{"id":521,"title":522,"body":523,"client":148,"cover":551,"description":139,"extension":149,"featured":150,"links":670,"meta":671,"navigation":153,"order":672,"path":673,"role":314,"seo":674,"slug":675,"stack":676,"stem":680,"summary":681,"tags":682,"thumb":624,"year":173,"__hash__":684},"projects_pl\u002Fprojects\u002Fpl\u002Ffotki.md","Fotki części z AI do wycinania tła",{"type":8,"value":524,"toc":662},[525,527,530,533,536,540,543,546,552,559,563,570,585,588,592,595,613,618,626,629,633,636,643,646,648],[11,526,14],{"id":13},[16,528,529],{},"Allegro wymaga białego tła dla nowych przedmiotów. Stary program do zdjęć, wpięty w pierwszą wersję Stacji, nie miał żadnego AI. Wycinał tło po kolorze: zgadywał, gdzie jest tło i podobne do niego barwy, i usuwał ten obszar. Żeby to zadziałało, pracownicy musieli prześwietlać zdjęcia, bo dopiero jasne tło dawało się wyciąć.",[16,531,532],{},"Efekt był słaby. Czarne elementy części wychodziły szare, a przy zbliżonych kolorach program wycinał za dużo albo za mało.",[16,534,535],{},"Napisałem od zera nowy program, „Fotki”. Stoi głównie na Pythonie z biblioteką CustomTkinter, do tego Node.js i HTML. Zastąpił wycinanie po kolorze modelami, które rozpoznają sam przedmiot, więc prześwietlanie przestało być potrzebne.",[11,537,539],{"id":538},"telefon-zamiast-lustrzanki","Telefon zamiast lustrzanki",[16,541,542],{},"Pierwotnie zdjęcia miały powstawać lustrzanką. Pokazałem szefostwu, że nowe telefony robią zdjęcia na bardzo dobrym poziomie i są dużo poręczniejsze od dużej lustrzanki. Przekonałem ich do telefonu i na nim oparłem cały proces.",[16,544,545],{},"Żeby przyśpieszyć development, nie budowałem osobnych aplikacji na Androida i iOS. Program w Pythonie odpala lokalny serwer Node i pokazuje kod QR. Pracownik skanuje go telefonem i otwiera stronę w przeglądarce, ta sama na Androidzie i iOS.",[16,547,548],{},[25,549],{"alt":550,"height":28,"src":551,"width":30},"Okno programu „Fotki” w Pythonie, z przyciskiem pokazującym kod QR do połączenia telefonu.","\u002Fimages\u002Fprojects\u002Ffotki\u002Fglowna.webp",[16,553,554,555,558],{},"Program buduję do ",[403,556,557],{},"exe",". Odpalony osobno wymaga zalogowania na konto. Odpalony ze Stacji od razu loguje danego użytkownika, więc fotograf nie podaje hasła drugi raz.",[11,560,562],{"id":561},"zdjęcia-z-przeglądarki","Zdjęcia z przeglądarki",[16,564,565,566,569],{},"Po zeskanowaniu kodu QR na telefonie otwiera się prosta strona. Pracownik skanuje kod kreskowy części, ten sam, który widać w szczegółach części i na wydrukowanej etykiecie, albo wpisuje ",[403,567,568],{},"id"," ręcznie. Program sprawdza, czy część jest w bazie i czy ma już zdjęcia. Jeśli zdjęcia istnieją, pojawiają się od razu w oknie Pythona.",[16,571,572,240,580],{},[25,573],{"alt":574,"height":575,"src":576,"width":577,"className":578},"Wersja w przeglądarce: skanowanie kodu kreskowego lub wpisanie id części.",1612,"\u002Fimages\u002Fprojects\u002Ffotki\u002Fmobile-main.webp",790,[579],"phone-shot",[25,581],{"alt":582,"height":575,"src":583,"width":577,"className":584},"Po dopasowaniu części: przyciski do robienia kolejnych zdjęć i usunięcia ostatniego.","\u002Fimages\u002Fprojects\u002Ffotki\u002Fmobile-skan.webp",[579],[16,586,587],{},"Z telefonu robisz kolejne zdjęcia albo kasujesz ostatnie. Limit na ofertę to 16 zdjęć, więc po jego osiągnięciu program wyświetla powiadomienie.",[11,589,591],{"id":590},"wycinanie-tła-na-gpu","Wycinanie tła na GPU",[16,593,594],{},"Zdjęcie z telefonu leci do programu, PyTorch przerzuca je na kartę graficzną i model wycina tło. Modele trzymam załadowane w pamięci karty, dzięki czemu jedno zdjęcie obrabia się w około 0,8 sekundy.",[16,596,597,598,601,602,601,605,608,609,612],{},"Do wyboru są cztery modele: ",[403,599,600],{},"Remover",", ",[403,603,604],{},"BiRefNet",[403,606,607],{},"BiRefNet-Lite"," i ",[403,610,611],{},"RMBG-2.0",". Każdy radzi sobie inaczej z trudnymi kształtami i kolorami, więc fotograf dobiera ten, który najlepiej tnie daną część.",[112,614,615],{},[16,616,617],{},"Jedno zdjęcie obrabia się w około 0,8 sekundy, a czarne części wreszcie wychodzą czarne, bez prześwietlania.",[16,619,620],{},[25,621],{"alt":622,"height":623,"src":624,"width":625},"Okno edycji w Pythonie: zdjęcie po wycięciu tła, z obracaniem i kadrowaniem.",843,"\u002Fimages\u002Fprojects\u002Ffotki\u002Fzdjecie.webp",1600,[16,627,628],{},"W oknie obrócisz zdjęcie i je wykadrujesz. Zdjęcia kadrują się też automatycznie, tak żeby nawet długie części trzymały minimalne wymiary wymagane do wystawienia na marketplace'ach.",[11,630,632],{"id":631},"lokalizacje","Lokalizacje",[16,634,635],{},"Program podpowiada, gdzie odłożyć daną część na magazynie. Dzięki temu pracownik robiący zdjęcia od razu segreguje części, zamiast zostawiać to na osobny etap.",[16,637,638],{},[25,639],{"alt":640,"height":641,"src":642,"width":625},"Podpowiedź lokalizacji magazynowej dla fotografowanej części.",906,"\u002Fimages\u002Fprojects\u002Ffotki\u002Flokalizacje.webp",[16,644,645],{},"Zatwierdzenie wysyła zdjęcia na serwer, skąd trafiają na oferty.",[11,647,120],{"id":119},[72,649,650,653,656,659],{},[42,651,652],{},"Wycinanie tła na GPU czterema modelami AI, jedno zdjęcie w około 0,8 sekundy, bez prześwietlania, więc czarne części wreszcie wychodzą czarne.",[42,654,655],{},"Telefon zamiast lustrzanki: zdjęcia przez przeglądarkę i kod QR, bez dedykowanej aplikacji, tak samo na Androidzie i iOS.",[42,657,658],{},"Automatyczne kadrowanie do minimalnych wymiarów marketplace'ów i powiadomienie po osiągnięciu limitu 16 zdjęć.",[42,660,661],{},"Spięte ze Stacją: logowanie przechodzi automatycznie, a podpowiedź lokalizacji pozwala segregować części już przy zdjęciach.",{"title":139,"searchDepth":140,"depth":140,"links":663},[664,665,666,667,668,669],{"id":13,"depth":143,"text":14},{"id":538,"depth":143,"text":539},{"id":561,"depth":143,"text":562},{"id":590,"depth":143,"text":591},{"id":631,"depth":143,"text":632},{"id":119,"depth":143,"text":120},[],{},4,"\u002Fprojects\u002Fpl\u002Ffotki",{"title":522,"description":139},"fotki",[160,161,677,678,679],"Node.js","PyTorch","HTML \u002F JS","projects\u002Fpl\u002Ffotki","Program do robienia zdjęć części z automatycznym wycinaniem tła na GPU. Cztery modele AI (Remover, BiRefNet, BiRefNet-Lite, RMBG-2.0), zdjęcia z telefonu przez przeglądarkę i kod QR, bez dedykowanej aplikacji. Część ekosystemu Stacji.",[326,683,171],"Computer Vision","p5pPBFJm72iWVvhr-n8UZQL0f9BvEOslezbmkrzxgYc",{"id":686,"title":687,"body":688,"client":148,"cover":1204,"description":139,"extension":149,"featured":153,"links":1205,"meta":1206,"navigation":153,"order":1207,"path":1208,"role":1209,"seo":1210,"slug":1211,"stack":1212,"stem":1218,"summary":1219,"tags":1220,"thumb":781,"year":173,"__hash__":1222},"projects_pl\u002Fprojects\u002Fpl\u002Fstacja-erp-wms.md","System ERP\u002FWMS Stacja 2.0",{"type":8,"value":689,"toc":1180},[690,692,695,698,701,706,710,713,720,723,743,746,748,751,755,758,775,782,793,798,801,805,808,828,834,837,863,869,872,874,877,881,884,888,891,897,904,933,936,941,945,954,987,991,998,1004,1008,1011,1028,1034,1038,1041,1045,1048,1074,1078,1081,1101,1107,1111,1114,1138,1144,1148,1151,1155,1158,1177],[11,691,14],{"id":13},[16,693,694],{},"Kiedy zaczynałem w firmie, korzystała ona z przestarzałego, niededykowanego programu do zarządzania demontażem pojazdów. Przez około rok jakoś działał, miał swoje błędy, ale dawało się na nim pracować. Był jednak wolny, wyglądał archaicznie, a pakiety trzeba było dodawać osobnym narzędziem.",[16,696,697],{},"Zanim powstała Stacja, napisałem kilka osobnych programów, które miały po prostu współpracować ze starym systemem i przyspieszać pracę. Program do dodawania pakietów, pakowacz i program do robienia zdjęć, każdy łatał inne wąskie gardło. Wszystkie powstały w Nuxt i Electronie.",[16,699,700],{},"Punktem zwrotnym było Allegro. Zaczęło wymagać danych GPSR do wystawiania i edycji ofert, a stary program tego nie obsługiwał. Firma po prostu przestała wystawiać i straciła jeden z dwóch kanałów sprzedaży. To był kluczowy powód, żeby zamiast dalej łatać stary system, zbudować własny od zera.",[112,702,703],{},[16,704,705],{},"Tak powstała Stacja. MVP zbudowałem w dwa tygodnie, żeby jak najszybciej odblokować wystawianie na Allegro. Ponieważ wcześniejsze narzędzia były już w Nuxt i Electronie, wpięcie ich w Stację 2.0 poszło gładko.",[11,707,709],{"id":708},"architektura","Architektura",[16,711,712],{},"Dziś Stacja prowadzi cały obieg firmy, od magazynu, przez sprzedaż, pakowanie i wysyłkę, po dostawy i dokumenty magazynowe.",[16,714,715,716,719],{},"Program działa na Electronie, dzięki czemu ",[45,717,718],{},"każdy komputer odpala własny lokalny serwer",". Zdjęcia i baza są trzymane lokalnie, więc program działa nawet wtedy, gdy padnie internet. Całość ma też tryb ciemny, żeby każdy pracował tak, jak mu wygodniej.",[16,721,722],{},"Stacja jest też częścią większego ekosystemu narzędzi.",[72,724,725,731,737],{},[42,726,727,730],{},[45,728,729],{},"AWP",", osobny program do licytacji, który dostarcza wygrane pakiety.",[42,732,733,736],{},[45,734,735],{},"Fotki",", program do robienia zdjęć części.",[42,738,739,742],{},[45,740,741],{},"Stacja na skanery",", aplikacja do odkładania i kompletacji.",[16,744,745],{},"Tutaj opisuję główny moduł magazynowy.",[366,747,735],{"id":675},[16,749,750],{},"Z poziomu Stacji można też uruchomić program „fotki” do robienia zdjęć części. Powstał, podobnie jak dodawanie i pakowacz, jeszcze przed Stacją i nadal działa jako osobny moduł, który opiszę oddzielnie.",[11,752,754],{"id":753},"magazyn","Magazyn",[16,756,757],{},"Sercem programu jest sam magazyn. Mamy wybór tabel, z których czytamy dane, oraz kilka predefiniowanych widoków. Każde ustawienie zapisuje się per użytkownik, a kolumny każdy układa po swojemu.",[72,759,760,763,766,769,772],{},[42,761,762],{},"Zmiana kolejności i ukrywanie zbędnych kolumn.",[42,764,765],{},"Filtr na każdej kolumnie z osobna.",[42,767,768],{},"Sortowanie i zmiana szerokości.",[42,770,771],{},"Podgląd zdjęcia części po kliknięciu w wiersz (lewy dolny róg).",[42,773,774],{},"Eksport całości jednym przyciskiem.",[16,776,777],{},[25,778],{"alt":779,"height":780,"src":781,"width":30},"Tabela magazynu: ponad 22 000 części w jednym widoku, z konfigurowalnymi kolumnami i podglądem zdjęć.",1442,"\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fmagazyn.webp",[16,783,784,785,788,789,792],{},"Mamy obecnie ponad 22 000 części. Wyrenderowanie tylu wierszy zwykłym ",[403,786,787],{},"v-for"," potrafiłoby zaciąć cały program, dlatego użyłem ",[403,790,791],{},"Clusterize",". W drzewie DOM żyje tylko około 50 wierszy widocznych na ekranie, a reszta dorysowuje się w locie podczas przewijania.",[112,794,795],{},[16,796,797],{},"22 000+ części w jednym widoku, a przeglądarka maluje naraz tylko ~50 wierszy. Lista zostaje płynna, a filtrowanie działa natychmiast.",[16,799,800],{},"Tu też zaznaczysz produkty, na przykład te, które leżą na magazynie od dwóch lat, i przecenisz je o zadany procent.",[366,802,804],{"id":803},"szczegóły-produktu","Szczegóły produktu",[16,806,807],{},"Każdy produkt ma rozbudowany modal, który zbiera wszystkie dane w jednym miejscu.",[72,809,810,813,816,819,822,825],{},[42,811,812],{},"Nazwa, cena, strona montażu, numer fabryczny, kolor, przebieg, stan i lokalizacje.",[42,814,815],{},"Ilość przyjęta, wydana i pozostała oraz koszt magazynowy.",[42,817,818],{},"Wymiary i masa (długość, szerokość, wysokość).",[42,820,821],{},"Kod kreskowy (używany w wersji na skanery).",[42,823,824],{},"Opis i wewnętrzna notatka, na przykład o defekcie.",[42,826,827],{},"W rogu informacja, kto i kiedy dodał część.",[16,829,830],{},[25,831],{"alt":832,"height":780,"src":833,"width":30},"Szczegóły produktu ze zdjęciami, które można przestawiać, obracać i przycinać. Poprawki od razu trafiają na marketplace'y.","\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fczesc-zdjecia.webp",[16,835,836],{},"Z prawej strony siedzą zakładki.",[72,838,839,845,851,857],{},[42,840,841,844],{},[45,842,843],{},"Zdjęcia",", wszystkie fotki części. Można zmienić kolejność, przyciąć, obrócić i usunąć.",[42,846,847,850],{},[45,848,849],{},"Pasuje do",", dopasowanie do modeli aut. Im więcej dopasowań, tym lepsza wyszukiwalność.",[42,852,853,856],{},[45,854,855],{},"Numery",", inne numery tej samej części (kilka identycznych części potrafi mieć różne numery).",[42,858,859,862],{},[45,860,861],{},"Historia",", pełna oś czasu części, czyli dodanie, zdjęcia, odłożenie, sprzedaż, podniesienie z magazynu i spakowanie.",[16,864,865],{},[25,866],{"alt":867,"height":780,"src":868,"width":30},"Zakładka dopasowań: auto dawcy oraz wszystkie modele, do których część pasuje, dobierane z bazy ponad 70 000 pojazdów.","\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fczesc-dopasowanie.webp",[16,870,871],{},"Po zapisaniu zmiany (zdjęcia, opisy i parametry) od razu lecą na oferty na marketplace'ach.",[366,873,632],{"id":631},[16,875,876],{},"W firmie jest kilka magazynów. Dzięki tej zakładce można sprawdzić, co znajduje się na danej półce.",[366,878,880],{"id":879},"inwentaryzacja","Inwentaryzacja",[16,882,883],{},"Zwykła inwentaryzacja. Można sprawdzić, które lokalizacje zostały już przeliczone i z jakim wynikiem, czyli ile części wyszło na plus, a ile na minus.",[11,885,887],{"id":886},"dodawanie","Dodawanie",[16,889,890],{},"Dodawanie powstało jeszcze przed Stacją, jako osobne narzędzie do starego programu, a potem weszło do Stacji 2.0. Tutaj pracuje agent AI, którego zbudowałem według tego samego wzorca, co agentów dla klientów. LLM jest mózgiem, agent dostaje narzędzia, czyli dostęp do naszej bazy, scraping i porównanie cen, i sam decyduje, czego użyć, żeby uzupełnić pola wymagane do dodania części.",[16,892,893],{},[25,894],{"alt":895,"height":780,"src":896,"width":30},"Dodawanie części: agent AI uzupełnia numery zamienne, nazwę i dopasowania, a następnie sugeruje cenę.","\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fdodawanie-pakiet.webp",[16,898,899,900,903],{},"Pracownikowi wystarczy numer ",[403,901,902],{},"OE"," odczytany z części. Po kliknięciu ikonki żarówki agent rusza po kolei.",[39,905,906,912,918,927],{},[42,907,908,911],{},[45,909,910],{},"Sprawdza bazę."," Jeśli część już była na magazynie, uzupełnia znane pola.",[42,913,914,917],{},[45,915,916],{},"Odpala scraping."," Szuka nazwy, numerów zamiennych, dopasowań do pojazdów i cen na wielu stronach naraz.",[42,919,920,240,923,926],{},[45,921,922],{},"Porządkuje dane przez LLM.",[403,924,925],{},"DeepSeek"," mapuje pobrane nazwy na nasz słownik, a z bazy ponad 70 000 pojazdów wybiera tylko pasujące modele. Najpierw zawężam markę, żeby nie przekroczyć kontekstu modelu.",[42,928,929,932],{},[45,930,931],{},"Analizuje ceny."," Na podstawie cen ze scrapingu proponuje własną, a po dodaniu części od razu drukuje etykietę z kodem kreskowym.",[16,934,935],{},"Paru rzeczy agent nie zrobi za pracownika. Wymiary części trzeba zmierzyć i wpisać ręcznie, bo nie ma ich w żadnym źródle, a dalej potrzebuje ich pakowacz. Opis skleja się z gotowych szablonów zależnie od uzupełnionych pól, ale można dopisać coś od siebie. Przyciskami do marketplace'ów pracownik szybko sprawdzi, czy cena zaproponowana przez agenta trzyma się rynku. Jeśli część była już w bazie, widać jej dotychczasową cenę. Można też skopiować wiersz, ponownie wydrukować etykietę i zaktualizować starą, nieaktualną cenę.",[112,937,938],{},[16,939,940],{},"Dzięki agentowi pięciokrotnie zwiększyłem tempo dodawania części i zdjąłem z ludzi ręczne szukanie po stronach.",[366,942,944],{"id":943},"magazyn-pakietów","Magazyn pakietów",[16,946,947,948,950,951,953],{},"Towar pochodzi z pakietów wygrywanych na licytacjach, co obsługuje osobny program (",[403,949,729],{},"). Raz dziennie Stacja zaciąga wygrane pakiety i przetwarza je, wyciągając numery ",[403,952,902],{}," i ilości. Dalej pakiet idzie ścieżką dokumentów.",[39,955,956,963,970,984],{},[42,957,958,959,962],{},"Trafia do magazynu pakietów i ",[45,960,961],{},"czeka na przyjęcie",", nieprzyjętego nie da się dodawać.",[42,964,965,966,969],{},"Przyjęcie generuje dokument ",[403,967,968],{},"PZ"," → dopiero teraz można dodawać zawartość.",[42,971,972,973,976,977,608,980,983],{},"Po dodaniu wszystkiego pracownik ",[45,974,975],{},"zamyka pakiet"," → powstają ",[403,978,979],{},"RW",[403,981,982],{},"PW",".",[42,985,986],{},"Część rusza dalej, na zdjęcia (program „fotki”) i na odłożenie (Stacja na skanery).",[11,988,990],{"id":989},"sprzedaż-i-wysyłka","Sprzedaż i wysyłka",[16,992,993,994,997],{},"W Stacji można zarządzać każdą ofertą oddzielnie i ręcznie, czyli zmieniać jej stan, ilość i cenę. Program jest też w pełni połączony z systemami OMS (wcześniej Baselinker, obecnie SellRocket). Gdy pojawi się zamówienie, Stacja automatycznie zrzuca tę część ze stanu i edytuje pozostałe oferty, tak żeby ",[45,995,996],{},"nie sprzedać tej samej części dwa razy",". Zamówienia trafiają na listę „Do zebrania” i na skanery, gdzie pracownicy kompletują je z magazynu.",[16,999,1000],{},[25,1001],{"alt":1002,"height":780,"src":1003,"width":30},"Lista „Do zebrania”: zamówienia pobierane automatycznie z systemu OMS, gotowe do kompletacji i widoczne na skanerach.","\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fdo-zebrania.webp",[366,1005,1007],{"id":1006},"pakowacz","Pakowacz",[16,1009,1010],{},"Pakowacz też powstał jeszcze przed Stacją, jako osobny program w Nuxt i Electronie, więc wpięcie go nie było problemem. Po zeskanowaniu kodu kreskowego z zamówienia rusza pakowanie.",[39,1012,1013,1016,1019,1025],{},[42,1014,1015],{},"Program podpowiada, jak ułożyć części (gdy jest ich kilka) i którego kartonu użyć, na podstawie wymiarów z dodawania.",[42,1017,1018],{},"Pracownik wpisuje wymiary gotowej paczki.",[42,1020,1021,1022,1024],{},"Pojawiają się opcje wysyłki, z cenami liczonymi przez ",[403,1023,164],{}," każdego kuriera z umową, albo jedna wymuszona w zamówieniu, albo wszystkie, z automatycznym wyborem najtańszej.",[42,1026,1027],{},"Drukuje się etykieta, a metoda dostawy ląduje w systemie OMS.",[16,1029,1030],{},[25,1031],{"alt":1032,"height":780,"src":1033,"width":30},"Pakowacz: podpowiedź kartonu na podstawie wymiarów części i automatyczny wybór najtańszej wysyłki.","\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fpakowacz.webp",[366,1035,1037],{"id":1036},"wydania","Wydania",[16,1039,1040],{},"Wszystkie wydania to sprzedaż części z datą albo jej złomowanie. Mamy je w jednym miejscu, więc widać dokładnie, co i kiedy opuściło magazyn.",[366,1042,1044],{"id":1043},"dokumenty-magazynowe","Dokumenty magazynowe",[16,1046,1047],{},"Dokumenty generują się automatycznie w trakcie pracy.",[72,1049,1050,1055,1062,1068],{},[42,1051,1052,1054],{},[403,1053,968],{},", przy przyjęciu pakietu.",[42,1056,1057,608,1059,1061],{},[403,1058,979],{},[403,1060,982],{},", przy zamknięciu pakietu.",[42,1063,1064,1067],{},[403,1065,1066],{},"WZ",", przy sprzedaży, po wygenerowaniu faktury lub paragonu.",[42,1069,1070,1071,1073],{},"Korekta ",[403,1072,1066],{},", przy zwrocie.",[11,1075,1077],{"id":1076},"raporty-i-administracja","Raporty i administracja",[16,1079,1080],{},"Są trzy różne raporty.",[72,1082,1083,1089,1095],{},[42,1084,1085,1088],{},[45,1086,1087],{},"Okresowy",", wysyłany codziennie na maila. Pokazuje sprzedaż, dodane części i zrobione zdjęcia na wykresie w czasie, z porównaniem do innych dni i podziałem na pracowników.",[42,1090,1091,1094],{},[45,1092,1093],{},"Ogólny",", wszystko od początku firmy. Wszystkie pakiety, ile z każdego się wyprzedało i czy przyniósł już zysk.",[42,1096,1097,1100],{},[45,1098,1099],{},"Wiek części",", pokazuje, jak stare są części na magazynie. Jeśli zaczyna zalegać ich za dużo, to sygnał, że czas na promocję.",[16,1102,1103],{},[25,1104],{"alt":1105,"height":780,"src":1106,"width":30},"Raport ogólny: rentowność pakietów i kluczowe metryki od początku działalności.","\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fraport-ogolny.webp",[366,1108,1110],{"id":1109},"panel-admina","Panel admina",[16,1112,1113],{},"Panel admina pokazuje, kto i o której się zalogował, ile pracuje i co robi w danym momencie. Czas jest podzielony na czynności, dzięki czemu łatwiej planować pracę.",[72,1115,1116,1121,1127,1133],{},[42,1117,1118,1120],{},[45,1119,887],{},", ile potrwa dodanie kolejnego pakietu z podobnymi częściami.",[42,1122,1123,1126],{},[45,1124,1125],{},"Pakowanie",", czy dorzucić więcej osób, żeby zdążyć z wysyłkami.",[42,1128,1129,1132],{},[45,1130,1131],{},"Odnoszenie",", kto ile odłożył.",[42,1134,1135,1137],{},[45,1136,843],{},", postęp robienia fotek.",[16,1139,1140],{},[25,1141],{"alt":1142,"height":780,"src":1143,"width":30},"Panel admina: czas pracy i status pracowników z podziałem na czynności.","\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fpanel-admina.webp",[366,1145,1147],{"id":1146},"aktualności","Aktualności",[16,1149,1150],{},"Po zalogowaniu pracownik trafia na ekran aktualności. To miejsce na posty osób, które chcą coś przekazać reszcie zespołu, czyli uwagi, ustalenia i bieżące informacje. Pod postami można dodawać komentarze i łapki, a u góry od razu widać, ile pakietów czeka jeszcze na zamknięcie.",[11,1152,1154],{"id":1153},"podsumowanie","Podsumowanie",[16,1156,1157],{},"W jednym projekcie spięło się naprawdę dużo elementów, od scrapingu, przez wywołania modeli LLM, pobieranie zamówień z systemów OMS, dokumenty magazynowe i pakowanie z doborem kuriera, aż po przeniesienie danych ze starego systemu. Najważniejsze efekty zebrałem poniżej.",[72,1159,1160,1163,1166,1171,1174],{},[42,1161,1162],{},"Legacy zastąpione jednym systemem, a sprzedaż odblokowana dzięki MVP w dwa tygodnie.",[42,1164,1165],{},"Pięciokrotnie więcej dodawanych części dzięki agentowi AI, bez ręcznego szukania po stronach.",[42,1167,1168,1169,983],{},"Tabela 22 000 części chodzi płynnie dzięki ",[403,1170,791],{},[42,1172,1173],{},"Sprzedaż w pełni zautomatyzowana, ze stanami i zamówieniami zsynchronizowanymi z OMS oraz pakowaniem z automatycznym doborem kartonu i najtańszej wysyłki.",[42,1175,1176],{},"Działa offline dzięki lokalnemu serwerowi na Electronie.",[16,1178,1179],{},"Najmocniejsza lekcja z tego projektu jest taka, że największą wartość dało nie samo postawienie systemu, tylko wpięcie AI dokładnie tam, gdzie zdejmowało z ludzi najnudniejszą i najbardziej powtarzalną pracę, i zrobienie tego tak, żeby zespół zaufał temu na produkcji.",{"title":139,"searchDepth":140,"depth":140,"links":1181},[1182,1183,1186,1191,1194,1199,1203],{"id":13,"depth":143,"text":14},{"id":708,"depth":143,"text":709,"children":1184},[1185],{"id":675,"depth":140,"text":735},{"id":753,"depth":143,"text":754,"children":1187},[1188,1189,1190],{"id":803,"depth":140,"text":804},{"id":631,"depth":140,"text":632},{"id":879,"depth":140,"text":880},{"id":886,"depth":143,"text":887,"children":1192},[1193],{"id":943,"depth":140,"text":944},{"id":989,"depth":143,"text":990,"children":1195},[1196,1197,1198],{"id":1006,"depth":140,"text":1007},{"id":1036,"depth":140,"text":1037},{"id":1043,"depth":140,"text":1044},{"id":1076,"depth":143,"text":1077,"children":1200},[1201,1202],{"id":1109,"depth":140,"text":1110},{"id":1146,"depth":140,"text":1147},{"id":1153,"depth":143,"text":1154},"\u002Fimages\u002Fprojects\u002Fstacja-erp-wms\u002Fcover.webp",[],{},1,"\u002Fprojects\u002Fpl\u002Fstacja-erp-wms","AI Engineer & Full-Stack Developer",{"title":687,"description":139},"stacja-erp-wms",[318,1213,160,319,1214,163,1215,1216,1217],"PostgreSQL","Electron","AI Agents","SellRocket","Baselinker","projects\u002Fpl\u002Fstacja-erp-wms","Program do zarządzania magazynem, sprzedażą, pakowaniem, wysyłką, dostawami i dokumentami. MVP zbudowałem w 2 tygodnie, potem doszli agenci AI od wyceny i dopasowania części oraz synchronizacja sprzedaży wielokanałowej.",[515,1221,326],"ERP \u002F WMS","IiZFylR1rcw_ipf0-ODzNuJiPLa96NHDPGmPhyOOMAM",{"id":1224,"title":741,"body":1225,"client":148,"cover":1370,"description":139,"extension":149,"featured":150,"links":1371,"meta":1372,"navigation":153,"order":1373,"path":1374,"role":1375,"seo":1376,"slug":1377,"stack":1378,"stem":1382,"summary":1383,"tags":1384,"thumb":172,"year":173,"__hash__":1388},"projects_pl\u002Fprojects\u002Fpl\u002Fstacja-mobilna.md",{"type":8,"value":1226,"toc":1361},[1227,1229,1232,1246,1249,1254,1258,1261,1273,1276,1280,1283,1290,1295,1299,1302,1314,1316,1319,1331,1335,1338,1345,1347],[11,1228,14],{"id":13},[16,1230,1231],{},"Stacja na skanery to wersja Stacji przygotowana pod skanery magazynowe, czyli telefony z wbudowanym czytnikiem kodów. Interfejs jest dotykowy. Klawiatura chowa się i da się ją zablokować, bo potrzebujesz jej tylko przy logowaniu. Do wszystkich programów w ekosystemie Stacji logujesz się tym samym kontem.",[16,1233,1234,240,1241],{},[25,1235],{"alt":1236,"className":1237,"height":1238,"src":1239,"width":1240},"Ekran logowania, wspólne konto dla całego ekosystemu Stacji.",[579],1682,"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Flogin.webp",768,[25,1242],{"alt":1243,"className":1244,"height":1238,"src":1245,"width":1240},"Ekran główny: kafelki z opcjami magazynowymi.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Fglowna.webp",[16,1247,1248],{},"Po zalogowaniu widzisz kafelki ze wszystkimi opcjami, czyli sprawdzanie części, zbieranie, odkładanie, inwentaryzację, gdzie odłożyć, informacje o półce i lokalizacje palet. Przycisk w lewym dolnym rogu blokuje klawiaturę, więc zamiast cokolwiek wpisywać, skanujesz kod z części albo z lokalizacji.",[112,1250,1251],{},[16,1252,1253],{},"Klawiatura wyskakuje tylko przy logowaniu. Cała reszta to dotyk i skan, bo na skanerze liczy się jedna ręka i tempo.",[11,1255,1257],{"id":1256},"sprawdzanie-części","Sprawdzanie części",[16,1259,1260],{},"Skanujesz kod kreskowy z etykiety naklejonej na część, tej drukowanej przy dodaniu. Od razu widzisz dane: numer EI, zdjęcia, cenę, dostępną ilość, lokalizacje i numer OE.",[16,1262,1263,240,1268],{},[25,1264],{"alt":1265,"className":1266,"height":1238,"src":1267,"width":1240},"Sprawdzanie części po zeskanowaniu etykiety: numer EI, zdjęcia, cena, ilość, lokalizacje i numer OE.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Fsprawdz-czesc.webp",[25,1269],{"alt":1270,"className":1271,"height":1238,"src":1272,"width":1240},"Zakładki części: te same części o tym samym numerze oraz pełna historia części.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Fsprawdz-czesc-2.webp",[16,1274,1275],{},"Zakładki dają jeszcze dwie rzeczy. „Te same części\" pokazują sztuki o tym samym numerze, więc gdy z jedną jest coś nie tak, bierzesz inną. Historia części prowadzi przez całą jej drogę: dodanie, odłożenie, wystawienie i sprzedaż.",[11,1277,1279],{"id":1278},"zbieranie","Zbieranie",[16,1281,1282],{},"W „Do zebrania\" lądują produkty, które ktoś kupił i które Stacja zrzuciła ze stanu. To to samo zbieranie co w Stacji. Widzisz nazwę części, jej id, ile sztuk przynieść z magazynu i lokalizację. Zebranie potwierdzasz, skanując id części.",[16,1284,1285],{},[25,1286],{"alt":1287,"className":1288,"height":1238,"src":1289,"width":1240},"Lista „Do zebrania”: nazwa, id, ilość i lokalizacja, ułożone po trasie magazynu.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Fdo-zebrania.webp",[112,1291,1292],{},[16,1293,1294],{},"Lista układa się w kolejności, w jakiej pracownik chodzi po magazynie, więc zbiera całe zamówienie po drodze, zamiast krążyć kilka razy.",[11,1296,1298],{"id":1297},"odkładanie-i-gdzie-odłożyć","Odkładanie i gdzie odłożyć",[16,1300,1301],{},"Przy odkładaniu skanujesz kod lokalizacji, a potem kod części, którą tam kładziesz. „Gdzie odłożyć\" działa odwrotnie: skanujesz część i widzisz, gdzie leżą już sztuki o tym samym numerze OE i tej samej nazwie. Dzięki temu trzymasz porządek i odkładasz podobne w jedno miejsce.",[16,1303,1304,240,1309],{},[25,1305],{"alt":1306,"className":1307,"height":1238,"src":1308,"width":1240},"Odkładanie: skan lokalizacji, a po nim skan części.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Fodkladanie.webp",[25,1310],{"alt":1311,"className":1312,"height":1238,"src":1313,"width":1240},"Gdzie odłożyć: po zeskanowaniu części widać, gdzie leżą już takie same.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Fgdzie-odlozyc.webp",[11,1315,880],{"id":879},[16,1317,1318],{},"Tworzysz inwentaryzację i skanujesz części, żeby sprawdzić, co powinno być w danej lokalizacji. Skanowanie kolejnych sztuk czyści listę. Po wybraniu lokalizacji widzisz każdą część do zeskanowania, a przy kilku sztukach licznik pokazuje, ile już zeskanowano.",[16,1320,1321,240,1326],{},[25,1322],{"alt":1323,"className":1324,"height":1238,"src":1325,"width":1240},"Inwentaryzacja: tworzenie spisu i skanowanie części w lokalizacji.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Finwentaryzacja.webp",[25,1327],{"alt":1328,"className":1329,"height":1238,"src":1330,"width":1240},"Wybrana lokalizacja: lista części do zeskanowania z licznikiem sztuk.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Finwentaryzacja-2.webp",[11,1332,1334],{"id":1333},"informacje-o-półce","Informacje o półce",[16,1336,1337],{},"Skanujesz półkę i widzisz dokładnie, co się na niej znajduje.",[16,1339,1340],{},[25,1341],{"alt":1342,"className":1343,"height":1238,"src":1344,"width":1240},"Informacje o półce: pełna zawartość po zeskanowaniu kodu półki.",[579],"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Finfo-o-polce.webp",[11,1346,120],{"id":119},[72,1348,1349,1352,1355,1358],{},[42,1350,1351],{},"Cały obieg magazynu na skanerze: sprawdzanie, zbieranie, odkładanie, inwentaryzacja i podgląd półki w jednej aplikacji.",[42,1353,1354],{},"Praca jedną ręką: klawiatura tylko do logowania, reszta to dotyk i skan kodu.",[42,1356,1357],{},"Zbieranie ułożone po trasie magazynu, więc pracownik nie nawraca po tych samych alejkach.",[42,1359,1360],{},"Spięte ze Stacją tym samym kontem i tymi samymi danymi, łącznie z zamówieniami z systemów OMS.",{"title":139,"searchDepth":140,"depth":140,"links":1362},[1363,1364,1365,1366,1367,1368,1369],{"id":13,"depth":143,"text":14},{"id":1256,"depth":143,"text":1257},{"id":1278,"depth":143,"text":1279},{"id":1297,"depth":143,"text":1298},{"id":879,"depth":143,"text":880},{"id":1333,"depth":143,"text":1334},{"id":119,"depth":143,"text":120},"\u002Fimages\u002Fprojects\u002Fstacja-mobilna\u002Fcover.webp",[],{},6,"\u002Fprojects\u002Fpl\u002Fstacja-mobilna","Full-Stack Engineer",{"title":741,"description":139},"stacja-mobilna",[318,1379,1380,1381],"Vue","PWA","Barcode scanning","projects\u002Fpl\u002Fstacja-mobilna","Wersja Stacji na skanery magazynowe, czyli telefony z wbudowanym czytnikiem kodów. Cały obieg magazynu w jednej aplikacji, od sprawdzania części, przez zbieranie po trasie magazynu i odkładanie, po inwentaryzację i podgląd półki. Klawiatura tylko przy logowaniu, reszta to dotyk i skan.",[1385,1386,1387],"Mobile","WMS","UX","YFUL_YqVjRuw4BwCifr-7V7hSsb6haR7vcsKloN2l_U",1783967625582]