Files
CreoMigrate/lib/compare_lists.py
T

117 lines
4.6 KiB
Python

import argparse
import os
import pandas as pd
import json
"""
Dieses Programm :
- holt sich die CSV-Datei, in der alle exisitierenden RuleDesigner-Teilenummern enthalten sind
- holt sich die json-Datei, in der alle Teilenummern aufgelistet sind, die in Verbindung mit einer gewünschten Teilenummer migriert werden müssen
- exportiert alle Nummern aus der JSON-Datei in eine Excel Datei. Die Excel zeigt, welche Teilenummern bereits migriert wurden und welche noch migriert werden müssen.
"""
def create_sorter_string(sivasData, sivasId):
# Funktion setzt rekursiv einen String zusammen, der anzeigt, wo sich eine Teilenummer in der Hierarchie der obersten, zu migrierenden Baugruppe befindet.
# Beispiel:
# Die Teilenummer "123456" ist das Halbzeug der Teilenummer "234567". "234567" ist wiederum in der Baugruppe "345678" eingebaut.
# Die Funktion gibt dann folgenden Sortier-String zurück:
# 345678-234567-123456
parent = sivasData[sivasId]['Parent']
if parent not in sivasData:
return f"{parent}-{sivasId}"
recurval = create_sorter_string(sivasData, parent)
return f"{recurval}-{sivasId}"
def create_excel_export(existingIds, sivasData, sivasId, outPath):
# Spalten in Excel-Datei: Sortierung, Teilenummer, Bezeichnung, Bestandsabfrage, Teilebeurteilung, Zusatzbemerkung
# Sortierung: Minus-separierter "Pfad" dieser Teilenummer im Assembly / im Halbzeug
# Teilenummer: Sivas-Teilenummer
# Bezeichnung: SIVAS-Bezeichnung der Teilenummer
# Bestandsabfrage: IMPORTIEREN oder VERFÜGBAR -> "IMPORTIEREN" = Teilenummer muss noch migriert werden, "VERFÜGBAR" = Teilenummer wurde bereits migriert
# Restliche Spalten bleiben leer, da sie erst in Excel befüllt werden
sortierung = []
teilenummer = []
bezeichnung = []
migrationsstatus = []
teilebeurteilung = []
zusatzbemerkung = []
for item in sivasData:
sortierung.append(create_sorter_string(sivasData, item))
teilenummer.append(item)
bezeichnung.append(sivasData[item]['Bezeichnung'])
if existingIds[item] is True:
existing = "VERFÜGBAR"
else:
existing = "IMPORTIEREN"
migrationsstatus.append(existing)
teilebeurteilung.append('')
zusatzbemerkung.append('')
data = {
"Sortierung":sortierung,
"Teilenummer":teilenummer,
"Bezeichnung":bezeichnung,
"Migrationsstatus":migrationsstatus,
"Teile Beurteilung":teilebeurteilung,
"Zusatzbemerkung":zusatzbemerkung
}
excel_filename = os.path.join(outPath, sivasId + ".xlsx")
df = pd.DataFrame.from_dict(data)
df.to_excel(excel_filename, sheet_name="Ergebnis", index_label="Sortierung")
def compareFiles(rdDataBasePath, jsonPath, sivasId, outPath):
# Lies die CSV-Datei ein, in der alle RuleDesigner-Nummern aufgelistet sind ein
df = pd.read_csv(rdDataBasePath, sep=';', converters={"Teilenummer":str})
tn = tuple(df["Teilenummer"])
# Lies die JSON-Datei ein, in der alle Sivas-Teilenummern aufgelistet sind, die in Verbindung mit der Migration einer Teilenummer ebenfalls migriert werden müssen
with open(jsonPath, encoding='utf-8') as fp:
sivasData = json.load(fp)
# Prüfe, ob die Sivas-Nummern bereits migriert wurden
existingIds = {}
for item in sivasData:
if item in tn:
existingIds[item] = True
else:
existingIds[item] = False
# Schreibe eine Excel-Datei mit den korrekten Spalten raus
create_excel_export(existingIds, sivasData, sivasId, outPath)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='fetches data from sivas or ruledesigner fusion', prog='update_database')
parser.add_argument('-s', '--sivas', action='store', help='fetch data of this id from sivas fo local database folder')
parser.add_argument('-d', '--database', action='store', default="RD_Bestandspool.csv", help='local filename of the latest fetched RuleDesigner Database')
args = parser.parse_args()
if args.sivas:
# fetching the names of all existing cad files from the local file
dataDir = os.environ.get('CREMIG_DATA')
rdDataBasePath = os.path.join(dataDir, args.database)
# get the path to ask for further json files
exePath = os.environ.get('SIVAS_DATABASE_QUERY')
# in case the infos for this cad file are already there
sivasId = str(args.sivas)
jsonPath = os.path.join(dataDir, sivasId + ".json")
# there the results are written
outPath = os.environ.get('CREMIG_WORK')
compareFiles(rdDataBasePath, jsonPath, sivasId, outPath)