Obsah

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
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)
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
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

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
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 CKonstrKusHlav, tak řádků CKonstrKusKomp
Konverzní tabulku je možné založit ručně.
A to pro tyto entity:

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

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 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

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í.

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<CKonstrKusHlavWsImp> 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<Row> rowIterator = sheet.iterator();
      ObjectMapper objectMapper = new ObjectMapper();
      // Vytvoření seznamu CKonstrKusHlavWsImp objektů
 
 
      // Mapa pro uchování předchozích úrovní
      Map<Integer, CKonstrKusHlavWsImp> 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<CKonstrKusHlavWsImp> 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<Row> rowIterator = sheet.iterator();
      ObjectMapper objectMapper = new ObjectMapper();
      // Vytvoření seznamu CKonstrKusHlavWsImp objektů
 
 
      // Mapa pro uchování předchozích úrovní
      Map<Integer, CKonstrKusHlavWsImp> 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

  1. V Groovy doplnit do objektu Root a do konstruktoru.
  2. 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)
  3. V makru všude kde se nachází setIdentPol(data.cislovykresu) doplníme nový řádek setAtrAn01(data.newfield);
  4. 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(),\\