In Treeview bzw. Excel-Export des Migrationsüberblicks werden Nummern nun blau markiert, wenn diese zwar in RuleDesigner migriert wurden, dort aber nocht keine Freigabe erfolgt ist. Hierfür wird der RuleDesigner-Status der Nummern live aus der RuleDesigner-Datenbank abgerufen. Dadurch ergibt sich ein detaillierterer Überblick über den aktuellen Migrationsstand, da der Großteil der Migrationsarbeit erst nach der Migration ins PDM erfolgt (Aufbereitung der Modelle, Zusammenbau der Baugruppe, etc.). Abgesehen davon wird die Bezeichnung der obersten Baugruppe jetzt ebenfalls im Migrationsüberblick angezeigt, was bisher nicht der Fall war. Hierfür wird eine CSV-Datei des SIVAS-Teilestamms zur Baugruppennummer abgeleitet daraus 'Bezeichnung 1' ausgelesen.
This commit is contained in:
+90
-18
@@ -1,5 +1,6 @@
|
||||
import os
|
||||
import json
|
||||
import pymssql
|
||||
from configparser import ConfigParser
|
||||
import pandas as pd
|
||||
import update_database
|
||||
@@ -18,9 +19,12 @@ class JsonBasedConfig:
|
||||
|
||||
def load_json_from_file(self):
|
||||
"""lade das json file vom gegeben Pfad in ein json Objekt"""
|
||||
with open(self._config_path, 'r', encoding='utf-8') as fh:
|
||||
content = fh.read()
|
||||
return json.loads(content)
|
||||
try:
|
||||
with open(self._config_path, 'r', encoding='utf-8') as fh:
|
||||
content = fh.read()
|
||||
return json.loads(content)
|
||||
except FileNotFoundError:
|
||||
raise ValueError("Bitte prüfen, ob korrekte Teilenummer, bzw. korrekter Dateiname angegeben wurde.")
|
||||
|
||||
def from_json(self, json_str):
|
||||
"""nimm den Json String zur Initialisierung des Objektes"""
|
||||
@@ -40,6 +44,61 @@ class CSVBasedConfig:
|
||||
return pd.read_csv(self._config_path, sep=";", dtype="object")
|
||||
|
||||
|
||||
class SQLBasedConfig:
|
||||
def __init__(self, server, user, pw, dbase):
|
||||
self._server = server
|
||||
self._user = user
|
||||
self._pw = pw
|
||||
self._dbase = dbase
|
||||
|
||||
def query_db(self, sql_statement) -> list:
|
||||
|
||||
"""Führt Datenbankabfrage aus und gibt Daten zurück"""
|
||||
with pymssql.connect(self._server, self._user, self._pw, self._dbase) as conn:
|
||||
with conn.cursor(as_dict=True) as cursor:
|
||||
try:
|
||||
cursor.execute(sql_statement)
|
||||
except pymssql.ProgrammingError:
|
||||
print("SQL-Statement konnte nicht verarbeitet werden!")
|
||||
raise
|
||||
ret = cursor.fetchall()
|
||||
return ret
|
||||
|
||||
class RuleDesignerSQLData(SQLBasedConfig):
|
||||
def __init__(self,
|
||||
server=os.environ.get("RD_SQL_DATABASE_SERVER"),
|
||||
user=os.environ.get("RD_SQL_DATABASE_USER"),
|
||||
pw=os.environ.get("RD_SQL_DATABASE_PW"),
|
||||
dbase=os.environ.get("RD_SQL_DATABASE_NAME")):
|
||||
super().__init__(server, user, pw, dbase)
|
||||
self._rd_statuses = None
|
||||
|
||||
@property
|
||||
def rd_statuses(self) -> dict:
|
||||
"""Gibt Teilenummer und zugehörigen Status zurück"""
|
||||
|
||||
if self._rd_statuses is None:
|
||||
|
||||
# Datenbankabfrage aller Teilenummern (codCodice) und der zugehörigen Status (codStatus)
|
||||
sql_statement = "SELECT [codCodice] AS ID, [codStatus] AS STATUS FROM [FUSION_PDM].[dbo].[CODICI]"
|
||||
sql_data = self.query_db(sql_statement)
|
||||
|
||||
# Jeder Teilenummer den sprechenden Stsatusnamen, statt der internen Statusnummer zuweisen
|
||||
# Dafür laden der Mapping-Datei für die Statusnummern (z.B. 3 = "FREIGEGEBEN")
|
||||
rd_status_cfg = IniBasedConfig(os.environ.get("CREMIG_CFG"), "RuleDesignerStatusnamen.cfg")
|
||||
rd_status_sections = rd_status_cfg.sections()
|
||||
rd_status_names = rd_status_cfg.get_dict(rd_status_sections[0])
|
||||
|
||||
|
||||
self._rd_statuses = {}
|
||||
for id_status_dict in sql_data:
|
||||
id = id_status_dict["ID"]
|
||||
status = id_status_dict["STATUS"]
|
||||
self._rd_statuses[id] = rd_status_names[str(status)]
|
||||
|
||||
return self._rd_statuses
|
||||
|
||||
|
||||
class SivasAssemblyData(JsonBasedConfig):
|
||||
"""Auslesen der Assembly-Informationen zu einer angegebenen Baugruppennummer"""
|
||||
|
||||
@@ -196,10 +255,12 @@ class MigrationStatus:
|
||||
def __init__(self, asm_child_ids: tuple, rd_ids: tuple):
|
||||
self.asm_child_ids = asm_child_ids
|
||||
self.rd_ids = rd_ids
|
||||
self._rd_statuses = None
|
||||
self._overview = None
|
||||
self._green_ids = None
|
||||
self._red_ids = None
|
||||
|
||||
self._ids_in_rd = None
|
||||
self._ids_in_progress = None
|
||||
self._ids_pending = None
|
||||
|
||||
@property
|
||||
def id_status(self) -> dict:
|
||||
"""Gibt zurück, ob die Stücklistenpositionen der Baugruppe migriert sind, oder nicht"""
|
||||
@@ -208,27 +269,38 @@ class MigrationStatus:
|
||||
for child_id in self.asm_child_ids:
|
||||
self._overview[child_id] = True if child_id in self.rd_ids else False
|
||||
return self._overview
|
||||
|
||||
|
||||
@property
|
||||
def green_ids(self) -> list:
|
||||
def ids_in_rd(self) -> list:
|
||||
"""Gibt alle Stücklistenpositionen zurück, die migriert sind"""
|
||||
|
||||
if self._green_ids is None:
|
||||
self._green_ids = [id for id, status in self.id_status.items() if status is True]
|
||||
return self._green_ids
|
||||
if self._ids_in_rd is None:
|
||||
self._ids_in_rd = [id for id, status in self.id_status.items() if status is True]
|
||||
return self._ids_in_rd
|
||||
|
||||
@property
|
||||
def yellow_ids(self) -> list:
|
||||
"""Gibt migrierte Stücklistenpositionen zurück, die aktuell eine Freigabe der Baugruppe verhindern, da sie sich derzeit in Arbeit befinden"""
|
||||
pass
|
||||
def ids_in_progress(self) -> list:
|
||||
"""Gibt migrierte Stücklistenpositionen zurück, die aktuell eine Freigabe der Baugruppe verhindern, da sie sich in Arbeit befinden"""
|
||||
|
||||
|
||||
if self._ids_in_progress is None:
|
||||
|
||||
rd_sql_data = RuleDesignerSQLData()
|
||||
rd_statuses = rd_sql_data.rd_statuses
|
||||
|
||||
self._ids_in_progress = []
|
||||
for id in self.ids_in_rd:
|
||||
if rd_statuses[id] != "FREIGEGEBEN":
|
||||
self._ids_in_progress.append(id)
|
||||
return self._ids_in_progress
|
||||
|
||||
@property
|
||||
def red_ids(self) -> list:
|
||||
def ids_pending(self) -> list:
|
||||
"""Gibt alle Stücklistenpositionen zurück, die noch nicht migriert sind"""
|
||||
|
||||
if self._red_ids is None:
|
||||
self._red_ids = [id for id, status in self.id_status.items() if status is False]
|
||||
return self._red_ids
|
||||
if self._ids_pending is None:
|
||||
self._ids_pending = [id for id, status in self.id_status.items() if status is False]
|
||||
return self._ids_pending
|
||||
|
||||
|
||||
class TeilestammMetadata(CSVBasedConfig):
|
||||
|
||||
Reference in New Issue
Block a user