====== Postup nastavení importu Excel souboru z CAD (Tos Svitavy) ======= ====== Nastavení přepínačů ====== Administrace > Nástroje administrátora > Objekty systému > Řízené objekty\\ Vyhledat KonstrKusImport\\ Záložka Přepínače\\ Vyhledat přepínač KonstrKusImportSchvalTransformuj\\ Záložka Firemní\\ Založit\\ Vybrat z poptextu **Schválení a transformace**\\ Uložit\\ {{:orfertopen:lp:konstrkusimport:cfiremninastavenischvaleni.png?800|Nastavení přepínače schválení}}\\ Podobně přepínač varianta\\ Vyhledat přepínač KonstrKusImportVarianta\\ Záložka Firemní\\ Založit\\ Zapsat **TosSy**\\ Uložit\\ ====== Nastavení parametrů příchozích souborů ====== == Založit agendu AXA == Administrace > MSK - Webové služby > Agendy komunikace\\ Agenda - TOSCAD\\ Cílový systém - OR-SYSTEM\\ Odkaz na úlohu - 58 CSTANDKUS_IMPORT (předpokládá se, že bude řešena logika třídou cz.orcz.mskws.CStandKusImport)\\ {{:orfertopen:lp:konstrkusimport:axatoscad.png?400|Správa agend AXA}} == Založit parametr příchozích souborů Fmp == Administrace > MSK - Webové služby > Příchozí/odchozí soubory > Parametry příchozích/odchozích souborů \\ Vstup/Výstup - Import s podporou Groovy do OR-SYSTEM Open (vybrat z poptextu - hodnotu "w"\\ Adresář pro uložení - libovolný např import-g - založit na serveru relativně k datovému adresáři, tedy např. /dlf1/oropen/cvicna/import-g\\ Adresář protokolu - libovolný např import-g/protokoly - založit podobně jako předchozí bod na serveru\\ {{:orfertopen:lp:konstrkusimport:fmp.png?400|Parametry příchozích souborů}} == Založit agendu souborů Fma == Administrace > MSK - Webové služby > Příchozí/odchozí soubory > Agendy souborů \\ Vstupní/Výstupní - vybrat parametr z předchozího kroku - Import s podporou Groovy maker do OR-SYSTEM Open\\ Priorita - okamžitá\\ Jméno adresáře příchozího -URL cesta /dlf1/importopen/cvicna/windchill (Obvykle se jedná o adresář z NAS serveru připojený k aplikačnímu serveru)\\ Jméno souboru příchozího: *.xlsx\\ Agenda TOSCAD\\ {{:orfertopen:lp:konstrkusimport:fmatoscad.png?400|Správa agend příchozích souborů}} ====== Zařazení úlohy importu do menu ====== Nalistovat menu, kde budeme chtít úlohu zařadit\\ např.\\ TPV > Správa konstrukčních kusovníků\\ Pravý klik na menu > Úprava menu pro všechny.\\ Program - cz.orcz.gui.Orfert\\ Parametry - method:posliZpravuObjektu object:cz.orcz.mskws.ws.AutoImport parameter:TOSCAD\\ {{:orfertopen:lp:konstrkusimport:orferttoscad.png?400|Vytvoření úlohy}} ====== Nastavení konverzní tabulky ====== Pomocí konverzní tabulky lze naplnit atributy entit CPolozka(ts) a CPolozkaRozmer(tsr).\\ Lze nastavit způsob jaký se konvertují atributy konstrukčního kusovníku do výše uvedených entit.\\ A to z hlavičky [[orfertopen:lp:ckonstrkushlav|CKonstrKusHlav]], tak řádků [[orfertopen:lp:ckonstrkuskomp|CKonstrKusKomp]]\\ Konverzní tabulku je možné založit **ručně**.\\ A to pro tyto entity:\\ * **TosSyTsKonstrKusHlavImp** \\ plnění Ts hlavičky kusovníku \\ tsZn = nazev \\ tsCh = chK (rozlišení na 25, 31 se určuje v Groovy) \\ * **TosSyTsrKonstrKusHlavImp** \\ plnění Tsr hlavičky kusovníku * **TosSyTsKonstrKusKompImp** \\ plnění Ts komponenty kusovníku \\ tsZn = nazev \\ tsCh = chK (rozlišení na 25, 31 se určuje v Groovy) \\ * **TosSyTsrKonstrKusKompImp** \\ plnění Tsr komponenty kusovníku * **TosSyStKonstrKusKompImp** \\ plnění St komponenty kusovníku \\ stSklad = atrAn09 konkrétně se plní hodnotou 300 v případě, když jena vstupu mezera value==""?"300":value \\ {{ :orfertopen:lp:konstrkusimport:wkr-sklad.png?nolink&600 |konverze pole sklad}} V řádcích se tedy nastavuje plnění konstant nebo plnění z Importovaných podkladů přímo nebo s konverzí groovy skriptem (viz nápověda k položkám Wkr)\\ Existuje také varianta **naimportování** předpřipraveného souboru.\\ Administrace > MSK - Webové služby > Konverzní tabulka\\ Další nabídka > Import záznamů.\\ Vybrat export_wkh_TosSy.json \\ Popřípadě založit ručně: == Založit hlavičku konverzní tabulky Wkh == Zapsat postupně 5 entit výše uvedených.\\ Příklad pro vyplnění názvu tsZn z atributu nazev konstrukčního kusovníku.\\ Název tabulky v OR vybrat z poptextu - **Ts**\\ Název atributu v OR např. **tsZn**\\ Název atributu v konstrukčním kusovníku - **nazev**\\ {{:orfertopen:lp:konstrkusimport:wkhtossytskonstrkuskompimp.png?800|}} Příklad pro vyplnění konstanty "J" do tsStJn\\ Název tabulky v OR vybrat z poptextu - **Ts**\\ Název atributu v OR např. **tsStJn**\\ Název atributu v konstrukčním kusovníku - ponechat prázdný\\ Značka **K** jako konstanta\\ Konstanta **J**\\ Obecně je potřeba prověřit plnění měrné jednotky, a doplnit konstanty dle analýzy vstupního excel souboru.\\ ====== Vytvoření Groovy makra ====== Makro provádí konverzi XLSX souboru do [[orfertopen:lp:ckonstrkushlavimp|Importovaných podkladů konstrukčního kusovníku]]. == Založit makro == Administrace > Nástroje administrátora > Správa vlastních zdrojů aplikace > Groovy makra \\ Druh: Skupinové\\ Kód TOSCAD (dle agendy)\\ Název TOSCAD (dle agendy)\\ Třída definice cz.ortex.common.o0.mailTemplateTypes.GroovyType\\ Předmět Import kusovníku TosCad\\ {{:orfertopen:lp:konstrkusimport:o0tasktoscad.png?400|Makro TOSCAD}} záložka "Programování"\\ (Groovy makrem je možné modifikovat funkčnost importu)\\ ====== Další nastavení ====== V plánovači úloh nakonfigurovat login, který spouští úlohy\\ V konfiguraci cest nastavit proměnnou protokoly ====== Testování importu TOSCAD ====== Nakopírovat cvičné xlsx soubory do adresáře dle Fmp.\\ Např. /dlf1/importopen/cvicna/toscad/6018980B.xlsx\\ V naplánovaných úlohách přes pravý klik provést spuštění. Výsledek se zobrazí v záložce historie, popřípadě vyběhne chyba na popředí.\\ {{:orfertopen:lp:konstrkusimport:o0tasktoscadrun.png?800|}} Princip importu spočívá v procházení adresáře importu. Pro každý XLSX soubor se vygeneruje úloha do fronty Axz. ====== Makro TOSCAD (varianta prvního vzorku do 1.11.2023) ====== import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonProperty; import cz.orcz.mskws.ws.KonstrKusImport; import cz.orcz.orfmodel.Axz; import cz.orcz.orfmodel.CKonstrKusHlavWsImp; import cz.orcz.orfmodel.CKonstrKusKompImp; import cz.orcz.orfmodel.CPolozka; import cz.ortex.impldao.o0.admin.O0logDaoImpl; import cz.ortex.impllogic.o0.task.O0taskDemonUtil; import cz.ortex.impllogic.o0.task.OxSpustDavTaskRun; import cz.ortex.implutil.o0.O0CfgSrv; import cz.ortex.implutil.o0.O0CfgSrvPar; import cz.ortex.util.o0.O0Session; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.JOptionPane; import javax.xml.bind.*; import javax.xml.bind.annotation.*; import javax.xml.transform.stream.StreamSource; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import static cz.ortex.implutil.o0.HibernateUtil.getSessionFactory; protected static void autoImport(String urlCesta, O0Session o0Session,Axz axz) { CKonstrKusKompImp lastKusKompImp; int lastLevel; // Create a Random object Random random = new Random(); // Generate a random integer between 0 (inclusive) and an upper bound (exclusive) int randomInt = random.nextInt(100); // Change 100 to your desired upper bound if (axz == null){ axz = new Axz(); axz.setAxzId=randomInt; } try { //Adresář protokolu obecný String adrProtokol = O0CfgSrv.get(O0CfgSrvPar.ADR_PROTOKOLY); // Zadejte cestu k souboru, kam chcete přesměrovat výstup String soubor = adrProtokol + "axz_"+axz.axzId+".log"; axz.axzHlaseni = soubor; // Vytvořte nový výstupní proud pro soubor FileOutputStream fileOutputStream = new FileOutputStream(soubor); // Vytvořte PrintStream pro nový výstupní proud PrintStream printStream = new PrintStream(fileOutputStream); // Uložte stávající System.out do záložního PrintStreamu PrintStream systemOutBackup = System.out; // Nastavte nový PrintStream jako System.out System.setOut(printStream); // Nyní vše, co je vypsáno na System.out, bude přesměrováno do souboru List kusHlavImpList = new ArrayList<>(); try { // Otevřete Excel soubor FileInputStream excelFile = new FileInputStream(new File(urlCesta)); Workbook workbook = new XSSFWorkbook(excelFile); int poziceG = 0; // Získání prvního listu Sheet sheet = workbook.getSheetAt(0); // Iterujte přes řádky a sloupce a převeďte je na JSON Iterator rowIterator = sheet.iterator(); ObjectMapper objectMapper = new ObjectMapper(); // Vytvoření seznamu CKonstrKusHlavWsImp objektů // Mapa pro uchování předchozích úrovní Map previousLevels = new HashMap<>(); String autor = o0Session.getLoginName(); Session s2 = getSessionFactory().getCurrentSession();//udelam novou //prvni radek nadpis Row row = rowIterator.next(); while (rowIterator.hasNext()) { row = rowIterator.next(); // Převeďte řádek na objekt (můžete vytvořit vlastní třídu pro reprezentaci dat) // Příklad: MyClass data = new MyClass(row.getCell(0).toString(), row.getCell(1).getNumericCellValue()); //CKonstrKusHlavWsImp data = new CKonstrKusHlavWsImp(); // Root data = new Root(row.getCell(0).toString(), row.getCell(1).getNumericCellValue()); if (row.getCell(0) == null) { break; } Root data = new Root( row.getCell(0).toString(), row.getCell(1).toString(), row.getCell(2).toString(), "E"+row.getCell(3).toString(), String.valueOf(row.getCell(4).getNumericCellValue()), row.getCell(5).toString(), row.getCell(6).toString(), row.getCell(7).toString(), row.getCell(8).toString(), row.getCell(9).toString(), row.getCell(10).toString(), row.getCell(11).toString(), row.getCell(12).toString(), row.getCell(13).toString(), row.getCell(14).toString(), row.getCell(15).toString(), row.getCell(16).toString(), row.getCell(17).toString(), row.getCell(18).toString(), row.getCell(19).toString(), row.getCell(20).toString(), row.getCell(21).toString() ); // Převeďte objekt na JSON String json = objectMapper.writeValueAsString(data); //System.out.println(json); int lastDotIndex = data.pozice.lastIndexOf("."); String atrAn08; if (lastDotIndex != -1) { atrAn08 = data.pozice.substring(lastDotIndex + 1); } else { atrAn08 = data.pozice; } int level = data.pozice.replaceAll("\\.","").length(); int level2 = data.pozice.length(); //System.out.println("level2 je " + level2 + " " + data.nazev); if ("0.0".equals(data.pozice)) { level = 0; //JOptionPane.showMessageDialog(null, "level 0"); CKonstrKusHlavWsImp kusHlavImp = new CKonstrKusHlavWsImp(); kusHlavImp.setIdentPol(data.cislovykresu); kusHlavImp.setIdCSyst(String.valueOf(level)); kusHlavImp.setVykres(data.cislovykresu); kusHlavImp.setNazev(data.nazev); kusHlavImp.setStatus((short) 200); kusHlavImp.setEdat(new Date()); kusHlavImp.setEname(autor); kusHlavImp.setRevize("00"); CPolozka cPolozka=s2.get(CPolozka.class,kusHlavImp.getIdentPol()); if (cPolozka != null){ kusHlavImp.setTypPol(cPolozka.getBs()); } else { kusHlavImp.setTypPol((short) 0); } kusHlavImpList.add(kusHlavImp); // Přidání CKonstrKusHlavWsImp do mapy předchozích úrovní previousLevels.put(level, kusHlavImp); } else { CKonstrKusHlavWsImp parentHlavImp = previousLevels.get(level - 1); if (parentHlavImp == null) { CKonstrKusHlavWsImp kusHlavImp = new CKonstrKusHlavWsImp(); kusHlavImp.setIdentPol(lastKusKompImp.getIdentPol()); kusHlavImp.setVykres(lastKusKompImp.getIdentPol()); kusHlavImp.setNazev(lastKusKompImp.getNazev()); kusHlavImp.setAtrAn08("10"); previousLevels.put(level - 1, kusHlavImp); kusHlavImp.setIdCSyst(String.valueOf(level - 1)); kusHlavImpList.add(kusHlavImp); kusHlavImp.setStatus((short) 200); kusHlavImp.setEdat(new Date()); kusHlavImp.setEname(autor); kusHlavImp.setRevize("00"); CPolozka cPolozka=s2.get(CPolozka.class,kusHlavImp.getIdentPol()); if (cPolozka != null){ kusHlavImp.setTypPol(cPolozka.getBs()); } else { kusHlavImp.setTypPol((short) 0); } parentHlavImp = previousLevels.get(level - 1); } if (parentHlavImp != null) { CKonstrKusKompImp kusKompImp = new CKonstrKusKompImp(); kusKompImp.setIdentPol(data.cislovykresu); kusKompImp.setIdCSyst(String.valueOf(level)); kusKompImp.setMnoz(new BigDecimal(data.kusy)); kusKompImp.setcKonstrKusHlavImp(parentHlavImp); kusKompImp.setVykres(data.cislovykresu); kusKompImp.setNazev(data.nazev); //System.out.println("an08 "+data.pozice + " " + atrAn08); parentHlavImp.getcKonstrKusKompImps().add(kusKompImp); if (lastLevel > level){ previousLevels.remove(level); } //kusKompImp.setAtrAn08(atrAn08); //poziceG=poziceG+10; kusKompImp.setAtrAn08(parentHlavImp.getAtrAn08()); try { parentHlavImp.setAtrAn08(String.valueOf(Integer.valueOf(parentHlavImp.getAtrAn08())+10)); } catch (Exception e) { parentHlavImp.setAtrAn08("20"); kusKompImp.setAtrAn08("10"); } System.out.println(kusKompImp.identPol + " "+kusKompImp.atrAn08); kusKompImp.setRevize("00"); CPolozka cPolozka=s2.get(CPolozka.class,kusKompImp.getIdentPol()); if (cPolozka != null){ kusKompImp.setTypPol(cPolozka.getBs()); } else { kusKompImp.setTypPol((short) 0); } kusKompImp.setEdat(new Date()); kusKompImp.setEname(autor); lastKusKompImp=kusKompImp; lastLevel=level; // dogeneruji material dle bez1 if (data.material > " "){ Criteria c = s2.createCriteria(CPolozka.class); c.add(Restrictions.eq("bez1", data.material)); c.setMaxResults(1); CPolozka material = (CPolozka) c.uniqueResult(); if (material == null){ material = new CPolozka(); material.setIna("nenalezeno "+data.material); material.setZn(" "); } CKonstrKusHlavWsImp kusHlavImpM = new CKonstrKusHlavWsImp(); kusHlavImpM.setIdentPol(kusKompImp.getIdentPol()); kusHlavImpM.setVykres(kusKompImp.getVykres()); kusHlavImpM.setNazev(kusKompImp.getNazev()); kusHlavImpM.setIdCSyst(kusKompImp.getIdCSyst()); kusHlavImpM.setStatus((short) 200); kusHlavImpM.setEdat(new Date()); kusHlavImpM.setEname(autor); kusHlavImpM.setRevize("00"); //plati stale pro cPolozka if (cPolozka != null){ kusHlavImpM.setTypPol(cPolozka.getBs()); } else { kusHlavImpM.setTypPol((short) 0); } CKonstrKusKompImp kusKompImpM = new CKonstrKusKompImp(); kusKompImpM.setIdentPol(material.getIna()); kusKompImpM.setIdCSyst(String.valueOf(level + 1)); kusKompImpM.setMnoz(new BigDecimal(data.hmotnostKg)); kusKompImpM.setTypPol((short)1); kusKompImpM.setcKonstrKusHlavImp(kusHlavImpM); kusKompImpM.setVykres(material.getIna()); kusKompImpM.setNazev(material.getZn()); kusHlavImpM.getcKonstrKusKompImps().add(kusKompImpM); kusHlavImpList.add(kusHlavImpM); } } else { } } } // Uzavřete Excel soubor excelFile.close(); } catch (IOException e) { e.printStackTrace(); } // Výpis naimportovaných dat for (CKonstrKusHlavWsImp kusHlavImp : kusHlavImpList) { System.out.println("CKonstrKusHlavWsImp: identPol=" + kusHlavImp.getIdentPol() + "level "+kusHlavImp.getIdCSyst()); for (CKonstrKusKompImp kusKompImp : kusHlavImp.getcKonstrKusKompImps()) { System.out.println(" CKonstrKusKompImp: identPol=" + kusKompImp.getIdentPol() + ", mnozstvi=" + kusKompImp.getMnoz()); } //JOptionPane.showMessageDialog(null, "CKonstrKusHlavWsImp: identPol=" + kusHlavImp.getIdentPol() + "level "+kusHlavImp.getIdCSyst()); Session s = getSessionFactory().openSession();//udelam novou Transaction tx = s.getTransaction(); tx.begin(); s.save(kusHlavImp); s.update(axz); tx.commit(); KonstrKusImport i = new KonstrKusImport(o0Session); i.transformuj(kusHlavImp); } // Obnovte původní System.out System.setOut(systemOutBackup); // Zavřete souborový výstup printStream.close(); String obsahLogu = new String(Files.readAllBytes(Paths.get(axz.axzHlaseni))); O0logDaoImpl o0logDaoImpl; o0logDaoImpl = new O0logDaoImpl(); o0logDaoImpl.setOrsoftSession(o0Session); Character v='V'; Character g='G'; try { o0logDaoImpl.zapisLog("WINDCHILL axz:"+axz.axzId, obsahLogu, null, null, null, null, null, null, null, v,g); } catch (Exception e){ //JOptionPane.showMessageDialog(null, e.getMessage()); System.out.println(" vyjimka " + e.getMessage()); } try { if (O0taskDemonUtil.getOrsoftSessionRun() != null) { OxSpustDavTaskRun.zapisVysledek(obsahLogu); } } catch (Exception e){ //JOptionPane.showMessageDialog(null, e.getMessage()); System.out.println(" vyjimka " + e.getMessage()); } } catch (JAXBException e) { e.printStackTrace(); } } public class Root { @JsonProperty("Pozice") public String pozice; @JsonProperty("Kusy") public String kusy; @JsonProperty("Nazev") public String nazev; @JsonProperty("Cislovykresu") public String cislovykresu; @JsonProperty("Hmotnost(kg)") public String hmotnostKg; @JsonProperty("Vyroba") public String vyroba; @JsonProperty("Polotovar") public String polotovar; @JsonProperty("Material") public String material; @JsonProperty("Delkapolotovaru(mm)") public String delkapolotovaruMm; @JsonProperty("Vazbanaoperaci") public String vazbanaoperaci; @JsonProperty("Cenakalkul./nakup") public String cenakalkuNakup; @JsonProperty("Ch.k.") public String chK; @JsonProperty("MJ") public String mJ; @JsonProperty("Druhmat.prokalkulaci") public String druhmatProkalkulaci; @JsonProperty("Ucet") public String ucet; @JsonProperty("Dozakazky") public String dozakazky; @JsonProperty("Kalkulace") public String kalkulace; @JsonProperty("Propocetpotreby") public String propocetpotreby; @JsonProperty("Odpiszeskladu") public String odpiszeskladu; @JsonProperty("Sklad") public String sklad; @JsonProperty("Autor") public String autor; @JsonProperty("Datumporizeni") public String datumporizeni; public Root(String pozice, String kusy, String nazev, String cislovykresu, String hmotnostKg, String vyroba, String polotovar, String material, String delkapolotovaruMm, String vazbanaoperaci, String cenakalkuNakup, String chK, String mJ, String druhmatProkalkulaci, String ucet, String dozakazky, String kalkulace, String propocetpotreby, String odpiszeskladu, String sklad, String autor, String datumporizeni) { this.pozice = pozice; this.kusy = kusy; this.nazev = nazev; this.cislovykresu = cislovykresu; this.hmotnostKg = hmotnostKg; this.vyroba = vyroba; this.polotovar = polotovar; this.material = material; this.delkapolotovaruMm = delkapolotovaruMm; this.vazbanaoperaci = vazbanaoperaci; this.cenakalkuNakup = cenakalkuNakup; this.chK = chK; this.mJ = mJ; this.druhmatProkalkulaci = druhmatProkalkulaci; this.ucet = ucet; this.dozakazky = dozakazky; this.kalkulace = kalkulace; this.propocetpotreby = propocetpotreby; this.odpiszeskladu = odpiszeskladu; this.sklad = sklad; this.autor = autor; this.datumporizeni = datumporizeni; } } ====== Makro TOSCAD (varianta 4.12.2023) ====== /* komentář z Excelu Sloupce B - K = vždy importovat hodnotu, která je uvedena. Sloupec A Pozice = Struktura kusovníku (při zakládání pozic číslovat po 10-ti, tj. 10, 20, 30, …) Sloupec F Výroba - v = vyráběná položka, mezera = nakupovaní položka Sloupec G Polotovar do TS003 tj. TS-BEZ1 atrAn01 Sloupec H Materiál do TS004 tj. TS-BEZ2 atrAn02 Sloupec I Délka polotovaru - pouze informativní údaj = nyní neimportovat Sloupec J Tloušťka plechu do TS072 tj. TS-VOL tsVol atrAn03 Sloupec K Výpal do TS154 tj. TS-E-BA tsEBa atrAn04 Sloupce L -> = pokud je prázdné, vždy při importu doplnit uvedenou hodnotu níže. Sloupec L Pokud je prázdné, tak při zakládání nové položky do TS = Vyráběná položka = 25, Nakupovaná položka = 31, Do budoucna bude vyplněno přímo v EXCELu. TS007 tj. TS-CH atrAn05 Sloupec M Pokud je prázdné, tak při zakládání nové položky do TS = Měrná jednotka vždy KS TS-ME atrAn06 Sloupec N Vždy J Sloupec O Vždy J Sloupec P Vždy J Sloupec Q Pokud je prázdné, tak Vyráběná položka = vždy J, Nakupovaná položka = vždy a Sloupec R Pokud je prázdné, tak Vyráběná položka = vždy 310, Nakupoaná 220 Sloupec S Aktuální datum Sloupec T Přihlášený uživatel Sloupec U Aktuální datum */ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonProperty; import cz.orcz.mskws.ws.KonstrKusImport; import cz.orcz.orfmodel.Axz; import cz.orcz.orfmodel.CKonstrKusHlavWsImp; import cz.orcz.orfmodel.CKonstrKusKompImp; import cz.orcz.orfmodel.CPolozka; import cz.ortex.impldao.o0.admin.O0logDaoImpl; import cz.ortex.impllogic.o0.task.O0taskDemonUtil; import cz.ortex.impllogic.o0.task.OxSpustDavTaskRun; import cz.ortex.implutil.o0.O0CfgSrv; import cz.ortex.implutil.o0.O0CfgSrvPar; import cz.ortex.util.o0.O0Session; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.JOptionPane; import javax.xml.bind.*; import javax.xml.bind.annotation.*; import javax.xml.transform.stream.StreamSource; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.ss.usermodel.DataFormatter; import org.hibernate.Session; import org.hibernate.Transaction; import java.util.Locale; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import static cz.ortex.implutil.o0.HibernateUtil.getSessionFactory; protected static void autoImport(String urlCesta, O0Session o0Session,Axz axz) { CKonstrKusKompImp lastKusKompImp; int lastLevel; // Create a Random object Random random = new Random(); // Generate a random integer between 0 (inclusive) and an upper bound (exclusive) int randomInt = random.nextInt(100); // Change 100 to your desired upper bound if (axz == null){ axz = new Axz(); axz.setAxzId=randomInt; } try { //Adresář protokolu obecný String adrProtokol = O0CfgSrv.get(O0CfgSrvPar.ADR_PROTOKOLY); // Zadejte cestu k souboru, kam chcete přesměrovat výstup String soubor = adrProtokol + "axz_"+axz.axzId+".log"; axz.axzHlaseni = soubor; // Vytvořte nový výstupní proud pro soubor FileOutputStream fileOutputStream = new FileOutputStream(soubor); // Vytvořte PrintStream pro nový výstupní proud PrintStream printStream = new PrintStream(fileOutputStream); // Uložte stávající System.out do záložního PrintStreamu PrintStream systemOutBackup = System.out; // Nastavte nový PrintStream jako System.out System.setOut(printStream); // Nyní vše, co je vypsáno na System.out, bude přesměrováno do souboru // Zadejte cestu k souboru, kam chcete přesměrovat chybový výstup String souborErr = adrProtokol + "axz_"+axz.axzId+".err"; // Vytvořte nový výstupní proud pro soubor FileOutputStream fileOutputStreamErr = new FileOutputStream(souborErr); // Vytvořte PrintStream pro nový výstupní proud PrintStream printStreamErr = new PrintStream(fileOutputStreamErr); // Uložte stávající System.err do záložního PrintStreamu PrintStream systemErrBackup = System.err; // Nastavte nový PrintStream jako System.err System.setErr(printStreamErr); // Nyní vše, co je vypsáno na System.err, bude přesměrováno do souboru List kusHlavImpList = new ArrayList<>(); try { // Otevřete Excel soubor FileInputStream excelFile = new FileInputStream(new File(urlCesta)); Workbook workbook = new XSSFWorkbook(excelFile); int poziceG = 0; // Získání prvního listu Sheet sheet = workbook.getSheetAt(0); // Iterujte přes řádky a sloupce a převeďte je na JSON Iterator rowIterator = sheet.iterator(); ObjectMapper objectMapper = new ObjectMapper(); // Vytvoření seznamu CKonstrKusHlavWsImp objektů // Mapa pro uchování předchozích úrovní Map previousLevels = new HashMap<>(); String autor = o0Session.getLoginName(); Session s2 = getSessionFactory().getCurrentSession();//udelam novou //prvni radek nadpis Row row = rowIterator.next(); while (rowIterator.hasNext()) { row = rowIterator.next(); // Převeďte řádek na objekt (můžete vytvořit vlastní třídu pro reprezentaci dat) // Příklad: MyClass data = new MyClass(row.getCell(0).toString(), row.getCell(1).getNumericCellValue()); //CKonstrKusHlavWsImp data = new CKonstrKusHlavWsImp(); // Root data = new Root(row.getCell(0).toString(), row.getCell(1).getNumericCellValue()); if (row.getCell(0) == null) { break; } DataFormatter dataFormatter = new DataFormatter(Locale.US); Root data = new Root( dataFormatter.formatCellValue(row.getCell(0)), dataFormatter.formatCellValue(row.getCell(1)), dataFormatter.formatCellValue(row.getCell(2)), dataFormatter.formatCellValue(row.getCell(3)), dataFormatter.formatCellValue(row.getCell(4)), dataFormatter.formatCellValue(row.getCell(5)), dataFormatter.formatCellValue(row.getCell(6)), dataFormatter.formatCellValue(row.getCell(7)), dataFormatter.formatCellValue(row.getCell(8)), dataFormatter.formatCellValue(row.getCell(9)), dataFormatter.formatCellValue(row.getCell(10)), dataFormatter.formatCellValue(row.getCell(11)), dataFormatter.formatCellValue(row.getCell(12)), dataFormatter.formatCellValue(row.getCell(13)), dataFormatter.formatCellValue(row.getCell(14)), dataFormatter.formatCellValue(row.getCell(15)), dataFormatter.formatCellValue(row.getCell(16)), dataFormatter.formatCellValue(row.getCell(17)), dataFormatter.formatCellValue(row.getCell(18)), dataFormatter.formatCellValue(row.getCell(19)), dataFormatter.formatCellValue(row.getCell(20)) ); // Převeďte objekt na JSON String json = objectMapper.writeValueAsString(data); //System.out.println(json); int lastDotIndex = data.pozice.lastIndexOf("."); data.chK = data.chK.equals("") ? (data.vyroba.equals("v") ? "25" : "31") : data.chK; data.sklad = data.sklad.equals("") ? (data.vyroba.equals("v") ? "310" : "220") : data.sklad; data.odpiszeskladu = data.odpiszeskladu.equals("") ? (data.vyroba.equals("v") ? "J" : "a") : data.odpiszeskladu; String atrAn08; if (lastDotIndex != -1) { atrAn08 = data.pozice.substring(lastDotIndex + 1); } else { atrAn08 = data.pozice; } //int level = data.pozice.replaceAll("\\.","").length(); //System.out.println("data.pozice je "+data.pozice); int level = countDots(data.pozice)+1; if ("0.0".equals(data.pozice) ||"0".equals(data.pozice)) { level = 0; //JOptionPane.showMessageDialog(null, "level 0"); CKonstrKusHlavWsImp kusHlavImp = new CKonstrKusHlavWsImp(); kusHlavImp.setIdentPol(data.cislovykresu); kusHlavImp.setIdCSyst(data.cislovykresu); kusHlavImp.setVykres(data.cislovykresu); kusHlavImp.setNazev(data.nazev); kusHlavImp.setStatus((short) 200); kusHlavImp.setEdat(new Date()); kusHlavImp.setEname(autor); kusHlavImp.setRevize("00"); CPolozka cPolozka=s2.get(CPolozka.class,kusHlavImp.getIdentPol()); if (cPolozka != null){ kusHlavImp.setTypPol(cPolozka.getBs()); } else { if (data.vyroba.equals("v")){ kusHlavImp.setTypPol((short) 0); } else { kusHlavImp.setTypPol((short) 1); } } kusHlavImpList.add(kusHlavImp); // Přidání CKonstrKusHlavWsImp do mapy předchozích úrovní previousLevels.put(level, kusHlavImp); } else { CKonstrKusHlavWsImp parentHlavImp = previousLevels.get(level - 1); if (parentHlavImp == null) { CKonstrKusHlavWsImp kusHlavImp = new CKonstrKusHlavWsImp(); kusHlavImp.setIdentPol(lastKusKompImp.getIdentPol()); kusHlavImp.setVykres(lastKusKompImp.getIdentPol()); kusHlavImp.setNazev(lastKusKompImp.getNazev()); previousLevels.put(level - 1, kusHlavImp); kusHlavImp.setIdCSyst(lastKusKompImp.getIdentPol()); kusHlavImpList.add(kusHlavImp); kusHlavImp.setStatus((short) 200); kusHlavImp.setEdat(new Date()); kusHlavImp.setEname(autor); kusHlavImp.setRevize("00"); kusHlavImp.setTypPol(lastKusKompImp.getTypPol()); /* CPolozka cPolozka=s2.get(CPolozka.class,kusHlavImp.getIdentPol()); if (cPolozka != null){ kusHlavImp.setTypPol(cPolozka.getBs()); } else { if (data.vyroba.equals("v")){ kusHlavImp.setTypPol((short) 0); } else { kusHlavImp.setTypPol((short) 1); } } */ parentHlavImp = previousLevels.get(level - 1); } if (parentHlavImp != null) { CKonstrKusKompImp kusKompImp = new CKonstrKusKompImp(); kusKompImp.setIdentPol(data.cislovykresu); kusKompImp.setIdCSyst(data.cislovykresu); //System.out.println("data.kusy "+data.kusy); kusKompImp.setMnoz(new BigDecimal(data.kusy)); kusKompImp.setcKonstrKusHlavImp(parentHlavImp); kusKompImp.setVykres(data.cislovykresu); kusKompImp.setNazev(data.nazev); kusKompImp.setAtrAn09(data.sklad); kusKompImp.setAtrAn01(data.polotovar); kusKompImp.setAtrAn02(data.material); kusKompImp.setAtrAn03(data.tloustkaplechu); kusKompImp.setAtrAn04(data.vypal); kusKompImp.setAtrAn05(data.chK); kusKompImp.setAtrAn06(data.mJ); kusKompImp.setAtrAn07(data.odpiszeskladu); kusKompImp.setAtrAn08(atrAn08); //System.out.println("an08 "+data.pozice + " " + atrAn08); parentHlavImp.getcKonstrKusKompImps().add(kusKompImp); if (lastLevel > level){ previousLevels.remove(level); } //kusKompImp.setAtrAn08(atrAn08); //poziceG=poziceG+10; kusKompImp.setRevize("00"); CPolozka cPolozka=s2.get(CPolozka.class,kusKompImp.getIdentPol()); if (cPolozka != null){ kusKompImp.setTypPol(cPolozka.getBs()); } else { if (data.vyroba.equals("v")){ kusKompImp.setTypPol((short) 0); } else { kusKompImp.setTypPol((short) 1); } } kusKompImp.setEdat(new Date()); kusKompImp.setEname(autor); lastKusKompImp=kusKompImp; lastLevel=level; } else { } } } // Uzavřete Excel soubor excelFile.close(); } catch (IOException e) { e.printStackTrace(); } // Výpis naimportovaných dat for (CKonstrKusHlavWsImp kusHlavImp : kusHlavImpList) { //System.out.println("CKonstrKusHlavWsImp: identPol=" + kusHlavImp.getIdentPol() + "level "+kusHlavImp.getIdCSyst()); for (CKonstrKusKompImp kusKompImp : kusHlavImp.getcKonstrKusKompImps()) { //System.out.println(" CKonstrKusKompImp: identPol=" + kusKompImp.getIdentPol() + ", mnozstvi=" + kusKompImp.getMnoz()); } //JOptionPane.showMessageDialog(null, "CKonstrKusHlavWsImp: identPol=" + kusHlavImp.getIdentPol() + "level "+kusHlavImp.getIdCSyst()); Session s = getSessionFactory().openSession();//udelam novou Transaction tx = s.getTransaction(); tx.begin(); s.save(kusHlavImp); s.update(axz); tx.commit(); KonstrKusImport i = new KonstrKusImport(o0Session); i.transformuj(kusHlavImp); } System.out.println(" Import proběhl v pořádku"); // Obnovte původní System.out System.setOut(systemOutBackup); System.setErr(systemErrBackup); // Zavřete souborový výstup printStream.close(); String obsahLogu = new String(Files.readAllBytes(Paths.get(axz.axzHlaseni))); String obsahErr = new String(Files.readAllBytes(Paths.get(souborErr))); O0logDaoImpl o0logDaoImpl; o0logDaoImpl = new O0logDaoImpl(); o0logDaoImpl.setOrsoftSession(o0Session); Character v='V'; Character g='G'; try { o0logDaoImpl.zapisLog("TOSCAD axz:"+axz.axzId, obsahLogu, null, null, null, null, null, null, null, v,g); } catch (Exception e){ //JOptionPane.showMessageDialog(null, e.getMessage()); System.out.println(" vyjimka " + e.getMessage()); } try { if (O0taskDemonUtil.getOrsoftSessionRun() != null) { OxSpustDavTaskRun.zapisVysledek(obsahLogu); } } catch (Exception e){ //JOptionPane.showMessageDialog(null, e.getMessage()); System.out.println(" vyjimka " + e.getMessage()); } } catch (JAXBException e) { e.printStackTrace(); } } static int countDots(String str) { int count = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == '.' && str.charAt(i + 1) != '0') { count++; } } return count; } public class Root { @JsonProperty("Pozice") public String pozice; @JsonProperty("Kusy") public String kusy; @JsonProperty("Nazev") public String nazev; @JsonProperty("Cislovykresu") public String cislovykresu; @JsonProperty("Hmotnost(kg)") public String hmotnostKg; @JsonProperty("Vyroba") public String vyroba; @JsonProperty("Polotovar") public String polotovar; @JsonProperty("Material") public String material; @JsonProperty("Delkapolotovaru(mm)") public String delkapolotovaruMm; @JsonProperty("Tloustkaplechu") public String tloustkaplechu; @JsonProperty("Vypal") public String vypal; @JsonProperty("Ch.k.") public String chK; @JsonProperty("MJ") public String mJ; @JsonProperty("Do zakázky") public String doZakazky; @JsonProperty("Kalkulace") public String kalkulace; // Chyběl název datového typu @JsonProperty("Propocetpotreby") public String propocetpotreby; @JsonProperty("Odpiszeskladu") public String odpiszeskladu; @JsonProperty("Sklad. Místo") public String sklad; @JsonProperty("Datumporizeni") public String datumporizeni; @JsonProperty("Autor") public String autor; @JsonProperty("Platnostod") public String platnostOd; // Konstruktor public Root(String pozice, String kusy, String nazev, String cislovykresu, String hmotnostKg, String vyroba, String polotovar, String material, String delkapolotovaruMm, String tloustkaplechu, String vypal, String chK, String mJ, String doZakazky, String kalkulace, String propocetpotreby, String odpiszeskladu, String sklad, String datumporizeni, String autor, String platnostOd) { this.pozice = pozice; this.kusy = kusy; this.nazev = nazev; this.cislovykresu = cislovykresu; this.hmotnostKg = hmotnostKg; this.vyroba = vyroba; this.polotovar = polotovar; this.material = material; this.delkapolotovaruMm = delkapolotovaruMm; this.tloustkaplechu = tloustkaplechu; this.vypal = vypal; this.chK = chK; this.mJ = mJ; this.doZakazky = doZakazky; this.kalkulace = kalkulace; this.propocetpotreby = propocetpotreby; this.odpiszeskladu = odpiszeskladu; this.sklad = sklad; this.datumporizeni = datumporizeni; this.autor = autor; this.platnostOd = platnostOd; } } ====== Doplnění nových polí ====== Pokud budou do Excelu doplněna nová pole, je potřeba provést příslušné úpravy v Groovy makru a konverzní tabulce.\\ Příklad nová políčko bude mít název **newfield**\\ - V Groovy doplnit do objektu Root a do konstruktoru. - V objektech kusHlavImp a kusKompImp existuje sada volně použitelných atribuů atrAn01 - atrAn20. (kromě atrAn08, který je použit pro předání pozice) - V makru všude kde se nachází **setIdentPol(data.cislovykresu)** doplníme nový řádek **setAtrAn01(data.newfield)**;\\ - V konverzní tabulce Wkh/Wkr doplnit nový řádek kde se atribut atrAnXX přesune do Tsr či Ts\\ - ====== Řešení prefixu ====== Prefix **E** u vyráběných dílů je řešen aktuálně v Groovy makru a neni tedy řešeno dotazem.\\ Je to řádek v části data =\\ "E"+row.getCell(3).toString(),\\