====== 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(),\\